@@ -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