Skip to content

Commit bb8ed8a

Browse files
dongjiang1989k8s-infra-cherrypick-robot
authored andcommitted
support nested pointer to type-aliased slices
Signed-off-by: dongjiang1989 <dongjiang1989@126.com>
1 parent 60c448e commit bb8ed8a

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

pkg/deepcopy/testdata/cronjob_types.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,23 @@ type SpecificCases struct {
159159

160160
// Case: kubernetes-sigs/controller-tools#1136
161161
StringAliasPtr *StringAlias `json:"stringAliasPtr,omitempty"`
162+
163+
// Case: kubernetes-sigs/controller-tools#586, kubernetes-sigs/controller-tools#1312
164+
NestedAliasSlices *Bars `json:"nestedAliasSlices,omitempty"`
162165
}
163166

164167
type StringAlias = string
165168

166169
// Test aliases to basic types
167170
type TotallyAString string
168171

172+
// Test nested pointer to type-aliased slices
173+
type Bars []*Bar
174+
175+
type Bar struct {
176+
Name string `json:"name,omitempty"`
177+
}
178+
169179
// Tests manual DeepCopy with a pointer receiver
170180
type DeepCopyPtr struct{}
171181

pkg/deepcopy/testdata/zz_generated.deepcopy.go

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

pkg/deepcopy/traverse.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -543,10 +543,13 @@ func (c *copyMethodMaker) genPointerDeepCopy(_ *namingInfo, pointerType *types.P
543543

544544
// pass-by-reference types get delegated to the main switch
545545
if passesByReference(underlyingElem) {
546-
c.Linef("*out = new(%s)", (&namingInfo{typeInfo: underlyingElem}).Syntax(c.pkg, c.importsList))
546+
// Use the declared element type (pointerType.Elem()) when allocating and
547+
// when generating the inner DeepCopyInto, so that type aliases are preserved
548+
// (e.g. `MapAlias`, `Bars`) instead of using their underlying types.
549+
c.Linef("*out = new(%s)", (&namingInfo{typeInfo: pointerType.Elem()}).Syntax(c.pkg, c.importsList))
547550
c.If("**in != nil", func() {
548551
c.Line("in, out := *in, *out")
549-
c.genDeepCopyIntoBlock(&namingInfo{typeInfo: underlyingElem}, eventualUnderlyingType(underlyingElem))
552+
c.genDeepCopyIntoBlock(&namingInfo{typeInfo: pointerType.Elem()}, pointerType.Elem())
550553
})
551554
return
552555
}
@@ -782,11 +785,7 @@ func fineToShallowCopy(typeInfo types.Type) bool {
782785
// (except for interfaces, which are handled separately).
783786
func passesByReference(typeInfo types.Type) bool {
784787
switch typeInfo.(type) {
785-
case *types.Slice:
786-
return true
787-
case *types.Map:
788-
return true
789-
case *types.Pointer:
788+
case *types.Slice, *types.Map, *types.Pointer:
790789
return true
791790
default:
792791
return false

0 commit comments

Comments
 (0)