Skip to content

Commit 66f7e30

Browse files
committed
conversion-gen: use custom conversions for slices and maps of pointers
1 parent a4763ee commit 66f7e30

File tree

2 files changed

+57
-8
lines changed

2 files changed

+57
-8
lines changed

staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,16 @@ func (g *genConversion) preexists(inType, outType *types.Type) (*types.Type, boo
685685
return function, ok
686686
}
687687

688+
func (g *genConversion) preexistsPointers(inType, outType *types.Type) (*types.Type, bool) {
689+
if inType.Kind != types.Pointer {
690+
return nil, false
691+
}
692+
if outType.Kind != types.Pointer {
693+
return nil, false
694+
}
695+
return g.preexists(inType.Elem, outType.Elem)
696+
}
697+
688698
func (g *genConversion) Init(c *generator.Context, w io.Writer) error {
689699
klogV := klog.V(6)
690700
if klogV.Enabled() {
@@ -864,9 +874,16 @@ func (g *genConversion) doMap(inType, outType *types.Type, sw *generator.Snippet
864874
}
865875
} else {
866876
conversionExists := true
877+
conditionalConversionExists := false
867878
if function, ok := g.preexists(inType.Elem, outType.Elem); ok {
868879
sw.Do("newVal := new($.|raw$)\n", outType.Elem)
869880
sw.Do("if err := $.|raw$(&val, newVal, s); err != nil {\n", function)
881+
} else if function, ok := g.preexistsPointers(inType.Elem, outType.Elem); ok {
882+
sw.Do("newVal := new($.|raw$)\n", outType.Elem)
883+
sw.Do("if val != nil {\n", nil)
884+
sw.Do("*newVal = new($.|raw$)\n", outType.Elem.Elem)
885+
sw.Do("if err := $.|raw$(val, *newVal, s); err != nil {\n", function)
886+
conditionalConversionExists = true
870887
} else if g.convertibleOnlyWithinPackage(inType.Elem, outType.Elem) {
871888
sw.Do("newVal := new($.|raw$)\n", outType.Elem)
872889
sw.Do("if err := "+nameTmpl+"(&val, newVal, s); err != nil {\n", argsFromType(inType.Elem, outType.Elem))
@@ -879,6 +896,9 @@ func (g *genConversion) doMap(inType, outType *types.Type, sw *generator.Snippet
879896
if conversionExists {
880897
sw.Do("return err\n", nil)
881898
sw.Do("}\n", nil)
899+
if conditionalConversionExists {
900+
sw.Do("}\n", nil)
901+
}
882902
if inType.Key == outType.Key {
883903
sw.Do("(*out)[key] = *newVal\n", nil)
884904
} else {
@@ -908,8 +928,14 @@ func (g *genConversion) doSlice(inType, outType *types.Type, sw *generator.Snipp
908928
}
909929
} else {
910930
conversionExists := true
931+
conditionalConversionExists := false
911932
if function, ok := g.preexists(inType.Elem, outType.Elem); ok {
912933
sw.Do("if err := $.|raw$(&(*in)[i], &(*out)[i], s); err != nil {\n", function)
934+
} else if function, ok := g.preexistsPointers(inType.Elem, outType.Elem); ok {
935+
sw.Do("if (*in)[i] != nil {\n", nil)
936+
sw.Do("(*out)[i] = new($.|raw$)\n", outType.Elem.Elem)
937+
sw.Do("if err := $.|raw$((*in)[i], (*out)[i], s); err != nil {\n", function)
938+
conditionalConversionExists = true
913939
} else if g.convertibleOnlyWithinPackage(inType.Elem, outType.Elem) {
914940
sw.Do("if err := "+nameTmpl+"(&(*in)[i], &(*out)[i], s); err != nil {\n", argsFromType(inType.Elem, outType.Elem))
915941
} else {
@@ -921,6 +947,9 @@ func (g *genConversion) doSlice(inType, outType *types.Type, sw *generator.Snipp
921947
if conversionExists {
922948
sw.Do("return err\n", nil)
923949
sw.Do("}\n", nil)
950+
if conditionalConversionExists {
951+
sw.Do("}\n", nil)
952+
}
924953
}
925954
}
926955
sw.Do("}\n", nil)

staging/src/k8s.io/code-generator/examples/apiserver/apis/example/v1/zz_generated.conversion.go

Lines changed: 28 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)