@@ -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}
@@ -553,19 +554,26 @@ func (g openAPITypeWriter) validatePatchTags(m *types.Member, parent *types.Type
553554	return  nil 
554555}
555556
556- func  defaultFromComments (comments  []string ) (interface {}, error ) {
557+ func  defaultFromComments (comments  []string ,  commentPath   string ) (interface {},  * types. Name , error ) {
557558	tag , err  :=  getSingleTagsValue (comments , tagDefault )
558559	if  tag  ==  ""  {
559- 		return  nil , err 
560+ 		return  nil , nil ,  err 
560561	}
561562	var  i  interface {}
562- 	if  err  :=  json .Unmarshal ([]byte (tag ), & i ); err  !=  nil  {
563- 		return  nil , fmt .Errorf ("failed to unmarshal default: %v" , err )
563+ 	if  id , ok  :=  defaultergen .ParseSymbolReference (tag , commentPath ); ok  {
564+ 		return  nil , & id , nil 
565+ 	} else  if  err  :=  json .Unmarshal ([]byte (tag ), & i ); err  !=  nil  {
566+ 		return  nil , nil , fmt .Errorf ("failed to unmarshal default: %v" , err )
564567	}
565- 	return  i , nil 
568+ 	return  i , nil ,  nil 
566569}
567570
568571func  mustEnforceDefault (t  * types.Type , omitEmpty  bool ) (interface {}, error ) {
572+ 	// If t implements custom JSON marshalling, all of this logic is likely wrong 
573+ 	if  _ , isUnmarshaller  :=  t .Methods ["UnmarshalJSON" ]; isUnmarshaller  {
574+ 		return  nil , nil 
575+ 	}
576+ 
569577	switch  t .Kind  {
570578	case  types .Pointer , types .Map , types .Slice , types .Array , types .Interface :
571579		return  nil , nil 
@@ -585,9 +593,10 @@ func mustEnforceDefault(t *types.Type, omitEmpty bool) (interface{}, error) {
585593	}
586594}
587595
588- func  (g  openAPITypeWriter ) generateDefault (comments  []string , t  * types.Type , omitEmpty  bool ) error  {
596+ func  (g  openAPITypeWriter ) generateDefault (comments  []string , t  * types.Type , omitEmpty  bool ,  commentOwningType   * types. Type ) error  {
589597	t  =  resolveAliasAndEmbeddedType (t )
590- 	def , err  :=  defaultFromComments (comments )
598+ 
599+ 	def , ref , err  :=  defaultFromComments (comments , commentOwningType .Name .Package )
591600	if  err  !=  nil  {
592601		return  err 
593602	}
@@ -603,6 +612,8 @@ func (g openAPITypeWriter) generateDefault(comments []string, t *types.Type, omi
603612	}
604613	if  def  !=  nil  {
605614		g .Do ("Default: $.$,\n " , fmt .Sprintf ("%#v" , def ))
615+ 	} else  if  ref  !=  nil  {
616+ 		g .Do ("Default: $.|raw$,\n " , & types.Type {Name : * ref })
606617	}
607618	return  nil 
608619}
@@ -676,7 +687,7 @@ func (g openAPITypeWriter) generateProperty(m *types.Member, parent *types.Type)
676687		return  nil 
677688	}
678689	omitEmpty  :=  strings .Contains (reflect .StructTag (m .Tags ).Get ("json" ), "omitempty" )
679- 	if  err  :=  g .generateDefault (m .CommentLines , m .Type , omitEmpty ); err  !=  nil  {
690+ 	if  err  :=  g .generateDefault (m .CommentLines , m .Type , omitEmpty ,  parent ); err  !=  nil  {
680691		return  fmt .Errorf ("failed to generate default in %v: %v: %v" , parent , m .Name , err )
681692	}
682693	t  :=  resolveAliasAndPtrType (m .Type )
@@ -762,7 +773,7 @@ func (g openAPITypeWriter) generateMapProperty(t *types.Type) error {
762773
763774	g .Do ("Type: []string{\" object\" },\n " , nil )
764775	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  {
776+ 	if  err  :=  g .generateDefault (t .Elem .CommentLines , t .Elem , false ,  t . Elem ); err  !=  nil  {
766777		return  err 
767778	}
768779	typeString , format  :=  openapi .OpenAPITypeFormat (elemType .String ())
@@ -795,7 +806,7 @@ func (g openAPITypeWriter) generateSliceProperty(t *types.Type) error {
795806	elemType  :=  resolveAliasAndPtrType (t .Elem )
796807	g .Do ("Type: []string{\" array\" },\n " , nil )
797808	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  {
809+ 	if  err  :=  g .generateDefault (t .Elem .CommentLines , t .Elem , false ,  t . Elem ); err  !=  nil  {
799810		return  err 
800811	}
801812	typeString , format  :=  openapi .OpenAPITypeFormat (elemType .String ())
0 commit comments