Skip to content

Commit 5d9089d

Browse files
authored
Merge pull request #1336 from k8s-infra-cherrypick-robot/cherry-pick-1331-to-release-0.20
[release-0.20] ✨feat: Support nested pointer to type-aliased slices
2 parents 60c448e + 852a7e7 commit 5d9089d

File tree

3 files changed

+109
-7
lines changed

3 files changed

+109
-7
lines changed

pkg/deepcopy/testdata/cronjob_types.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,29 @@ 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"`
165+
166+
// Case: kubernetes-sigs/controller-tools#1312
167+
NestedAliasMaps *MapAlias `json:"nestedAliasMaps,omitempty"`
162168
}
163169

164170
type StringAlias = string
165171

166172
// Test aliases to basic types
167173
type TotallyAString string
168174

175+
// Test nested pointer to type-aliased map
176+
type MapAlias map[string]string
177+
178+
// Test nested pointer to type-aliased slices
179+
type Bars []*Bar
180+
181+
type Bar struct {
182+
Name string `json:"name,omitempty"`
183+
}
184+
169185
// Tests manual DeepCopy with a pointer receiver
170186
type DeepCopyPtr struct{}
171187

pkg/deepcopy/testdata/zz_generated.deepcopy.go

Lines changed: 87 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)