Skip to content

Commit 9d24c3a

Browse files
committed
add support for symbol references in defaults
refactor openapi test to return import lines add symbol reference test
1 parent af7bbb4 commit 9d24c3a

File tree

2 files changed

+140
-45
lines changed

2 files changed

+140
-45
lines changed

pkg/generators/openapi.go

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
188189
func (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

568574
func 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{\nAllows: true,\nSchema: &spec.Schema{\nSchemaProps: 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{\nSchema: &spec.Schema{\nSchemaProps: 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

Comments
 (0)