@@ -26,6 +26,7 @@ import (
2626	"sort" 
2727	"strings" 
2828
29+ 	defaultergen "k8s.io/gengo/examples/defaulter-gen/generators" 
2930	"k8s.io/gengo/generator" 
3031	"k8s.io/gengo/namer" 
3132	"k8s.io/gengo/types" 
@@ -120,7 +121,7 @@ func newOpenAPIGen(sanitizedName string, targetPackage string) generator.Generat
120121		DefaultGen : generator.DefaultGen {
121122			OptionalName : sanitizedName ,
122123		},
123- 		imports :       generator .NewImportTracker ( ),
124+ 		imports :       generator .NewImportTrackerForPackage ( targetPackage ),
124125		targetPackage : targetPackage ,
125126	}
126127}
@@ -173,7 +174,7 @@ func (g *openAPIGen) Init(c *generator.Context, w io.Writer) error {
173174	sw .Do ("return map[string]$.OpenAPIDefinition|raw${\n " , argsFromType (nil ))
174175
175176	for  _ , t  :=  range  c .Order  {
176- 		err  :=  newOpenAPITypeWriter (sw , c ).generateCall (t )
177+ 		err  :=  newOpenAPITypeWriter (sw , c ,  g . imports ).generateCall (t )
177178		if  err  !=  nil  {
178179			return  err 
179180		}
@@ -188,7 +189,8 @@ func (g *openAPIGen) Init(c *generator.Context, w io.Writer) error {
188189func  (g  * openAPIGen ) GenerateType (c  * generator.Context , t  * types.Type , w  io.Writer ) error  {
189190	klog .V (5 ).Infof ("generating for type %v" , t )
190191	sw  :=  generator .NewSnippetWriter (w , c , "$" , "$" )
191- 	err  :=  newOpenAPITypeWriter (sw , c ).generate (t )
192+ 
193+ 	err  :=  newOpenAPITypeWriter (sw , c , g .imports ).generate (t )
192194	if  err  !=  nil  {
193195		return  err 
194196	}
@@ -226,11 +228,13 @@ type openAPITypeWriter struct {
226228	context                 * generator.Context 
227229	refTypes                map [string ]* types.Type 
228230	enumContext             * enumContext 
231+ 	imports                 namer.ImportTracker 
229232	GetDefinitionInterface  * types.Type 
230233}
231234
232- func  newOpenAPITypeWriter (sw  * generator.SnippetWriter , c  * generator.Context ) openAPITypeWriter  {
235+ func  newOpenAPITypeWriter (sw  * generator.SnippetWriter , c  * generator.Context ,  imports  namer. ImportTracker ) openAPITypeWriter  {
233236	return  openAPITypeWriter {
237+ 		imports :       imports ,
234238		SnippetWriter : sw ,
235239		context :       c ,
236240		refTypes :      map [string ]* types.Type {},
@@ -553,19 +557,26 @@ func (g openAPITypeWriter) validatePatchTags(m *types.Member, parent *types.Type
553557	return  nil 
554558}
555559
556- func  defaultFromComments (comments  []string ) (interface {}, error ) {
560+ func  defaultFromComments (comments  []string ,  commentPath   string ) (interface {},  * types. Name , error ) {
557561	tag , err  :=  getSingleTagsValue (comments , tagDefault )
558562	if  tag  ==  ""  {
559- 		return  nil , err 
563+ 		return  nil , nil ,  err 
560564	}
561565	var  i  interface {}
562- 	if  err  :=  json .Unmarshal ([]byte (tag ), & i ); err  !=  nil  {
563- 		return  nil , fmt .Errorf ("failed to unmarshal default: %v" , err )
566+ 	if  id , ok  :=  defaultergen .ParseSymbolReference (tag , commentPath ); ok  {
567+ 		return  nil , & id , nil 
568+ 	} else  if  err  :=  json .Unmarshal ([]byte (tag ), & i ); err  !=  nil  {
569+ 		return  nil , nil , fmt .Errorf ("failed to unmarshal default: %v" , err )
564570	}
565- 	return  i , nil 
571+ 	return  i , nil ,  nil 
566572}
567573
568574func  mustEnforceDefault (t  * types.Type , omitEmpty  bool ) (interface {}, error ) {
575+ 	// If t implements custom JSON marshalling, all of this logic is likely wrong 
576+ 	if  _ , isUnmarshaller  :=  t .Methods ["UnmarshalJSON" ]; isUnmarshaller  {
577+ 		return  nil , nil 
578+ 	}
579+ 
569580	switch  t .Kind  {
570581	case  types .Pointer , types .Map , types .Slice , types .Array , types .Interface :
571582		return  nil , nil 
@@ -585,9 +596,10 @@ func mustEnforceDefault(t *types.Type, omitEmpty bool) (interface{}, error) {
585596	}
586597}
587598
588- func  (g  openAPITypeWriter ) generateDefault (comments  []string , t  * types.Type , omitEmpty  bool ) error  {
599+ func  (g  openAPITypeWriter ) generateDefault (comments  []string , t  * types.Type , omitEmpty  bool ,  commentOwningType   * types. Type ) error  {
589600	t  =  resolveAliasAndEmbeddedType (t )
590- 	def , err  :=  defaultFromComments (comments )
601+ 
602+ 	def , ref , err  :=  defaultFromComments (comments , commentOwningType .Name .Package )
591603	if  err  !=  nil  {
592604		return  err 
593605	}
@@ -603,6 +615,10 @@ func (g openAPITypeWriter) generateDefault(comments []string, t *types.Type, omi
603615	}
604616	if  def  !=  nil  {
605617		g .Do ("Default: $.$,\n " , fmt .Sprintf ("%#v" , def ))
618+ 	} else  if  ref  !=  nil  {
619+ 		g .imports .AddSymbol (* ref )
620+ 		ref .Package  =  g .imports .LocalNameOf (ref .Package )
621+ 		g .Do ("Default: $.$,\n " , ref .String ())
606622	}
607623	return  nil 
608624}
@@ -676,7 +692,7 @@ func (g openAPITypeWriter) generateProperty(m *types.Member, parent *types.Type)
676692		return  nil 
677693	}
678694	omitEmpty  :=  strings .Contains (reflect .StructTag (m .Tags ).Get ("json" ), "omitempty" )
679- 	if  err  :=  g .generateDefault (m .CommentLines , m .Type , omitEmpty ); err  !=  nil  {
695+ 	if  err  :=  g .generateDefault (m .CommentLines , m .Type , omitEmpty ,  parent ); err  !=  nil  {
680696		return  fmt .Errorf ("failed to generate default in %v: %v: %v" , parent , m .Name , err )
681697	}
682698	t  :=  resolveAliasAndPtrType (m .Type )
@@ -762,7 +778,7 @@ func (g openAPITypeWriter) generateMapProperty(t *types.Type) error {
762778
763779	g .Do ("Type: []string{\" object\" },\n " , nil )
764780	g .Do ("AdditionalProperties: &spec.SchemaOrBool{\n Allows: true,\n Schema: &spec.Schema{\n SchemaProps: spec.SchemaProps{\n " , nil )
765- 	if  err  :=  g .generateDefault (t .Elem .CommentLines , t .Elem , false ); err  !=  nil  {
781+ 	if  err  :=  g .generateDefault (t .Elem .CommentLines , t .Elem , false ,  t . Elem ); err  !=  nil  {
766782		return  err 
767783	}
768784	typeString , format  :=  openapi .OpenAPITypeFormat (elemType .String ())
@@ -795,7 +811,7 @@ func (g openAPITypeWriter) generateSliceProperty(t *types.Type) error {
795811	elemType  :=  resolveAliasAndPtrType (t .Elem )
796812	g .Do ("Type: []string{\" array\" },\n " , nil )
797813	g .Do ("Items: &spec.SchemaOrArray{\n Schema: &spec.Schema{\n SchemaProps: spec.SchemaProps{\n " , nil )
798- 	if  err  :=  g .generateDefault (t .Elem .CommentLines , t .Elem , false ); err  !=  nil  {
814+ 	if  err  :=  g .generateDefault (t .Elem .CommentLines , t .Elem , false ,  t . Elem ); err  !=  nil  {
799815		return  err 
800816	}
801817	typeString , format  :=  openapi .OpenAPITypeFormat (elemType .String ())
0 commit comments