@@ -685,6 +685,16 @@ func (g *genConversion) preexists(inType, outType *types.Type) (*types.Type, boo
685
685
return function , ok
686
686
}
687
687
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
+
688
698
func (g * genConversion ) Init (c * generator.Context , w io.Writer ) error {
689
699
klogV := klog .V (6 )
690
700
if klogV .Enabled () {
@@ -864,9 +874,16 @@ func (g *genConversion) doMap(inType, outType *types.Type, sw *generator.Snippet
864
874
}
865
875
} else {
866
876
conversionExists := true
877
+ conditionalConversionExists := false
867
878
if function , ok := g .preexists (inType .Elem , outType .Elem ); ok {
868
879
sw .Do ("newVal := new($.|raw$)\n " , outType .Elem )
869
880
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
870
887
} else if g .convertibleOnlyWithinPackage (inType .Elem , outType .Elem ) {
871
888
sw .Do ("newVal := new($.|raw$)\n " , outType .Elem )
872
889
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
879
896
if conversionExists {
880
897
sw .Do ("return err\n " , nil )
881
898
sw .Do ("}\n " , nil )
899
+ if conditionalConversionExists {
900
+ sw .Do ("}\n " , nil )
901
+ }
882
902
if inType .Key == outType .Key {
883
903
sw .Do ("(*out)[key] = *newVal\n " , nil )
884
904
} else {
@@ -908,8 +928,14 @@ func (g *genConversion) doSlice(inType, outType *types.Type, sw *generator.Snipp
908
928
}
909
929
} else {
910
930
conversionExists := true
931
+ conditionalConversionExists := false
911
932
if function , ok := g .preexists (inType .Elem , outType .Elem ); ok {
912
933
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
913
939
} else if g .convertibleOnlyWithinPackage (inType .Elem , outType .Elem ) {
914
940
sw .Do ("if err := " + nameTmpl + "(&(*in)[i], &(*out)[i], s); err != nil {\n " , argsFromType (inType .Elem , outType .Elem ))
915
941
} else {
@@ -921,6 +947,9 @@ func (g *genConversion) doSlice(inType, outType *types.Type, sw *generator.Snipp
921
947
if conversionExists {
922
948
sw .Do ("return err\n " , nil )
923
949
sw .Do ("}\n " , nil )
950
+ if conditionalConversionExists {
951
+ sw .Do ("}\n " , nil )
952
+ }
924
953
}
925
954
}
926
955
sw .Do ("}\n " , nil )
0 commit comments