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