Add generated file
This PR adds generated files under pkg/client and vendor folder.
This commit is contained in:
1
vendor/k8s.io/gengo/examples/deepcopy-gen/.gitignore
generated
vendored
Normal file
1
vendor/k8s.io/gengo/examples/deepcopy-gen/.gitignore
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
deepcopy-gen
|
16
vendor/k8s.io/gengo/examples/deepcopy-gen/Makefile
generated
vendored
Normal file
16
vendor/k8s.io/gengo/examples/deepcopy-gen/Makefile
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
TOOL=deepcopy-gen
|
||||
|
||||
test:
|
||||
@if ! git diff --quiet HEAD; then \
|
||||
echo "FAIL: git client is not clean"; \
|
||||
false; \
|
||||
fi
|
||||
@go build -o /tmp/$(TOOL)
|
||||
@PKGS=$$(go list ./output_tests/... | paste -sd' ' -); \
|
||||
/tmp/$(TOOL) --logtostderr --v=4 -i $$(echo $$PKGS | sed 's/ /,/g') -O zz_generated
|
||||
@if ! git diff --quiet HEAD; then \
|
||||
echo "FAIL: output files changed"; \
|
||||
git diff; \
|
||||
false; \
|
||||
fi
|
||||
|
905
vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
generated
vendored
Normal file
905
vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
generated
vendored
Normal file
@@ -0,0 +1,905 @@
|
||||
/*
|
||||
Copyright 2015 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package generators
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"k8s.io/gengo/args"
|
||||
"k8s.io/gengo/examples/set-gen/sets"
|
||||
"k8s.io/gengo/generator"
|
||||
"k8s.io/gengo/namer"
|
||||
"k8s.io/gengo/types"
|
||||
|
||||
"github.com/golang/glog"
|
||||
)
|
||||
|
||||
// CustomArgs is used tby the go2idl framework to pass args specific to this
|
||||
// generator.
|
||||
type CustomArgs struct {
|
||||
BoundingDirs []string // Only deal with types rooted under these dirs.
|
||||
}
|
||||
|
||||
// This is the comment tag that carries parameters for deep-copy generation.
|
||||
const (
|
||||
tagName = "k8s:deepcopy-gen"
|
||||
interfacesTagName = tagName + ":interfaces"
|
||||
interfacesNonPointerTagName = tagName + ":nonpointer-interfaces" // attach the DeepCopy<Interface> methods to the
|
||||
)
|
||||
|
||||
// Known values for the comment tag.
|
||||
const tagValuePackage = "package"
|
||||
|
||||
// tagValue holds parameters from a tagName tag.
|
||||
type tagValue struct {
|
||||
value string
|
||||
register bool
|
||||
}
|
||||
|
||||
func extractTag(comments []string) *tagValue {
|
||||
tagVals := types.ExtractCommentTags("+", comments)[tagName]
|
||||
if tagVals == nil {
|
||||
// No match for the tag.
|
||||
return nil
|
||||
}
|
||||
// If there are multiple values, abort.
|
||||
if len(tagVals) > 1 {
|
||||
glog.Fatalf("Found %d %s tags: %q", len(tagVals), tagName, tagVals)
|
||||
}
|
||||
|
||||
// If we got here we are returning something.
|
||||
tag := &tagValue{}
|
||||
|
||||
// Get the primary value.
|
||||
parts := strings.Split(tagVals[0], ",")
|
||||
if len(parts) >= 1 {
|
||||
tag.value = parts[0]
|
||||
}
|
||||
|
||||
// Parse extra arguments.
|
||||
parts = parts[1:]
|
||||
for i := range parts {
|
||||
kv := strings.SplitN(parts[i], "=", 2)
|
||||
k := kv[0]
|
||||
v := ""
|
||||
if len(kv) == 2 {
|
||||
v = kv[1]
|
||||
}
|
||||
switch k {
|
||||
case "register":
|
||||
if v != "false" {
|
||||
tag.register = true
|
||||
}
|
||||
default:
|
||||
glog.Fatalf("Unsupported %s param: %q", tagName, parts[i])
|
||||
}
|
||||
}
|
||||
return tag
|
||||
}
|
||||
|
||||
// TODO: This is created only to reduce number of changes in a single PR.
|
||||
// Remove it and use PublicNamer instead.
|
||||
func deepCopyNamer() *namer.NameStrategy {
|
||||
return &namer.NameStrategy{
|
||||
Join: func(pre string, in []string, post string) string {
|
||||
return strings.Join(in, "_")
|
||||
},
|
||||
PrependPackageNames: 1,
|
||||
}
|
||||
}
|
||||
|
||||
// NameSystems returns the name system used by the generators in this package.
|
||||
func NameSystems() namer.NameSystems {
|
||||
return namer.NameSystems{
|
||||
"public": deepCopyNamer(),
|
||||
"raw": namer.NewRawNamer("", nil),
|
||||
}
|
||||
}
|
||||
|
||||
// DefaultNameSystem returns the default name system for ordering the types to be
|
||||
// processed by the generators in this package.
|
||||
func DefaultNameSystem() string {
|
||||
return "public"
|
||||
}
|
||||
|
||||
func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
|
||||
boilerplate, err := arguments.LoadGoBoilerplate()
|
||||
if err != nil {
|
||||
glog.Fatalf("Failed loading boilerplate: %v", err)
|
||||
}
|
||||
|
||||
inputs := sets.NewString(context.Inputs...)
|
||||
packages := generator.Packages{}
|
||||
header := append([]byte(fmt.Sprintf("// +build !%s\n\n", arguments.GeneratedBuildTag)), boilerplate...)
|
||||
|
||||
boundingDirs := []string{}
|
||||
if customArgs, ok := arguments.CustomArgs.(*CustomArgs); ok {
|
||||
if customArgs.BoundingDirs == nil {
|
||||
customArgs.BoundingDirs = context.Inputs
|
||||
}
|
||||
for i := range customArgs.BoundingDirs {
|
||||
// Strip any trailing slashes - they are not exactly "correct" but
|
||||
// this is friendlier.
|
||||
boundingDirs = append(boundingDirs, strings.TrimRight(customArgs.BoundingDirs[i], "/"))
|
||||
}
|
||||
}
|
||||
|
||||
for i := range inputs {
|
||||
glog.V(5).Infof("Considering pkg %q", i)
|
||||
pkg := context.Universe[i]
|
||||
if pkg == nil {
|
||||
// If the input had no Go files, for example.
|
||||
continue
|
||||
}
|
||||
|
||||
ptag := extractTag(pkg.Comments)
|
||||
ptagValue := ""
|
||||
ptagRegister := false
|
||||
if ptag != nil {
|
||||
ptagValue = ptag.value
|
||||
if ptagValue != tagValuePackage {
|
||||
glog.Fatalf("Package %v: unsupported %s value: %q", i, tagName, ptagValue)
|
||||
}
|
||||
ptagRegister = ptag.register
|
||||
glog.V(5).Infof(" tag.value: %q, tag.register: %t", ptagValue, ptagRegister)
|
||||
} else {
|
||||
glog.V(5).Infof(" no tag")
|
||||
}
|
||||
|
||||
// If the pkg-scoped tag says to generate, we can skip scanning types.
|
||||
pkgNeedsGeneration := (ptagValue == tagValuePackage)
|
||||
if !pkgNeedsGeneration {
|
||||
// If the pkg-scoped tag did not exist, scan all types for one that
|
||||
// explicitly wants generation.
|
||||
for _, t := range pkg.Types {
|
||||
glog.V(5).Infof(" considering type %q", t.Name.String())
|
||||
ttag := extractTag(t.CommentLines)
|
||||
if ttag != nil && ttag.value == "true" {
|
||||
glog.V(5).Infof(" tag=true")
|
||||
if !copyableType(t) {
|
||||
glog.Fatalf("Type %v requests deepcopy generation but is not copyable", t)
|
||||
}
|
||||
pkgNeedsGeneration = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if pkgNeedsGeneration {
|
||||
glog.V(3).Infof("Package %q needs generation", i)
|
||||
path := pkg.Path
|
||||
// if the source path is within a /vendor/ directory (for example,
|
||||
// k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1), allow
|
||||
// generation to output to the proper relative path (under vendor).
|
||||
// Otherwise, the generator will create the file in the wrong location
|
||||
// in the output directory.
|
||||
// TODO: build a more fundamental concept in gengo for dealing with modifications
|
||||
// to vendored packages.
|
||||
if strings.HasPrefix(pkg.SourcePath, arguments.OutputBase) {
|
||||
expandedPath := strings.TrimPrefix(pkg.SourcePath, arguments.OutputBase)
|
||||
if strings.Contains(expandedPath, "/vendor/") {
|
||||
path = expandedPath
|
||||
}
|
||||
}
|
||||
packages = append(packages,
|
||||
&generator.DefaultPackage{
|
||||
PackageName: strings.Split(filepath.Base(pkg.Path), ".")[0],
|
||||
PackagePath: path,
|
||||
HeaderText: header,
|
||||
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||
return []generator.Generator{
|
||||
NewGenDeepCopy(arguments.OutputFileBaseName, pkg.Path, boundingDirs, (ptagValue == tagValuePackage), ptagRegister),
|
||||
}
|
||||
},
|
||||
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||
return t.Name.Package == pkg.Path
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
return packages
|
||||
}
|
||||
|
||||
// genDeepCopy produces a file with autogenerated deep-copy functions.
|
||||
type genDeepCopy struct {
|
||||
generator.DefaultGen
|
||||
targetPackage string
|
||||
boundingDirs []string
|
||||
allTypes bool
|
||||
registerTypes bool
|
||||
imports namer.ImportTracker
|
||||
typesForInit []*types.Type
|
||||
}
|
||||
|
||||
func NewGenDeepCopy(sanitizedName, targetPackage string, boundingDirs []string, allTypes, registerTypes bool) generator.Generator {
|
||||
return &genDeepCopy{
|
||||
DefaultGen: generator.DefaultGen{
|
||||
OptionalName: sanitizedName,
|
||||
},
|
||||
targetPackage: targetPackage,
|
||||
boundingDirs: boundingDirs,
|
||||
allTypes: allTypes,
|
||||
registerTypes: registerTypes,
|
||||
imports: generator.NewImportTracker(),
|
||||
typesForInit: make([]*types.Type, 0),
|
||||
}
|
||||
}
|
||||
|
||||
func (g *genDeepCopy) Namers(c *generator.Context) namer.NameSystems {
|
||||
// Have the raw namer for this file track what it imports.
|
||||
return namer.NameSystems{
|
||||
"raw": namer.NewRawNamer(g.targetPackage, g.imports),
|
||||
}
|
||||
}
|
||||
|
||||
func (g *genDeepCopy) Filter(c *generator.Context, t *types.Type) bool {
|
||||
// Filter out types not being processed or not copyable within the package.
|
||||
enabled := g.allTypes
|
||||
if !enabled {
|
||||
ttag := extractTag(t.CommentLines)
|
||||
if ttag != nil && ttag.value == "true" {
|
||||
enabled = true
|
||||
}
|
||||
}
|
||||
if !enabled {
|
||||
return false
|
||||
}
|
||||
if !copyableType(t) {
|
||||
glog.V(2).Infof("Type %v is not copyable", t)
|
||||
return false
|
||||
}
|
||||
glog.V(4).Infof("Type %v is copyable", t)
|
||||
g.typesForInit = append(g.typesForInit, t)
|
||||
return true
|
||||
}
|
||||
|
||||
func (g *genDeepCopy) copyableAndInBounds(t *types.Type) bool {
|
||||
if !copyableType(t) {
|
||||
return false
|
||||
}
|
||||
// Only packages within the restricted range can be processed.
|
||||
if !isRootedUnder(t.Name.Package, g.boundingDirs) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// deepCopyMethod returns the signature of a DeepCopy() method, nil or an error
|
||||
// if the type does not match. This allows more efficient deep copy
|
||||
// implementations to be defined by the type's author. The correct signature
|
||||
// for a type T is:
|
||||
// func (t T) DeepCopy() T
|
||||
// or:
|
||||
// func (t *T) DeepCopy() *T
|
||||
func deepCopyMethod(t *types.Type) (*types.Signature, error) {
|
||||
f, found := t.Methods["DeepCopy"]
|
||||
if !found {
|
||||
return nil, nil
|
||||
}
|
||||
if len(f.Signature.Parameters) != 0 {
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected no parameters", t)
|
||||
}
|
||||
if len(f.Signature.Results) != 1 {
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected exactly one result", t)
|
||||
}
|
||||
|
||||
ptrResult := f.Signature.Results[0].Kind == types.Pointer && f.Signature.Results[0].Elem.Name == t.Name
|
||||
nonPtrResult := f.Signature.Results[0].Name == t.Name
|
||||
|
||||
if !ptrResult && !nonPtrResult {
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected to return %s or *%s", t, t.Name.Name, t.Name.Name)
|
||||
}
|
||||
|
||||
ptrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Kind == types.Pointer && f.Signature.Receiver.Elem.Name == t.Name
|
||||
nonPtrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Name == t.Name
|
||||
|
||||
if ptrRcvr && !ptrResult {
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a *%s result for a *%s receiver", t, t.Name.Name, t.Name.Name)
|
||||
}
|
||||
if nonPtrRcvr && !nonPtrResult {
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a %s result for a %s receiver", t, t.Name.Name, t.Name.Name)
|
||||
}
|
||||
|
||||
return f.Signature, nil
|
||||
}
|
||||
|
||||
// deepCopyMethodOrDie returns the signatrue of a DeepCopy method, nil or calls glog.Fatalf
|
||||
// if the type does not match.
|
||||
func deepCopyMethodOrDie(t *types.Type) *types.Signature {
|
||||
ret, err := deepCopyMethod(t)
|
||||
if err != nil {
|
||||
glog.Fatal(err)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
// deepCopyIntoMethod returns the signature of a DeepCopyInto() method, nil or an error
|
||||
// if the type is wrong. DeepCopyInto allows more efficient deep copy
|
||||
// implementations to be defined by the type's author. The correct signature
|
||||
// for a type T is:
|
||||
// func (t T) DeepCopyInto(t *T)
|
||||
// or:
|
||||
// func (t *T) DeepCopyInto(t *T)
|
||||
func deepCopyIntoMethod(t *types.Type) (*types.Signature, error) {
|
||||
f, found := t.Methods["DeepCopyInto"]
|
||||
if !found {
|
||||
return nil, nil
|
||||
}
|
||||
if len(f.Signature.Parameters) != 1 {
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected exactly one parameter", t)
|
||||
}
|
||||
if len(f.Signature.Results) != 0 {
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected no result type", t)
|
||||
}
|
||||
|
||||
ptrParam := f.Signature.Parameters[0].Kind == types.Pointer && f.Signature.Parameters[0].Elem.Name == t.Name
|
||||
|
||||
if !ptrParam {
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected parameter of type *%s", t, t.Name.Name)
|
||||
}
|
||||
|
||||
ptrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Kind == types.Pointer && f.Signature.Receiver.Elem.Name == t.Name
|
||||
nonPtrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Name == t.Name
|
||||
|
||||
if !ptrRcvr && !nonPtrRcvr {
|
||||
// this should never happen
|
||||
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a receiver of type %s or *%s", t, t.Name.Name, t.Name.Name)
|
||||
}
|
||||
|
||||
return f.Signature, nil
|
||||
}
|
||||
|
||||
// deepCopyIntoMethodOrDie returns the signature of a DeepCopyInto() method, nil or calls glog.Fatalf
|
||||
// if the type is wrong.
|
||||
func deepCopyIntoMethodOrDie(t *types.Type) *types.Signature {
|
||||
ret, err := deepCopyIntoMethod(t)
|
||||
if err != nil {
|
||||
glog.Fatal(err)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func isRootedUnder(pkg string, roots []string) bool {
|
||||
// Add trailing / to avoid false matches, e.g. foo/bar vs foo/barn. This
|
||||
// assumes that bounding dirs do not have trailing slashes.
|
||||
pkg = pkg + "/"
|
||||
for _, root := range roots {
|
||||
if strings.HasPrefix(pkg, root+"/") {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func copyableType(t *types.Type) bool {
|
||||
// If the type opts out of copy-generation, stop.
|
||||
ttag := extractTag(t.CommentLines)
|
||||
if ttag != nil && ttag.value == "false" {
|
||||
return false
|
||||
}
|
||||
|
||||
// Filter out private types.
|
||||
if namer.IsPrivateGoName(t.Name.Name) {
|
||||
return false
|
||||
}
|
||||
|
||||
if t.Kind == types.Alias {
|
||||
// if the underlying built-in is not deepcopy-able, deepcopy is opt-in through definition of custom methods.
|
||||
// Note that aliases of builtins, maps, slices can have deepcopy methods.
|
||||
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
|
||||
return true
|
||||
} else {
|
||||
return t.Underlying.Kind != types.Builtin || copyableType(t.Underlying)
|
||||
}
|
||||
}
|
||||
|
||||
if t.Kind != types.Struct {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func underlyingType(t *types.Type) *types.Type {
|
||||
for t.Kind == types.Alias {
|
||||
t = t.Underlying
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
func (g *genDeepCopy) isOtherPackage(pkg string) bool {
|
||||
if pkg == g.targetPackage {
|
||||
return false
|
||||
}
|
||||
if strings.HasSuffix(pkg, "\""+g.targetPackage+"\"") {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (g *genDeepCopy) Imports(c *generator.Context) (imports []string) {
|
||||
importLines := []string{}
|
||||
for _, singleImport := range g.imports.ImportLines() {
|
||||
if g.isOtherPackage(singleImport) {
|
||||
importLines = append(importLines, singleImport)
|
||||
}
|
||||
}
|
||||
return importLines
|
||||
}
|
||||
|
||||
func argsFromType(ts ...*types.Type) generator.Args {
|
||||
a := generator.Args{
|
||||
"type": ts[0],
|
||||
}
|
||||
for i, t := range ts {
|
||||
a[fmt.Sprintf("type%d", i+1)] = t
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func (g *genDeepCopy) Init(c *generator.Context, w io.Writer) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *genDeepCopy) needsGeneration(t *types.Type) bool {
|
||||
tag := extractTag(t.CommentLines)
|
||||
tv := ""
|
||||
if tag != nil {
|
||||
tv = tag.value
|
||||
if tv != "true" && tv != "false" {
|
||||
glog.Fatalf("Type %v: unsupported %s value: %q", t, tagName, tag.value)
|
||||
}
|
||||
}
|
||||
if g.allTypes && tv == "false" {
|
||||
// The whole package is being generated, but this type has opted out.
|
||||
glog.V(5).Infof("Not generating for type %v because type opted out", t)
|
||||
return false
|
||||
}
|
||||
if !g.allTypes && tv != "true" {
|
||||
// The whole package is NOT being generated, and this type has NOT opted in.
|
||||
glog.V(5).Infof("Not generating for type %v because type did not opt in", t)
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func extractInterfacesTag(comments []string) []string {
|
||||
var result []string
|
||||
values := types.ExtractCommentTags("+", comments)[interfacesTagName]
|
||||
for _, v := range values {
|
||||
if len(v) == 0 {
|
||||
continue
|
||||
}
|
||||
intfs := strings.Split(v, ",")
|
||||
for _, intf := range intfs {
|
||||
if intf == "" {
|
||||
continue
|
||||
}
|
||||
result = append(result, intf)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func extractNonPointerInterfaces(comments []string) (bool, error) {
|
||||
values := types.ExtractCommentTags("+", comments)[interfacesNonPointerTagName]
|
||||
if len(values) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
result := values[0] == "true"
|
||||
for _, v := range values {
|
||||
if v == "true" != result {
|
||||
return false, fmt.Errorf("contradicting %v value %q found to previous value %v", interfacesNonPointerTagName, v, result)
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (g *genDeepCopy) deepCopyableInterfacesInner(c *generator.Context, t *types.Type) ([]*types.Type, error) {
|
||||
if t.Kind != types.Struct {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
intfs := extractInterfacesTag(append(t.SecondClosestCommentLines, t.CommentLines...))
|
||||
|
||||
var ts []*types.Type
|
||||
for _, intf := range intfs {
|
||||
t := types.ParseFullyQualifiedName(intf)
|
||||
c.AddDir(t.Package)
|
||||
intfT := c.Universe.Type(t)
|
||||
if intfT == nil {
|
||||
return nil, fmt.Errorf("unknown type %q in %s tag of type %s", intf, interfacesTagName, intfT)
|
||||
}
|
||||
if intfT.Kind != types.Interface {
|
||||
return nil, fmt.Errorf("type %q in %s tag of type %s is not an interface, but: %q", intf, interfacesTagName, t, intfT.Kind)
|
||||
}
|
||||
g.imports.AddType(intfT)
|
||||
ts = append(ts, intfT)
|
||||
}
|
||||
|
||||
return ts, nil
|
||||
}
|
||||
|
||||
// deepCopyableInterfaces returns the interface types to implement and whether they apply to a non-pointer receiver.
|
||||
func (g *genDeepCopy) deepCopyableInterfaces(c *generator.Context, t *types.Type) ([]*types.Type, bool, error) {
|
||||
ts, err := g.deepCopyableInterfacesInner(c, t)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
|
||||
set := map[string]*types.Type{}
|
||||
for _, t := range ts {
|
||||
set[t.String()] = t
|
||||
}
|
||||
|
||||
result := []*types.Type{}
|
||||
for _, t := range set {
|
||||
result = append(result, t)
|
||||
}
|
||||
|
||||
TypeSlice(result).Sort() // we need a stable sorting because it determines the order in generation
|
||||
|
||||
nonPointerReceiver, err := extractNonPointerInterfaces(append(t.SecondClosestCommentLines, t.CommentLines...))
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
|
||||
return result, nonPointerReceiver, nil
|
||||
}
|
||||
|
||||
type TypeSlice []*types.Type
|
||||
|
||||
func (s TypeSlice) Len() int { return len(s) }
|
||||
func (s TypeSlice) Less(i, j int) bool { return s[i].String() < s[j].String() }
|
||||
func (s TypeSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s TypeSlice) Sort() { sort.Sort(s) }
|
||||
|
||||
func (g *genDeepCopy) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||
if !g.needsGeneration(t) {
|
||||
return nil
|
||||
}
|
||||
glog.V(5).Infof("Generating deepcopy function for type %v", t)
|
||||
|
||||
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
||||
args := argsFromType(t)
|
||||
|
||||
if deepCopyIntoMethodOrDie(t) == nil {
|
||||
sw.Do("// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\n", args)
|
||||
if isReference(t) {
|
||||
sw.Do("func (in $.type|raw$) DeepCopyInto(out *$.type|raw$) {\n", args)
|
||||
sw.Do("{in:=&in\n", nil)
|
||||
} else {
|
||||
sw.Do("func (in *$.type|raw$) DeepCopyInto(out *$.type|raw$) {\n", args)
|
||||
}
|
||||
if deepCopyMethodOrDie(t) != nil {
|
||||
if t.Methods["DeepCopy"].Signature.Receiver.Kind == types.Pointer {
|
||||
sw.Do("clone := in.DeepCopy()\n", nil)
|
||||
sw.Do("*out = *clone\n", nil)
|
||||
} else {
|
||||
sw.Do("*out = in.DeepCopy()\n", nil)
|
||||
}
|
||||
sw.Do("return\n", nil)
|
||||
} else {
|
||||
g.generateFor(t, sw)
|
||||
sw.Do("return\n", nil)
|
||||
}
|
||||
if isReference(t) {
|
||||
sw.Do("}\n", nil)
|
||||
}
|
||||
sw.Do("}\n\n", nil)
|
||||
}
|
||||
|
||||
if deepCopyMethodOrDie(t) == nil {
|
||||
sw.Do("// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new $.type|raw$.\n", args)
|
||||
if isReference(t) {
|
||||
sw.Do("func (in $.type|raw$) DeepCopy() $.type|raw$ {\n", args)
|
||||
} else {
|
||||
sw.Do("func (in *$.type|raw$) DeepCopy() *$.type|raw$ {\n", args)
|
||||
}
|
||||
sw.Do("if in == nil { return nil }\n", nil)
|
||||
sw.Do("out := new($.type|raw$)\n", args)
|
||||
sw.Do("in.DeepCopyInto(out)\n", nil)
|
||||
if isReference(t) {
|
||||
sw.Do("return *out\n", nil)
|
||||
} else {
|
||||
sw.Do("return out\n", nil)
|
||||
}
|
||||
sw.Do("}\n\n", nil)
|
||||
}
|
||||
|
||||
intfs, nonPointerReceiver, err := g.deepCopyableInterfaces(c, t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, intf := range intfs {
|
||||
sw.Do(fmt.Sprintf("// DeepCopy%s is an autogenerated deepcopy function, copying the receiver, creating a new $.type2|raw$.\n", intf.Name.Name), argsFromType(t, intf))
|
||||
if nonPointerReceiver {
|
||||
sw.Do(fmt.Sprintf("func (in $.type|raw$) DeepCopy%s() $.type2|raw$ {\n", intf.Name.Name), argsFromType(t, intf))
|
||||
sw.Do("return *in.DeepCopy()", nil)
|
||||
sw.Do("}\n\n", nil)
|
||||
} else {
|
||||
sw.Do(fmt.Sprintf("func (in *$.type|raw$) DeepCopy%s() $.type2|raw$ {\n", intf.Name.Name), argsFromType(t, intf))
|
||||
sw.Do("if c := in.DeepCopy(); c != nil {\n", nil)
|
||||
sw.Do("return c\n", nil)
|
||||
sw.Do("}\n", nil)
|
||||
sw.Do("return nil\n", nil)
|
||||
sw.Do("}\n\n", nil)
|
||||
}
|
||||
}
|
||||
|
||||
return sw.Error()
|
||||
}
|
||||
|
||||
// isReference return true for pointer, maps, slices and aliases of those.
|
||||
func isReference(t *types.Type) bool {
|
||||
if t.Kind == types.Pointer || t.Kind == types.Map || t.Kind == types.Slice {
|
||||
return true
|
||||
}
|
||||
return t.Kind == types.Alias && isReference(underlyingType(t))
|
||||
}
|
||||
|
||||
// we use the system of shadowing 'in' and 'out' so that the same code is valid
|
||||
// at any nesting level. This makes the autogenerator easy to understand, and
|
||||
// the compiler shouldn't care.
|
||||
func (g *genDeepCopy) generateFor(t *types.Type, sw *generator.SnippetWriter) {
|
||||
// derive inner types if t is an alias. We call the do* methods below with the alias type.
|
||||
// basic rule: generate according to inner type, but construct objects with the alias type.
|
||||
ut := underlyingType(t)
|
||||
|
||||
var f func(*types.Type, *generator.SnippetWriter)
|
||||
switch ut.Kind {
|
||||
case types.Builtin:
|
||||
f = g.doBuiltin
|
||||
case types.Map:
|
||||
f = g.doMap
|
||||
case types.Slice:
|
||||
f = g.doSlice
|
||||
case types.Struct:
|
||||
f = g.doStruct
|
||||
case types.Pointer:
|
||||
f = g.doPointer
|
||||
case types.Interface:
|
||||
// interfaces are handled in-line in the other cases
|
||||
glog.Fatalf("Hit an interface type %v. This should never happen.", t)
|
||||
case types.Alias:
|
||||
// can never happen because we branch on the underlying type which is never an alias
|
||||
glog.Fatalf("Hit an alias type %v. This should never happen.", t)
|
||||
default:
|
||||
glog.Fatalf("Hit an unsupported type %v.", t)
|
||||
}
|
||||
f(t, sw)
|
||||
}
|
||||
|
||||
// doBuiltin generates code for a builtin or an alias to a builtin. The generated code is
|
||||
// is the same for both cases, i.e. it's the code for the underlying type.
|
||||
func (g *genDeepCopy) doBuiltin(t *types.Type, sw *generator.SnippetWriter) {
|
||||
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
|
||||
sw.Do("*out = in.DeepCopy()\n", nil)
|
||||
return
|
||||
}
|
||||
|
||||
sw.Do("*out = *in\n", nil)
|
||||
}
|
||||
|
||||
// doMap generates code for a map or an alias to a map. The generated code is
|
||||
// is the same for both cases, i.e. it's the code for the underlying type.
|
||||
func (g *genDeepCopy) doMap(t *types.Type, sw *generator.SnippetWriter) {
|
||||
ut := underlyingType(t)
|
||||
uet := underlyingType(ut.Elem)
|
||||
|
||||
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
|
||||
sw.Do("*out = in.DeepCopy()\n", nil)
|
||||
return
|
||||
}
|
||||
|
||||
if !ut.Key.IsAssignable() {
|
||||
glog.Fatalf("Hit an unsupported type %v.", uet)
|
||||
}
|
||||
|
||||
sw.Do("*out = make($.|raw$, len(*in))\n", t)
|
||||
sw.Do("for key, val := range *in {\n", nil)
|
||||
dc, dci := deepCopyMethodOrDie(ut.Elem), deepCopyIntoMethodOrDie(ut.Elem)
|
||||
switch {
|
||||
case dc != nil || dci != nil:
|
||||
// Note: a DeepCopy exists because it is added if DeepCopyInto is manually defined
|
||||
leftPointer := ut.Elem.Kind == types.Pointer
|
||||
rightPointer := !isReference(ut.Elem)
|
||||
if dc != nil {
|
||||
rightPointer = dc.Results[0].Kind == types.Pointer
|
||||
}
|
||||
if leftPointer == rightPointer {
|
||||
sw.Do("(*out)[key] = val.DeepCopy()\n", nil)
|
||||
} else if leftPointer {
|
||||
sw.Do("x := val.DeepCopy()\n", nil)
|
||||
sw.Do("(*out)[key] = &x\n", nil)
|
||||
} else {
|
||||
sw.Do("(*out)[key] = *val.DeepCopy()\n", nil)
|
||||
}
|
||||
case ut.Elem.IsAnonymousStruct(): // not uet here because it needs type cast
|
||||
sw.Do("(*out)[key] = val\n", nil)
|
||||
case uet.IsAssignable():
|
||||
sw.Do("(*out)[key] = val\n", nil)
|
||||
case uet.Kind == types.Interface:
|
||||
sw.Do("if val == nil {(*out)[key]=nil} else {\n", nil)
|
||||
// Note: if t.Elem has been an alias "J" of an interface "I" in Go, we will see it
|
||||
// as kind Interface of name "J" here, i.e. generate val.DeepCopyJ(). The golang
|
||||
// parser does not give us the underlying interface name. So we cannot do any better.
|
||||
sw.Do(fmt.Sprintf("(*out)[key] = val.DeepCopy%s()\n", uet.Name.Name), nil)
|
||||
sw.Do("}\n", nil)
|
||||
case uet.Kind == types.Slice || uet.Kind == types.Map || uet.Kind == types.Pointer:
|
||||
sw.Do("var outVal $.|raw$\n", uet)
|
||||
sw.Do("if val == nil { (*out)[key] = nil } else {\n", nil)
|
||||
sw.Do("in, out := &val, &outVal\n", uet)
|
||||
g.generateFor(ut.Elem, sw)
|
||||
sw.Do("}\n", nil)
|
||||
sw.Do("(*out)[key] = outVal\n", nil)
|
||||
case uet.Kind == types.Struct:
|
||||
sw.Do("(*out)[key] = *val.DeepCopy()\n", uet)
|
||||
default:
|
||||
glog.Fatalf("Hit an unsupported type %v.", uet)
|
||||
}
|
||||
sw.Do("}\n", nil)
|
||||
}
|
||||
|
||||
// doSlice generates code for a slice or an alias to a slice. The generated code is
|
||||
// is the same for both cases, i.e. it's the code for the underlying type.
|
||||
func (g *genDeepCopy) doSlice(t *types.Type, sw *generator.SnippetWriter) {
|
||||
ut := underlyingType(t)
|
||||
uet := underlyingType(ut.Elem)
|
||||
|
||||
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
|
||||
sw.Do("*out = in.DeepCopy()\n", nil)
|
||||
return
|
||||
}
|
||||
|
||||
sw.Do("*out = make($.|raw$, len(*in))\n", t)
|
||||
if deepCopyMethodOrDie(ut.Elem) != nil || deepCopyIntoMethodOrDie(ut.Elem) != nil {
|
||||
sw.Do("for i := range *in {\n", nil)
|
||||
// Note: a DeepCopyInto exists because it is added if DeepCopy is manually defined
|
||||
sw.Do("(*in)[i].DeepCopyInto(&(*out)[i])\n", nil)
|
||||
sw.Do("}\n", nil)
|
||||
} else if uet.Kind == types.Builtin || uet.IsAssignable() {
|
||||
sw.Do("copy(*out, *in)\n", nil)
|
||||
} else {
|
||||
sw.Do("for i := range *in {\n", nil)
|
||||
if uet.Kind == types.Slice || uet.Kind == types.Map || uet.Kind == types.Pointer || deepCopyMethodOrDie(ut.Elem) != nil || deepCopyIntoMethodOrDie(ut.Elem) != nil {
|
||||
sw.Do("if (*in)[i] != nil {\n", nil)
|
||||
sw.Do("in, out := &(*in)[i], &(*out)[i]\n", nil)
|
||||
g.generateFor(ut.Elem, sw)
|
||||
sw.Do("}\n", nil)
|
||||
} else if uet.Kind == types.Interface {
|
||||
sw.Do("if (*in)[i] != nil {\n", nil)
|
||||
// Note: if t.Elem has been an alias "J" of an interface "I" in Go, we will see it
|
||||
// as kind Interface of name "J" here, i.e. generate val.DeepCopyJ(). The golang
|
||||
// parser does not give us the underlying interface name. So we cannot do any better.
|
||||
sw.Do(fmt.Sprintf("(*out)[i] = (*in)[i].DeepCopy%s()\n", uet.Name.Name), nil)
|
||||
sw.Do("}\n", nil)
|
||||
} else if uet.Kind == types.Struct {
|
||||
sw.Do("(*in)[i].DeepCopyInto(&(*out)[i])\n", nil)
|
||||
} else {
|
||||
glog.Fatalf("Hit an unsupported type %v.", uet)
|
||||
}
|
||||
sw.Do("}\n", nil)
|
||||
}
|
||||
}
|
||||
|
||||
// doStruct generates code for a struct or an alias to a struct. The generated code is
|
||||
// is the same for both cases, i.e. it's the code for the underlying type.
|
||||
func (g *genDeepCopy) doStruct(t *types.Type, sw *generator.SnippetWriter) {
|
||||
ut := underlyingType(t)
|
||||
|
||||
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
|
||||
sw.Do("*out = in.DeepCopy()\n", nil)
|
||||
return
|
||||
}
|
||||
|
||||
// Simple copy covers a lot of cases.
|
||||
sw.Do("*out = *in\n", nil)
|
||||
|
||||
// Now fix-up fields as needed.
|
||||
for _, m := range ut.Members {
|
||||
ft := m.Type
|
||||
uft := underlyingType(ft)
|
||||
|
||||
args := generator.Args{
|
||||
"type": ft,
|
||||
"kind": ft.Kind,
|
||||
"name": m.Name,
|
||||
}
|
||||
dc, dci := deepCopyMethodOrDie(ft), deepCopyIntoMethodOrDie(ft)
|
||||
switch {
|
||||
case dc != nil || dci != nil:
|
||||
// Note: a DeepCopyInto exists because it is added if DeepCopy is manually defined
|
||||
leftPointer := ft.Kind == types.Pointer
|
||||
rightPointer := !isReference(ft)
|
||||
if dc != nil {
|
||||
rightPointer = dc.Results[0].Kind == types.Pointer
|
||||
}
|
||||
if leftPointer == rightPointer {
|
||||
sw.Do("out.$.name$ = in.$.name$.DeepCopy()\n", args)
|
||||
} else if leftPointer {
|
||||
sw.Do("x := in.$.name$.DeepCopy()\n", args)
|
||||
sw.Do("out.$.name$ = = &x\n", args)
|
||||
} else {
|
||||
sw.Do("in.$.name$.DeepCopyInto(&out.$.name$)\n", args)
|
||||
}
|
||||
case uft.Kind == types.Builtin:
|
||||
// the initial *out = *in was enough
|
||||
case uft.Kind == types.Map, uft.Kind == types.Slice, uft.Kind == types.Pointer:
|
||||
// Fixup non-nil reference-semantic types.
|
||||
sw.Do("if in.$.name$ != nil {\n", args)
|
||||
sw.Do("in, out := &in.$.name$, &out.$.name$\n", args)
|
||||
g.generateFor(ft, sw)
|
||||
sw.Do("}\n", nil)
|
||||
case uft.Kind == types.Struct:
|
||||
if ft.IsAssignable() {
|
||||
sw.Do("out.$.name$ = in.$.name$\n", args)
|
||||
} else {
|
||||
sw.Do("in.$.name$.DeepCopyInto(&out.$.name$)\n", args)
|
||||
}
|
||||
case uft.Kind == types.Interface:
|
||||
sw.Do("if in.$.name$ != nil {\n", args)
|
||||
// Note: if t.Elem has been an alias "J" of an interface "I" in Go, we will see it
|
||||
// as kind Interface of name "J" here, i.e. generate val.DeepCopyJ(). The golang
|
||||
// parser does not give us the underlying interface name. So we cannot do any better.
|
||||
sw.Do(fmt.Sprintf("out.$.name$ = in.$.name$.DeepCopy%s()\n", uft.Name.Name), args)
|
||||
sw.Do("}\n", nil)
|
||||
default:
|
||||
glog.Fatalf("Hit an unsupported type %v.", uft)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// doPointer generates code for a pointer or an alias to a pointer. The generated code is
|
||||
// is the same for both cases, i.e. it's the code for the underlying type.
|
||||
func (g *genDeepCopy) doPointer(t *types.Type, sw *generator.SnippetWriter) {
|
||||
ut := underlyingType(t)
|
||||
uet := underlyingType(ut.Elem)
|
||||
|
||||
dc, dci := deepCopyMethodOrDie(ut.Elem), deepCopyIntoMethodOrDie(ut.Elem)
|
||||
switch {
|
||||
case dc != nil || dci != nil:
|
||||
rightPointer := !isReference(ut.Elem)
|
||||
if dc != nil {
|
||||
rightPointer = dc.Results[0].Kind == types.Pointer
|
||||
}
|
||||
if rightPointer {
|
||||
sw.Do("*out = (*in).DeepCopy()\n", nil)
|
||||
} else {
|
||||
sw.Do("x := (*in).DeepCopy()\n", nil)
|
||||
sw.Do("*out = &x\n", nil)
|
||||
}
|
||||
case uet.IsAssignable():
|
||||
sw.Do("*out = new($.Elem|raw$)\n", ut)
|
||||
sw.Do("**out = **in", nil)
|
||||
case uet.Kind == types.Map, uet.Kind == types.Slice, uet.Kind == types.Pointer:
|
||||
sw.Do("*out = new($.Elem|raw$)\n", ut)
|
||||
sw.Do("if **in != nil {\n", nil)
|
||||
sw.Do("in, out := *in, *out\n", nil)
|
||||
g.generateFor(uet, sw)
|
||||
sw.Do("}\n", nil)
|
||||
case uet.Kind == types.Struct:
|
||||
sw.Do("*out = new($.Elem|raw$)\n", ut)
|
||||
sw.Do("(*in).DeepCopyInto(*out)\n", nil)
|
||||
default:
|
||||
glog.Fatalf("Hit an unsupported type %v.", uet)
|
||||
}
|
||||
}
|
713
vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy_test.go
generated
vendored
Normal file
713
vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy_test.go
generated
vendored
Normal file
@@ -0,0 +1,713 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package generators
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"k8s.io/gengo/types"
|
||||
)
|
||||
|
||||
func Test_isRootedUnder(t *testing.T) {
|
||||
testCases := []struct {
|
||||
path string
|
||||
roots []string
|
||||
expect bool
|
||||
}{
|
||||
{
|
||||
path: "/foo/bar",
|
||||
roots: nil,
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
path: "/foo/bar",
|
||||
roots: []string{},
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
path: "/foo/bar",
|
||||
roots: []string{
|
||||
"/bad",
|
||||
},
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
path: "/foo/bar",
|
||||
roots: []string{
|
||||
"/foo",
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
{
|
||||
path: "/foo/bar",
|
||||
roots: []string{
|
||||
"/bad",
|
||||
"/foo",
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
{
|
||||
path: "/foo/bar/qux/zorb",
|
||||
roots: []string{
|
||||
"/foo/bar/qux",
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
{
|
||||
path: "/foo/bar",
|
||||
roots: []string{
|
||||
"/foo/bar",
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
{
|
||||
path: "/foo/barn",
|
||||
roots: []string{
|
||||
"/foo/bar",
|
||||
},
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
path: "/foo/bar",
|
||||
roots: []string{
|
||||
"/foo/barn",
|
||||
},
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
path: "/foo/bar",
|
||||
roots: []string{
|
||||
"",
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
}
|
||||
|
||||
for i, tc := range testCases {
|
||||
r := isRootedUnder(tc.path, tc.roots)
|
||||
if r != tc.expect {
|
||||
t.Errorf("case[%d]: expected %t, got %t for %q in %q", i, tc.expect, r, tc.path, tc.roots)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Test_deepCopyMethod(t *testing.T) {
|
||||
testCases := []struct {
|
||||
typ types.Type
|
||||
expect bool
|
||||
error bool
|
||||
}{
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
// No DeepCopy method.
|
||||
Methods: map[string]*types.Type{},
|
||||
},
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// No DeepCopy method.
|
||||
"method": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func()"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature (no result).
|
||||
"DeepCopy": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func()"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature (wrong result).
|
||||
"DeepCopy": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func() int"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{
|
||||
{
|
||||
Name: types.Name{Name: "int"},
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature with pointer receiver, but non-pointer result.
|
||||
"DeepCopy": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func() pkgname.typename"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{
|
||||
{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature with non-pointer receiver, but pointer result.
|
||||
"DeepCopy": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func() pkgname.typename"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{
|
||||
{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Correct signature with non-pointer receiver.
|
||||
"DeepCopy": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func() pkgname.typename"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{
|
||||
{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Correct signature with pointer receiver.
|
||||
"DeepCopy": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func() pkgname.typename"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{
|
||||
{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature (has params).
|
||||
"DeepCopy": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func(int) pkgname.typename"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{
|
||||
{
|
||||
Name: types.Name{Name: "int"},
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
},
|
||||
Results: []*types.Type{
|
||||
{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature (extra results).
|
||||
"DeepCopy": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func() (pkgname.typename, int)"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{
|
||||
{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
{
|
||||
Name: types.Name{Name: "int"},
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
}
|
||||
|
||||
for i, tc := range testCases {
|
||||
r, err := deepCopyMethod(&tc.typ)
|
||||
if tc.error && err == nil {
|
||||
t.Errorf("case[%d]: expected an error, got none", i)
|
||||
} else if !tc.error && err != nil {
|
||||
t.Errorf("case[%d]: expected no error, got: %v", i, err)
|
||||
} else if !tc.error && (r != nil) != tc.expect {
|
||||
t.Errorf("case[%d]: expected result %v, got: %v", i, tc.expect, r)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Test_deepCopyIntoMethod(t *testing.T) {
|
||||
testCases := []struct {
|
||||
typ types.Type
|
||||
expect bool
|
||||
error bool
|
||||
}{
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
// No DeepCopyInto method.
|
||||
Methods: map[string]*types.Type{},
|
||||
},
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// No DeepCopyInto method.
|
||||
"method": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func()"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature (no parameter).
|
||||
"DeepCopyInto": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func()"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{},
|
||||
Results: []*types.Type{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature (unexpected result).
|
||||
"DeepCopyInto": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func(*pkgname.typename) int"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{
|
||||
{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
},
|
||||
Results: []*types.Type{
|
||||
{
|
||||
Name: types.Name{Name: "int"},
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature (non-pointer parameter, pointer receiver).
|
||||
"DeepCopyInto": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func(pkgname.typename)"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{
|
||||
{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Results: []*types.Type{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Wrong signature (non-pointer parameter, non-pointer receiver).
|
||||
"DeepCopyInto": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func(pkgname.typename)"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
Parameters: []*types.Type{
|
||||
{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Results: []*types.Type{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
error: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Correct signature with non-pointer receiver.
|
||||
"DeepCopyInto": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func(*pkgname.typename)"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
Parameters: []*types.Type{
|
||||
{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
},
|
||||
Results: []*types.Type{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
{
|
||||
typ: types.Type{
|
||||
Name: types.Name{Package: "pkgname", Name: "typename"},
|
||||
Kind: types.Builtin,
|
||||
Methods: map[string]*types.Type{
|
||||
// Correct signature with pointer receiver.
|
||||
"DeepCopyInto": {
|
||||
Name: types.Name{Package: "pkgname", Name: "func(*pkgname.typename)"},
|
||||
Kind: types.Func,
|
||||
Signature: &types.Signature{
|
||||
Receiver: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
Parameters: []*types.Type{
|
||||
{
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{Kind: types.Struct, Name: types.Name{Package: "pkgname", Name: "typename"}},
|
||||
},
|
||||
},
|
||||
Results: []*types.Type{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: true,
|
||||
},
|
||||
}
|
||||
|
||||
for i, tc := range testCases {
|
||||
r, err := deepCopyIntoMethod(&tc.typ)
|
||||
if tc.error && err == nil {
|
||||
t.Errorf("case[%d]: expected an error, got none", i)
|
||||
} else if !tc.error && err != nil {
|
||||
t.Errorf("case[%d]: expected no error, got: %v", i, err)
|
||||
} else if !tc.error && (r != nil) != tc.expect {
|
||||
t.Errorf("case[%d]: expected result %v, got: %v", i, tc.expect, r)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Test_extractTagParams(t *testing.T) {
|
||||
testCases := []struct {
|
||||
comments []string
|
||||
expect *tagValue
|
||||
}{
|
||||
{
|
||||
comments: []string{
|
||||
"Human comment",
|
||||
},
|
||||
expect: nil,
|
||||
},
|
||||
{
|
||||
comments: []string{
|
||||
"Human comment",
|
||||
"+k8s:deepcopy-gen",
|
||||
},
|
||||
expect: &tagValue{
|
||||
value: "",
|
||||
register: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
comments: []string{
|
||||
"Human comment",
|
||||
"+k8s:deepcopy-gen=package",
|
||||
},
|
||||
expect: &tagValue{
|
||||
value: "package",
|
||||
register: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
comments: []string{
|
||||
"Human comment",
|
||||
"+k8s:deepcopy-gen=package,register",
|
||||
},
|
||||
expect: &tagValue{
|
||||
value: "package",
|
||||
register: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
comments: []string{
|
||||
"Human comment",
|
||||
"+k8s:deepcopy-gen=package,register=true",
|
||||
},
|
||||
expect: &tagValue{
|
||||
value: "package",
|
||||
register: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
comments: []string{
|
||||
"Human comment",
|
||||
"+k8s:deepcopy-gen=package,register=false",
|
||||
},
|
||||
expect: &tagValue{
|
||||
value: "package",
|
||||
register: false,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for i, tc := range testCases {
|
||||
r := extractTag(tc.comments)
|
||||
if r == nil && tc.expect != nil {
|
||||
t.Errorf("case[%d]: expected non-nil", i)
|
||||
}
|
||||
if r != nil && tc.expect == nil {
|
||||
t.Errorf("case[%d]: expected nil, got %v", i, *r)
|
||||
}
|
||||
if r != nil && *r != *tc.expect {
|
||||
t.Errorf("case[%d]: expected %v, got %v", i, *tc.expect, *r)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Test_extractInterfacesTag(t *testing.T) {
|
||||
testCases := []struct {
|
||||
comments []string
|
||||
expect []string
|
||||
}{
|
||||
{
|
||||
comments: []string{},
|
||||
expect: nil,
|
||||
},
|
||||
{
|
||||
comments: []string{
|
||||
"+k8s:deepcopy-gen:interfaces=k8s.io/kubernetes/runtime.Object",
|
||||
},
|
||||
expect: []string{
|
||||
"k8s.io/kubernetes/runtime.Object",
|
||||
},
|
||||
},
|
||||
{
|
||||
comments: []string{
|
||||
"+k8s:deepcopy-gen:interfaces=k8s.io/kubernetes/runtime.Object",
|
||||
"+k8s:deepcopy-gen:interfaces=k8s.io/kubernetes/runtime.List",
|
||||
},
|
||||
expect: []string{
|
||||
"k8s.io/kubernetes/runtime.Object",
|
||||
"k8s.io/kubernetes/runtime.List",
|
||||
},
|
||||
},
|
||||
{
|
||||
comments: []string{
|
||||
"+k8s:deepcopy-gen:interfaces=k8s.io/kubernetes/runtime.Object",
|
||||
"+k8s:deepcopy-gen:interfaces=k8s.io/kubernetes/runtime.Object",
|
||||
},
|
||||
expect: []string{
|
||||
"k8s.io/kubernetes/runtime.Object",
|
||||
"k8s.io/kubernetes/runtime.Object",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for i, tc := range testCases {
|
||||
r := extractInterfacesTag(tc.comments)
|
||||
if r == nil && tc.expect != nil {
|
||||
t.Errorf("case[%d]: expected non-nil", i)
|
||||
}
|
||||
if r != nil && tc.expect == nil {
|
||||
t.Errorf("case[%d]: expected nil, got %v", i, r)
|
||||
}
|
||||
if r != nil && !reflect.DeepEqual(r, tc.expect) {
|
||||
t.Errorf("case[%d]: expected %v, got %v", i, tc.expect, r)
|
||||
}
|
||||
}
|
||||
}
|
88
vendor/k8s.io/gengo/examples/deepcopy-gen/main.go
generated
vendored
Normal file
88
vendor/k8s.io/gengo/examples/deepcopy-gen/main.go
generated
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
Copyright 2015 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// deepcopy-gen is a tool for auto-generating DeepCopy functions.
|
||||
//
|
||||
// Given a list of input directories, it will generate DeepCopy and DeepCopyInto
|
||||
// methods that efficiently perform a full deep-copy of each type. If these
|
||||
// already exist (are predefined by the developer), they are used instead of
|
||||
// generating new ones.
|
||||
//
|
||||
// If interfaces are referenced in types, it is expected that corresponding
|
||||
// DeepCopyInterfaceName methods exist, e.g. DeepCopyObject for runtime.Object.
|
||||
// These can be predefined by the developer or generated through tags, see below.
|
||||
// They must be added to the interfaces themselves manually, e.g.
|
||||
// type Object interface {
|
||||
// ...
|
||||
// DeepCopyObject() Object
|
||||
// }
|
||||
//
|
||||
// All generation is governed by comment tags in the source. Any package may
|
||||
// request DeepCopy generation by including a comment in the file-comments of
|
||||
// one file, of the form:
|
||||
// // +k8s:deepcopy-gen=package
|
||||
//
|
||||
// DeepCopy functions can be generated for individual types, rather than the
|
||||
// entire package by specifying a comment on the type definion of the form:
|
||||
// // +k8s:deepcopy-gen=true
|
||||
//
|
||||
// When generating for a whole package, individual types may opt out of
|
||||
// DeepCopy generation by specifying a comment on the type definition of the form:
|
||||
// // +k8s:deepcopy-gen=false
|
||||
//
|
||||
// Additional DeepCopyInterfaceName methods can be generated by sepcifying a
|
||||
// comment on the type definition of the form:
|
||||
// // +k8s:deepcopy-gen:interfaces=k8s.io/kubernetes/runtime.Object,k8s.io/kubernetes/runtime.List
|
||||
// This leads to the generation of DeepCopyObject and DeepCopyList with the given
|
||||
// interfaces as return types. We say that the tagged type implements deepcopy for the
|
||||
// interfaces.
|
||||
//
|
||||
// The deepcopy funcs for interfaces using "+k8s:deepcopy-gen:interfaces" use the pointer
|
||||
// of the type as receiver. For those special cases where the non-pointer object should
|
||||
// implement the interface, this can be done with:
|
||||
// // +k8s:deepcopy-gen:nonpointer-interfaces=true
|
||||
package main
|
||||
|
||||
import (
|
||||
"k8s.io/gengo/args"
|
||||
"k8s.io/gengo/examples/deepcopy-gen/generators"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/spf13/pflag"
|
||||
)
|
||||
|
||||
func main() {
|
||||
arguments := args.Default()
|
||||
|
||||
// Override defaults.
|
||||
arguments.OutputFileBaseName = "deepcopy_generated"
|
||||
|
||||
// Custom args.
|
||||
customArgs := &generators.CustomArgs{}
|
||||
pflag.CommandLine.StringSliceVar(&customArgs.BoundingDirs, "bounding-dirs", customArgs.BoundingDirs,
|
||||
"Comma-separated list of import paths which bound the types for which deep-copies will be generated.")
|
||||
arguments.CustomArgs = customArgs
|
||||
|
||||
// Run it.
|
||||
if err := arguments.Execute(
|
||||
generators.NameSystems(),
|
||||
generators.DefaultNameSystem(),
|
||||
generators.Packages,
|
||||
); err != nil {
|
||||
glog.Fatalf("Error: %v", err)
|
||||
}
|
||||
glog.V(2).Info("Completed successfully.")
|
||||
}
|
89
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases/doc.go
generated
vendored
Normal file
89
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases/doc.go
generated
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
Copyright 2018 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:deepcopy-gen=package
|
||||
|
||||
// This is a test package.
|
||||
package aliases
|
||||
|
||||
// Note: the following AliasInterface and AliasAliasInterface +k8s:deepcopy-gen:interfaces tags
|
||||
// are necessary because Golang flattens interface alias in the type system. I.e. an alias J of
|
||||
// an interface I is actually equivalent to I. So support deepcopies of those aliases, we have
|
||||
// to implement all aliases of that interface.
|
||||
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases.Interface
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases.AliasInterface
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases.AliasAliasInterface
|
||||
type Foo struct {
|
||||
X int
|
||||
}
|
||||
|
||||
type Interface interface {
|
||||
DeepCopyInterface() Interface
|
||||
DeepCopyAliasInterface() AliasInterface
|
||||
DeepCopyAliasAliasInterface() AliasAliasInterface
|
||||
}
|
||||
|
||||
type Builtin int
|
||||
type Slice []int
|
||||
type Pointer *int
|
||||
type PointerAlias *Builtin
|
||||
type Struct Foo
|
||||
type Map map[string]int
|
||||
|
||||
type FooAlias Foo
|
||||
type FooSlice []Foo
|
||||
type FooPointer *Foo
|
||||
type FooMap map[string]Foo
|
||||
|
||||
type AliasBuiltin Builtin
|
||||
type AliasSlice Slice
|
||||
type AliasPointer Pointer
|
||||
type AliasStruct Struct
|
||||
type AliasMap Map
|
||||
|
||||
type AliasInterface Interface
|
||||
type AliasAliasInterface AliasInterface
|
||||
type AliasInterfaceMap map[string]AliasInterface
|
||||
type AliasInterfaceSlice []AliasInterface
|
||||
|
||||
// Aliases
|
||||
type Ttest struct {
|
||||
Builtin Builtin
|
||||
Slice Slice
|
||||
Pointer Pointer
|
||||
PointerAlias PointerAlias
|
||||
Struct Struct
|
||||
Map Map
|
||||
SliceSlice []Slice
|
||||
MapSlice map[string]Slice
|
||||
|
||||
FooAlias FooAlias
|
||||
FooSlice FooSlice
|
||||
FooPointer FooPointer
|
||||
FooMap FooMap
|
||||
|
||||
AliasBuiltin AliasBuiltin
|
||||
AliasSlice AliasSlice
|
||||
AliasPointer AliasPointer
|
||||
AliasStruct AliasStruct
|
||||
AliasMap AliasMap
|
||||
|
||||
AliasInterface AliasInterface
|
||||
AliasAliasInterface AliasAliasInterface
|
||||
AliasInterfaceMap AliasInterfaceMap
|
||||
AliasInterfaceSlice AliasInterfaceSlice
|
||||
}
|
412
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases/zz_generated.go
generated
vendored
Normal file
412
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases/zz_generated.go
generated
vendored
Normal file
@@ -0,0 +1,412 @@
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package aliases
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in AliasInterfaceMap) DeepCopyInto(out *AliasInterfaceMap) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(AliasInterfaceMap, len(*in))
|
||||
for key, val := range *in {
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
(*out)[key] = val.DeepCopyAliasInterface()
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AliasInterfaceMap.
|
||||
func (in AliasInterfaceMap) DeepCopy() AliasInterfaceMap {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(AliasInterfaceMap)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in AliasInterfaceSlice) DeepCopyInto(out *AliasInterfaceSlice) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(AliasInterfaceSlice, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
(*out)[i] = (*in)[i].DeepCopyAliasInterface()
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AliasInterfaceSlice.
|
||||
func (in AliasInterfaceSlice) DeepCopy() AliasInterfaceSlice {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(AliasInterfaceSlice)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in AliasMap) DeepCopyInto(out *AliasMap) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(AliasMap, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AliasMap.
|
||||
func (in AliasMap) DeepCopy() AliasMap {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(AliasMap)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in AliasSlice) DeepCopyInto(out *AliasSlice) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(AliasSlice, len(*in))
|
||||
copy(*out, *in)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AliasSlice.
|
||||
func (in AliasSlice) DeepCopy() AliasSlice {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(AliasSlice)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *AliasStruct) DeepCopyInto(out *AliasStruct) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AliasStruct.
|
||||
func (in *AliasStruct) DeepCopy() *AliasStruct {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(AliasStruct)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Foo) DeepCopyInto(out *Foo) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Foo.
|
||||
func (in *Foo) DeepCopy() *Foo {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Foo)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyAliasAliasInterface is an autogenerated deepcopy function, copying the receiver, creating a new AliasAliasInterface.
|
||||
func (in *Foo) DeepCopyAliasAliasInterface() AliasAliasInterface {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyAliasInterface is an autogenerated deepcopy function, copying the receiver, creating a new AliasInterface.
|
||||
func (in *Foo) DeepCopyAliasInterface() AliasInterface {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInterface is an autogenerated deepcopy function, copying the receiver, creating a new Interface.
|
||||
func (in *Foo) DeepCopyInterface() Interface {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *FooAlias) DeepCopyInto(out *FooAlias) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FooAlias.
|
||||
func (in *FooAlias) DeepCopy() *FooAlias {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(FooAlias)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in FooMap) DeepCopyInto(out *FooMap) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(FooMap, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FooMap.
|
||||
func (in FooMap) DeepCopy() FooMap {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(FooMap)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in FooSlice) DeepCopyInto(out *FooSlice) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(FooSlice, len(*in))
|
||||
copy(*out, *in)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FooSlice.
|
||||
func (in FooSlice) DeepCopy() FooSlice {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(FooSlice)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in Map) DeepCopyInto(out *Map) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(Map, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Map.
|
||||
func (in Map) DeepCopy() Map {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Map)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in Slice) DeepCopyInto(out *Slice) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(Slice, len(*in))
|
||||
copy(*out, *in)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Slice.
|
||||
func (in Slice) DeepCopy() Slice {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Slice)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct) DeepCopyInto(out *Struct) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct.
|
||||
func (in *Struct) DeepCopy() *Struct {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Ttest) DeepCopyInto(out *Ttest) {
|
||||
*out = *in
|
||||
if in.Slice != nil {
|
||||
in, out := &in.Slice, &out.Slice
|
||||
*out = make(Slice, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Pointer != nil {
|
||||
in, out := &in.Pointer, &out.Pointer
|
||||
*out = new(int)
|
||||
**out = **in
|
||||
}
|
||||
if in.PointerAlias != nil {
|
||||
in, out := &in.PointerAlias, &out.PointerAlias
|
||||
*out = new(Builtin)
|
||||
**out = **in
|
||||
}
|
||||
out.Struct = in.Struct
|
||||
if in.Map != nil {
|
||||
in, out := &in.Map, &out.Map
|
||||
*out = make(Map, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.SliceSlice != nil {
|
||||
in, out := &in.SliceSlice, &out.SliceSlice
|
||||
*out = make([]Slice, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = make(Slice, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.MapSlice != nil {
|
||||
in, out := &in.MapSlice, &out.MapSlice
|
||||
*out = make(map[string]Slice, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal []int
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = make(Slice, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
}
|
||||
}
|
||||
out.FooAlias = in.FooAlias
|
||||
if in.FooSlice != nil {
|
||||
in, out := &in.FooSlice, &out.FooSlice
|
||||
*out = make(FooSlice, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.FooPointer != nil {
|
||||
in, out := &in.FooPointer, &out.FooPointer
|
||||
*out = new(Foo)
|
||||
**out = **in
|
||||
}
|
||||
if in.FooMap != nil {
|
||||
in, out := &in.FooMap, &out.FooMap
|
||||
*out = make(FooMap, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.AliasSlice != nil {
|
||||
in, out := &in.AliasSlice, &out.AliasSlice
|
||||
*out = make(AliasSlice, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.AliasPointer != nil {
|
||||
in, out := &in.AliasPointer, &out.AliasPointer
|
||||
*out = new(int)
|
||||
**out = **in
|
||||
}
|
||||
out.AliasStruct = in.AliasStruct
|
||||
if in.AliasMap != nil {
|
||||
in, out := &in.AliasMap, &out.AliasMap
|
||||
*out = make(AliasMap, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.AliasInterface != nil {
|
||||
out.AliasInterface = in.AliasInterface.DeepCopyAliasInterface()
|
||||
}
|
||||
if in.AliasAliasInterface != nil {
|
||||
out.AliasAliasInterface = in.AliasAliasInterface.DeepCopyAliasAliasInterface()
|
||||
}
|
||||
if in.AliasInterfaceMap != nil {
|
||||
in, out := &in.AliasInterfaceMap, &out.AliasInterfaceMap
|
||||
*out = make(AliasInterfaceMap, len(*in))
|
||||
for key, val := range *in {
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
(*out)[key] = val.DeepCopyAliasInterface()
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.AliasInterfaceSlice != nil {
|
||||
in, out := &in.AliasInterfaceSlice, &out.AliasInterfaceSlice
|
||||
*out = make(AliasInterfaceSlice, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
(*out)[i] = (*in)[i].DeepCopyAliasInterface()
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ttest.
|
||||
func (in *Ttest) DeepCopy() *Ttest {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Ttest)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
35
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/builtins/doc.go
generated
vendored
Normal file
35
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/builtins/doc.go
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:deepcopy-gen=package
|
||||
|
||||
// This is a test package.
|
||||
package builtins
|
||||
|
||||
type Ttest struct {
|
||||
Byte byte
|
||||
//Int8 int8 //TODO: int8 becomes byte in SnippetWriter
|
||||
Int16 int16
|
||||
Int32 int32
|
||||
Int64 int64
|
||||
Uint8 uint8
|
||||
Uint16 uint16
|
||||
Uint32 uint32
|
||||
Uint64 uint64
|
||||
Float32 float32
|
||||
Float64 float64
|
||||
String string
|
||||
}
|
37
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/builtins/zz_generated.go
generated
vendored
Normal file
37
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/builtins/zz_generated.go
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package builtins
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Ttest) DeepCopyInto(out *Ttest) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ttest.
|
||||
func (in *Ttest) DeepCopy() *Ttest {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Ttest)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
131
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/interface_fuzzer.go
generated
vendored
Normal file
131
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/interface_fuzzer.go
generated
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
Copyright 2018 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package output_tests
|
||||
|
||||
import (
|
||||
"github.com/google/gofuzz"
|
||||
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases"
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/interfaces"
|
||||
)
|
||||
|
||||
// interfaceFuzzers contains fuzzer that set all interface to nil because our
|
||||
// JSON deepcopy does not work with it.
|
||||
// TODO: test also interface deepcopy
|
||||
var interfaceFuzzers = []interface{}{
|
||||
func(s *aliases.AliasAliasInterface, c fuzz.Continue) {
|
||||
if c.RandBool() {
|
||||
*s = nil
|
||||
} else {
|
||||
*s = &aliasAliasInterfaceInstance{X: c.Int()}
|
||||
}
|
||||
},
|
||||
func(s *aliases.AliasInterface, c fuzz.Continue) {
|
||||
if c.RandBool() {
|
||||
*s = nil
|
||||
} else {
|
||||
*s = &aliasAliasInterfaceInstance{X: c.Int()}
|
||||
}
|
||||
},
|
||||
func(s *aliases.Interface, c fuzz.Continue) {
|
||||
if c.RandBool() {
|
||||
*s = nil
|
||||
} else {
|
||||
*s = &aliasAliasInterfaceInstance{X: c.Int()}
|
||||
}
|
||||
},
|
||||
func(s *aliases.AliasInterfaceMap, c fuzz.Continue) {
|
||||
if c.RandBool() {
|
||||
*s = nil
|
||||
} else {
|
||||
*s = make(aliases.AliasInterfaceMap)
|
||||
for i := 0; i < c.Intn(3); i++ {
|
||||
if c.RandBool() {
|
||||
(*s)[c.RandString()] = nil
|
||||
} else {
|
||||
(*s)[c.RandString()] = &aliasAliasInterfaceInstance{X: c.Int()}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
func(s *aliases.AliasInterfaceSlice, c fuzz.Continue) {
|
||||
if c.RandBool() {
|
||||
*s = nil
|
||||
} else {
|
||||
*s = make(aliases.AliasInterfaceSlice, 0, 0)
|
||||
for i := 0; i < c.Intn(3); i++ {
|
||||
if c.RandBool() {
|
||||
*s = append(*s, nil)
|
||||
} else {
|
||||
*s = append(*s, &aliasAliasInterfaceInstance{X: c.Int()})
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
func(s *interfaces.Inner, c fuzz.Continue) {
|
||||
if c.RandBool() {
|
||||
*s = nil
|
||||
} else {
|
||||
*s = &interfacesInnerInstance{X: c.Float64()}
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
type aliasAliasInterfaceInstance struct {
|
||||
X int
|
||||
}
|
||||
|
||||
func (i *aliasAliasInterfaceInstance) DeepCopyInterface() aliases.Interface {
|
||||
if i == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &aliasAliasInterfaceInstance{X: i.X}
|
||||
}
|
||||
|
||||
func (i *aliasAliasInterfaceInstance) DeepCopyAliasInterface() aliases.AliasInterface {
|
||||
if i == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &aliasAliasInterfaceInstance{X: i.X}
|
||||
}
|
||||
|
||||
func (i *aliasAliasInterfaceInstance) DeepCopyAliasAliasInterface() aliases.AliasAliasInterface {
|
||||
if i == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &aliasAliasInterfaceInstance{X: i.X}
|
||||
}
|
||||
|
||||
type interfacesInnerInstance struct {
|
||||
X float64
|
||||
}
|
||||
|
||||
func (i *interfacesInnerInstance) DeepCopyInner() interfaces.Inner {
|
||||
if i == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &interfacesInnerInstance{X: i.X}
|
||||
}
|
||||
|
||||
func (i *interfacesInnerInstance) Function() float64 {
|
||||
return i.X
|
||||
}
|
29
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/interfaces/doc.go
generated
vendored
Normal file
29
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/interfaces/doc.go
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
Copyright 2017 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:deepcopy-gen=package
|
||||
|
||||
// This is a test package.
|
||||
package interfaces
|
||||
|
||||
type Inner interface {
|
||||
Function() float64
|
||||
DeepCopyInner() Inner
|
||||
}
|
||||
|
||||
type Ttest struct {
|
||||
I []Inner
|
||||
}
|
46
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/interfaces/zz_generated.go
generated
vendored
Normal file
46
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/interfaces/zz_generated.go
generated
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package interfaces
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Ttest) DeepCopyInto(out *Ttest) {
|
||||
*out = *in
|
||||
if in.I != nil {
|
||||
in, out := &in.I, &out.I
|
||||
*out = make([]Inner, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
(*out)[i] = (*in)[i].DeepCopyInner()
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ttest.
|
||||
func (in *Ttest) DeepCopy() *Ttest {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Ttest)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
43
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/maps/doc.go
generated
vendored
Normal file
43
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/maps/doc.go
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:deepcopy-gen=package
|
||||
|
||||
// This is a test package.
|
||||
package maps
|
||||
|
||||
type Ttest struct {
|
||||
Byte map[string]byte
|
||||
//Int8 map[string]int8 //TODO: int8 becomes byte in SnippetWriter
|
||||
Int16 map[string]int16
|
||||
Int32 map[string]int32
|
||||
Int64 map[string]int64
|
||||
Uint8 map[string]uint8
|
||||
Uint16 map[string]uint16
|
||||
Uint32 map[string]uint32
|
||||
Uint64 map[string]uint64
|
||||
Float32 map[string]float32
|
||||
Float64 map[string]float64
|
||||
String map[string]string
|
||||
StringPtr map[string]*string
|
||||
StringPtrPtr map[string]**string
|
||||
Map map[string]map[string]string
|
||||
MapPtr map[string]*map[string]string
|
||||
Slice map[string][]string
|
||||
SlicePtr map[string]*[]string
|
||||
Struct map[string]Ttest
|
||||
StructPtr map[string]*Ttest
|
||||
}
|
242
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/maps/zz_generated.go
generated
vendored
Normal file
242
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/maps/zz_generated.go
generated
vendored
Normal file
@@ -0,0 +1,242 @@
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package maps
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Ttest) DeepCopyInto(out *Ttest) {
|
||||
*out = *in
|
||||
if in.Byte != nil {
|
||||
in, out := &in.Byte, &out.Byte
|
||||
*out = make(map[string]byte, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Int16 != nil {
|
||||
in, out := &in.Int16, &out.Int16
|
||||
*out = make(map[string]int16, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Int32 != nil {
|
||||
in, out := &in.Int32, &out.Int32
|
||||
*out = make(map[string]int32, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Int64 != nil {
|
||||
in, out := &in.Int64, &out.Int64
|
||||
*out = make(map[string]int64, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Uint8 != nil {
|
||||
in, out := &in.Uint8, &out.Uint8
|
||||
*out = make(map[string]byte, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Uint16 != nil {
|
||||
in, out := &in.Uint16, &out.Uint16
|
||||
*out = make(map[string]uint16, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Uint32 != nil {
|
||||
in, out := &in.Uint32, &out.Uint32
|
||||
*out = make(map[string]uint32, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Uint64 != nil {
|
||||
in, out := &in.Uint64, &out.Uint64
|
||||
*out = make(map[string]uint64, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Float32 != nil {
|
||||
in, out := &in.Float32, &out.Float32
|
||||
*out = make(map[string]float32, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Float64 != nil {
|
||||
in, out := &in.Float64, &out.Float64
|
||||
*out = make(map[string]float64, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.String != nil {
|
||||
in, out := &in.String, &out.String
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.StringPtr != nil {
|
||||
in, out := &in.StringPtr, &out.StringPtr
|
||||
*out = make(map[string]*string, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal *string
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
}
|
||||
}
|
||||
if in.StringPtrPtr != nil {
|
||||
in, out := &in.StringPtrPtr, &out.StringPtrPtr
|
||||
*out = make(map[string]**string, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal **string
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = new(*string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
}
|
||||
}
|
||||
if in.Map != nil {
|
||||
in, out := &in.Map, &out.Map
|
||||
*out = make(map[string]map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal map[string]string
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
}
|
||||
}
|
||||
if in.MapPtr != nil {
|
||||
in, out := &in.MapPtr, &out.MapPtr
|
||||
*out = make(map[string]*map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal *map[string]string
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = new(map[string]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
}
|
||||
}
|
||||
if in.Slice != nil {
|
||||
in, out := &in.Slice, &out.Slice
|
||||
*out = make(map[string][]string, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal []string
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
}
|
||||
}
|
||||
if in.SlicePtr != nil {
|
||||
in, out := &in.SlicePtr, &out.SlicePtr
|
||||
*out = make(map[string]*[]string, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal *[]string
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = new([]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
}
|
||||
}
|
||||
if in.Struct != nil {
|
||||
in, out := &in.Struct, &out.Struct
|
||||
*out = make(map[string]Ttest, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = *val.DeepCopy()
|
||||
}
|
||||
}
|
||||
if in.StructPtr != nil {
|
||||
in, out := &in.StructPtr, &out.StructPtr
|
||||
*out = make(map[string]*Ttest, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal *Ttest
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = new(Ttest)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ttest.
|
||||
func (in *Ttest) DeepCopy() *Ttest {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Ttest)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
25
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg/interfaces.go
generated
vendored
Normal file
25
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg/interfaces.go
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
Copyright 2017 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package otherpkg
|
||||
|
||||
type Object interface {
|
||||
DeepCopyObject() Object
|
||||
}
|
||||
|
||||
type List interface {
|
||||
DeepCopyList() List
|
||||
}
|
157
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/output_test.go
generated
vendored
Normal file
157
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/output_test.go
generated
vendored
Normal file
@@ -0,0 +1,157 @@
|
||||
package output_tests
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
"github.com/google/gofuzz"
|
||||
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/aliases"
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/builtins"
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/interfaces"
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/maps"
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/pointer"
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/slices"
|
||||
"k8s.io/gengo/examples/deepcopy-gen/output_tests/structs"
|
||||
)
|
||||
|
||||
func TestWithValueFuzzer(t *testing.T) {
|
||||
tests := []interface{}{
|
||||
aliases.Ttest{},
|
||||
builtins.Ttest{},
|
||||
interfaces.Ttest{},
|
||||
maps.Ttest{},
|
||||
pointer.Ttest{},
|
||||
slices.Ttest{},
|
||||
structs.Ttest{},
|
||||
}
|
||||
|
||||
fuzzer := fuzz.New()
|
||||
fuzzer.NilChance(0.5)
|
||||
fuzzer.NumElements(0, 2)
|
||||
fuzzer.Funcs(interfaceFuzzers...)
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(fmt.Sprintf("%T", test), func(t *testing.T) {
|
||||
N := 1000
|
||||
for i := 0; i < N; i++ {
|
||||
original := reflect.New(reflect.TypeOf(test)).Interface()
|
||||
|
||||
fuzzer.Fuzz(original)
|
||||
|
||||
reflectCopy := ReflectDeepCopy(original)
|
||||
|
||||
if !reflect.DeepEqual(original, reflectCopy) {
|
||||
t.Errorf("original and reflectCopy are different:\n\n original = %s\n\n jsonCopy = %s", spew.Sdump(original), spew.Sdump(reflectCopy))
|
||||
}
|
||||
|
||||
deepCopy := reflect.ValueOf(original).MethodByName("DeepCopy").Call(nil)[0].Interface()
|
||||
|
||||
if !reflect.DeepEqual(original, deepCopy) {
|
||||
t.Fatalf("original and deepCopy are different:\n\n original = %s\n\n deepCopy() = %s", spew.Sdump(original), spew.Sdump(deepCopy))
|
||||
}
|
||||
|
||||
ValueFuzz(original)
|
||||
|
||||
if !reflect.DeepEqual(reflectCopy, deepCopy) {
|
||||
t.Fatalf("reflectCopy and deepCopy are different:\n\n origin = %s\n\n jsonCopy() = %s", spew.Sdump(original), spew.Sdump(deepCopy))
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkReflectDeepCopy(b *testing.B) {
|
||||
fourtytwo := "fourtytwo"
|
||||
fourtytwoPtr := &fourtytwo
|
||||
var nilMap map[string]string
|
||||
var nilSlice []string
|
||||
mapPtr := &map[string]string{"0": "fourtytwo", "1": "fourtytwo"}
|
||||
slicePtr := &[]string{"fourtytwo", "fourtytwo", "fourtytwo"}
|
||||
structPtr := &pointer.Ttest{
|
||||
Builtin: &fourtytwo,
|
||||
Ptr: &fourtytwoPtr,
|
||||
}
|
||||
|
||||
tests := []interface{}{
|
||||
maps.Ttest{
|
||||
Byte: map[string]byte{"0": 42, "1": 42, "3": 42},
|
||||
Int16: map[string]int16{"0": 42, "1": 42, "3": 42},
|
||||
Int32: map[string]int32{"0": 42, "1": 42, "3": 42},
|
||||
Int64: map[string]int64{"0": 42, "1": 42, "3": 42},
|
||||
Uint8: map[string]uint8{"0": 42, "1": 42, "3": 42},
|
||||
Uint16: map[string]uint16{"0": 42, "1": 42, "3": 42},
|
||||
Uint32: map[string]uint32{"0": 42, "1": 42, "3": 42},
|
||||
Uint64: map[string]uint64{"0": 42, "1": 42, "3": 42},
|
||||
Float32: map[string]float32{"0": 42.0, "1": 42.0, "3": 42.0},
|
||||
Float64: map[string]float64{"0": 42, "1": 42, "3": 42},
|
||||
String: map[string]string{"0": "fourtytwo", "1": "fourtytwo", "3": "fourtytwo"},
|
||||
StringPtr: map[string]*string{"0": &fourtytwo, "1": &fourtytwo, "3": &fourtytwo},
|
||||
StringPtrPtr: map[string]**string{"0": &fourtytwoPtr, "1": &fourtytwoPtr, "3": &fourtytwoPtr},
|
||||
Map: map[string]map[string]string{"0": nil, "1": {"a": fourtytwo, "b": fourtytwo}, "3": {}},
|
||||
MapPtr: map[string]*map[string]string{"0": nil, "1": {"a": fourtytwo, "b": fourtytwo}, "3": &nilMap},
|
||||
Slice: map[string][]string{"0": nil, "1": {"a", "b"}, "2": {}},
|
||||
SlicePtr: map[string]*[]string{"0": nil, "1": {"a", "b"}, "2": &nilSlice},
|
||||
Struct: map[string]maps.Ttest{"0": {}, "1": {Byte: map[string]byte{"0": 42, "1": 42, "3": 42}}},
|
||||
StructPtr: map[string]*maps.Ttest{"0": nil, "1": {}, "2": {Byte: map[string]byte{"0": 42, "1": 42, "3": 42}}},
|
||||
},
|
||||
slices.Ttest{
|
||||
Byte: []byte{42, 42, 42},
|
||||
Int16: []int16{42, 42, 42},
|
||||
Int32: []int32{42, 42, 42},
|
||||
Int64: []int64{42, 42, 42},
|
||||
Uint8: []uint8{42, 42, 42},
|
||||
Uint16: []uint16{42, 42, 42},
|
||||
Uint32: []uint32{42, 42, 42},
|
||||
Uint64: []uint64{42, 42, 42},
|
||||
Float32: []float32{42.0, 42.0, 42.0},
|
||||
Float64: []float64{42, 42, 42},
|
||||
String: []string{"fourtytwo", "fourtytwo", "fourtytwo"},
|
||||
StringPtr: []*string{&fourtytwo, &fourtytwo, &fourtytwo},
|
||||
StringPtrPtr: []**string{&fourtytwoPtr, &fourtytwoPtr, &fourtytwoPtr},
|
||||
Map: []map[string]string{nil, {"a": fourtytwo, "b": fourtytwo}, {}},
|
||||
MapPtr: []*map[string]string{nil, {"a": fourtytwo, "b": fourtytwo}, &nilMap},
|
||||
Slice: [][]string{nil, {"a", "b"}, {}},
|
||||
SlicePtr: []*[]string{nil, {"a", "b"}, &nilSlice},
|
||||
Struct: []slices.Ttest{{}, {Byte: []byte{42, 42, 42}}},
|
||||
StructPtr: []*slices.Ttest{nil, {}, {Byte: []byte{42, 42, 42}}},
|
||||
},
|
||||
pointer.Ttest{
|
||||
Builtin: &fourtytwo,
|
||||
Ptr: &fourtytwoPtr,
|
||||
Map: &map[string]string{"0": "fourtytwo", "1": "fourtytwo"},
|
||||
Slice: &[]string{"fourtytwo", "fourtytwo", "fourtytwo"},
|
||||
MapPtr: &mapPtr,
|
||||
SlicePtr: &slicePtr,
|
||||
Struct: &pointer.Ttest{
|
||||
Builtin: &fourtytwo,
|
||||
Ptr: &fourtytwoPtr,
|
||||
},
|
||||
StructPtr: &structPtr,
|
||||
},
|
||||
}
|
||||
|
||||
fuzzer := fuzz.New()
|
||||
fuzzer.NilChance(0.5)
|
||||
fuzzer.NumElements(0, 2)
|
||||
fuzzer.Funcs(interfaceFuzzers...)
|
||||
|
||||
for _, test := range tests {
|
||||
b.Run(fmt.Sprintf("%T", test), func(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
switch t := test.(type) {
|
||||
case maps.Ttest:
|
||||
t.DeepCopy()
|
||||
case slices.Ttest:
|
||||
t.DeepCopy()
|
||||
case pointer.Ttest:
|
||||
t.DeepCopy()
|
||||
default:
|
||||
b.Fatalf("missing type case in switch for %T", t)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
31
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/pointer/doc.go
generated
vendored
Normal file
31
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/pointer/doc.go
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
Copyright 2017 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:deepcopy-gen=package
|
||||
|
||||
// This is a test package.
|
||||
package pointer
|
||||
|
||||
type Ttest struct {
|
||||
Builtin *string
|
||||
Ptr **string
|
||||
Map *map[string]string
|
||||
Slice *[]string
|
||||
MapPtr **map[string]string
|
||||
SlicePtr **[]string
|
||||
Struct *Ttest
|
||||
StructPtr **Ttest
|
||||
}
|
113
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/pointer/zz_generated.go
generated
vendored
Normal file
113
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/pointer/zz_generated.go
generated
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package pointer
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Ttest) DeepCopyInto(out *Ttest) {
|
||||
*out = *in
|
||||
if in.Builtin != nil {
|
||||
in, out := &in.Builtin, &out.Builtin
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
if in.Ptr != nil {
|
||||
in, out := &in.Ptr, &out.Ptr
|
||||
*out = new(*string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
}
|
||||
if in.Map != nil {
|
||||
in, out := &in.Map, &out.Map
|
||||
*out = new(map[string]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.Slice != nil {
|
||||
in, out := &in.Slice, &out.Slice
|
||||
*out = new([]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
if in.MapPtr != nil {
|
||||
in, out := &in.MapPtr, &out.MapPtr
|
||||
*out = new(*map[string]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = new(map[string]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.SlicePtr != nil {
|
||||
in, out := &in.SlicePtr, &out.SlicePtr
|
||||
*out = new(*[]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = new([]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.Struct != nil {
|
||||
in, out := &in.Struct, &out.Struct
|
||||
*out = new(Ttest)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.StructPtr != nil {
|
||||
in, out := &in.StructPtr, &out.StructPtr
|
||||
*out = new(*Ttest)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = new(Ttest)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ttest.
|
||||
func (in *Ttest) DeepCopy() *Ttest {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Ttest)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
81
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/reflect_deepcopy.go
generated
vendored
Normal file
81
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/reflect_deepcopy.go
generated
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
Copyright 2018 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package output_tests
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
// ReflectDeepCopy deep copies the object using reflection.
|
||||
func ReflectDeepCopy(in interface{}) interface{} {
|
||||
return reflectDeepCopy(reflect.ValueOf(in)).Interface()
|
||||
}
|
||||
|
||||
func reflectDeepCopy(src reflect.Value) reflect.Value {
|
||||
switch src.Kind() {
|
||||
case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice:
|
||||
if src.IsNil() {
|
||||
return src
|
||||
}
|
||||
}
|
||||
|
||||
switch src.Kind() {
|
||||
case reflect.Chan, reflect.Func, reflect.UnsafePointer, reflect.Uintptr:
|
||||
panic(fmt.Sprintf("cannot deep copy kind: %s", src.Kind()))
|
||||
case reflect.Array:
|
||||
dst := reflect.New(src.Type())
|
||||
for i := 0; i < src.Len(); i++ {
|
||||
dst.Elem().Index(i).Set(reflectDeepCopy(src.Index(i)))
|
||||
}
|
||||
return dst.Elem()
|
||||
case reflect.Interface:
|
||||
return reflectDeepCopy(src.Elem())
|
||||
case reflect.Map:
|
||||
dst := reflect.MakeMap(src.Type())
|
||||
for _, k := range src.MapKeys() {
|
||||
dst.SetMapIndex(k, reflectDeepCopy(src.MapIndex(k)))
|
||||
}
|
||||
return dst
|
||||
case reflect.Ptr:
|
||||
dst := reflect.New(src.Type().Elem())
|
||||
dst.Elem().Set(reflectDeepCopy(src.Elem()))
|
||||
return dst
|
||||
case reflect.Slice:
|
||||
dst := reflect.MakeSlice(src.Type(), 0, src.Len())
|
||||
for i := 0; i < src.Len(); i++ {
|
||||
dst = reflect.Append(dst, reflectDeepCopy(src.Index(i)))
|
||||
}
|
||||
return dst
|
||||
case reflect.Struct:
|
||||
dst := reflect.New(src.Type())
|
||||
for i := 0; i < src.NumField(); i++ {
|
||||
if !dst.Elem().Field(i).CanSet() {
|
||||
// Can't set private fields. At this point, the
|
||||
// best we can do is a shallow copy. For
|
||||
// example, time.Time is a value type with
|
||||
// private members that can be shallow copied.
|
||||
return src
|
||||
}
|
||||
dst.Elem().Field(i).Set(reflectDeepCopy(src.Field(i)))
|
||||
}
|
||||
return dst.Elem()
|
||||
default:
|
||||
// Value types like numbers, booleans, and strings.
|
||||
return src
|
||||
}
|
||||
}
|
43
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/slices/doc.go
generated
vendored
Normal file
43
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/slices/doc.go
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:deepcopy-gen=package
|
||||
|
||||
// This is a test package.
|
||||
package slices
|
||||
|
||||
type Ttest struct {
|
||||
Byte []byte
|
||||
//Int8 []int8 //TODO: int8 becomes byte in SnippetWriter
|
||||
Int16 []int16
|
||||
Int32 []int32
|
||||
Int64 []int64
|
||||
Uint8 []uint8
|
||||
Uint16 []uint16
|
||||
Uint32 []uint32
|
||||
Uint64 []uint64
|
||||
Float32 []float32
|
||||
Float64 []float64
|
||||
String []string
|
||||
StringPtr []*string
|
||||
StringPtrPtr []**string
|
||||
Map []map[string]string
|
||||
MapPtr []*map[string]string
|
||||
Slice [][]string
|
||||
SlicePtr []*[]string
|
||||
Struct []Ttest
|
||||
StructPtr []*Ttest
|
||||
}
|
192
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/slices/zz_generated.go
generated
vendored
Normal file
192
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/slices/zz_generated.go
generated
vendored
Normal file
@@ -0,0 +1,192 @@
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package slices
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Ttest) DeepCopyInto(out *Ttest) {
|
||||
*out = *in
|
||||
if in.Byte != nil {
|
||||
in, out := &in.Byte, &out.Byte
|
||||
*out = make([]byte, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Int16 != nil {
|
||||
in, out := &in.Int16, &out.Int16
|
||||
*out = make([]int16, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Int32 != nil {
|
||||
in, out := &in.Int32, &out.Int32
|
||||
*out = make([]int32, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Int64 != nil {
|
||||
in, out := &in.Int64, &out.Int64
|
||||
*out = make([]int64, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Uint8 != nil {
|
||||
in, out := &in.Uint8, &out.Uint8
|
||||
*out = make([]byte, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Uint16 != nil {
|
||||
in, out := &in.Uint16, &out.Uint16
|
||||
*out = make([]uint16, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Uint32 != nil {
|
||||
in, out := &in.Uint32, &out.Uint32
|
||||
*out = make([]uint32, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Uint64 != nil {
|
||||
in, out := &in.Uint64, &out.Uint64
|
||||
*out = make([]uint64, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Float32 != nil {
|
||||
in, out := &in.Float32, &out.Float32
|
||||
*out = make([]float32, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Float64 != nil {
|
||||
in, out := &in.Float64, &out.Float64
|
||||
*out = make([]float64, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.String != nil {
|
||||
in, out := &in.String, &out.String
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.StringPtr != nil {
|
||||
in, out := &in.StringPtr, &out.StringPtr
|
||||
*out = make([]*string, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.StringPtrPtr != nil {
|
||||
in, out := &in.StringPtrPtr, &out.StringPtrPtr
|
||||
*out = make([]**string, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(*string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.Map != nil {
|
||||
in, out := &in.Map, &out.Map
|
||||
*out = make([]map[string]string, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.MapPtr != nil {
|
||||
in, out := &in.MapPtr, &out.MapPtr
|
||||
*out = make([]*map[string]string, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(map[string]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.Slice != nil {
|
||||
in, out := &in.Slice, &out.Slice
|
||||
*out = make([][]string, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.SlicePtr != nil {
|
||||
in, out := &in.SlicePtr, &out.SlicePtr
|
||||
*out = make([]*[]string, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new([]string)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.Struct != nil {
|
||||
in, out := &in.Struct, &out.Struct
|
||||
*out = make([]Ttest, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.StructPtr != nil {
|
||||
in, out := &in.StructPtr, &out.StructPtr
|
||||
*out = make([]*Ttest, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Ttest)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ttest.
|
||||
func (in *Ttest) DeepCopy() *Ttest {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Ttest)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
40
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/structs/doc.go
generated
vendored
Normal file
40
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/structs/doc.go
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:deepcopy-gen=package
|
||||
|
||||
// This is a test package.
|
||||
package structs
|
||||
|
||||
type Inner struct {
|
||||
Byte byte
|
||||
//Int8 int8 //TODO: int8 becomes byte in SnippetWriter
|
||||
Int16 int16
|
||||
Int32 int32
|
||||
Int64 int64
|
||||
Uint8 uint8
|
||||
Uint16 uint16
|
||||
Uint32 uint32
|
||||
Uint64 uint64
|
||||
Float32 float32
|
||||
Float64 float64
|
||||
String string
|
||||
}
|
||||
|
||||
type Ttest struct {
|
||||
Inner1 Inner
|
||||
Inner2 Inner
|
||||
}
|
55
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/structs/zz_generated.go
generated
vendored
Normal file
55
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/structs/zz_generated.go
generated
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package structs
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Inner) DeepCopyInto(out *Inner) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Inner.
|
||||
func (in *Inner) DeepCopy() *Inner {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Inner)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Ttest) DeepCopyInto(out *Ttest) {
|
||||
*out = *in
|
||||
out.Inner1 = in.Inner1
|
||||
out.Inner2 = in.Inner2
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ttest.
|
||||
func (in *Ttest) DeepCopy() *Ttest {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Ttest)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
86
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/value_fuzzer.go
generated
vendored
Normal file
86
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/value_fuzzer.go
generated
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
Copyright 2018 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package output_tests
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
)
|
||||
|
||||
// ValueFuzz recursively changes all basic type values in an object. Any kind of references will not
|
||||
// be touched, i.e. the addresses of slices, maps, pointers will stay unchanged.
|
||||
func ValueFuzz(obj interface{}) {
|
||||
valueFuzz(reflect.ValueOf(obj))
|
||||
}
|
||||
|
||||
func valueFuzz(obj reflect.Value) {
|
||||
switch obj.Kind() {
|
||||
case reflect.Array:
|
||||
for i := 0; i < obj.Len(); i++ {
|
||||
valueFuzz(obj.Index(i))
|
||||
}
|
||||
case reflect.Slice:
|
||||
if obj.IsNil() {
|
||||
// TODO: set non-nil value
|
||||
} else {
|
||||
for i := 0; i < obj.Len(); i++ {
|
||||
valueFuzz(obj.Index(i))
|
||||
}
|
||||
}
|
||||
case reflect.Interface, reflect.Ptr:
|
||||
if obj.IsNil() {
|
||||
// TODO: set non-nil value
|
||||
} else {
|
||||
valueFuzz(obj.Elem())
|
||||
}
|
||||
case reflect.Struct:
|
||||
for i, n := 0, obj.NumField(); i < n; i++ {
|
||||
valueFuzz(obj.Field(i))
|
||||
}
|
||||
case reflect.Map:
|
||||
if obj.IsNil() {
|
||||
// TODO: set non-nil value
|
||||
} else {
|
||||
for _, k := range obj.MapKeys() {
|
||||
// map values are not addressable. We need a copy.
|
||||
v := obj.MapIndex(k)
|
||||
copy := reflect.New(v.Type())
|
||||
copy.Elem().Set(v)
|
||||
valueFuzz(copy.Elem())
|
||||
obj.SetMapIndex(k, copy.Elem())
|
||||
}
|
||||
// TODO: set some new value
|
||||
}
|
||||
case reflect.Func: // ignore, we don't have function types in our API
|
||||
default:
|
||||
if !obj.CanSet() {
|
||||
return
|
||||
}
|
||||
switch obj.Kind() {
|
||||
case reflect.String:
|
||||
obj.SetString(obj.String() + "x")
|
||||
case reflect.Bool:
|
||||
obj.SetBool(!obj.Bool())
|
||||
case reflect.Float32, reflect.Float64:
|
||||
obj.SetFloat(obj.Float()*2.0 + 1.0)
|
||||
case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:
|
||||
obj.SetInt(obj.Int() + 1)
|
||||
case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
|
||||
obj.SetUint(obj.Uint() + 1)
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
171
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/a.go
generated
vendored
Normal file
171
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/a.go
generated
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package wholepkg
|
||||
|
||||
import "k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg"
|
||||
|
||||
// Trivial
|
||||
type Struct_Empty struct{}
|
||||
|
||||
// Only primitives
|
||||
type Struct_Primitives struct {
|
||||
BoolField bool
|
||||
IntField int
|
||||
StringField string
|
||||
FloatField float64
|
||||
}
|
||||
type Struct_Primitives_Alias Struct_Primitives
|
||||
type Struct_Embed_Struct_Primitives struct {
|
||||
Struct_Primitives
|
||||
}
|
||||
type Struct_Embed_Int struct {
|
||||
int
|
||||
}
|
||||
type Struct_Struct_Primitives struct {
|
||||
StructField Struct_Primitives
|
||||
}
|
||||
|
||||
// Manual DeepCopy method
|
||||
type ManualStruct struct {
|
||||
StringField string
|
||||
}
|
||||
|
||||
func (m ManualStruct) DeepCopy() ManualStruct {
|
||||
return m
|
||||
}
|
||||
|
||||
type ManualStruct_Alias ManualStruct
|
||||
|
||||
type Struct_Embed_ManualStruct struct {
|
||||
ManualStruct
|
||||
}
|
||||
|
||||
// Only pointers to primitives
|
||||
type Struct_PrimitivePointers struct {
|
||||
BoolPtrField *bool
|
||||
IntPtrField *int
|
||||
StringPtrField *string
|
||||
FloatPtrField *float64
|
||||
}
|
||||
type Struct_PrimitivePointers_Alias Struct_PrimitivePointers
|
||||
type Struct_Embed_Struct_PrimitivePointers struct {
|
||||
Struct_PrimitivePointers
|
||||
}
|
||||
type Struct_Embed_Pointer struct {
|
||||
*int
|
||||
}
|
||||
type Struct_Struct_PrimitivePointers struct {
|
||||
StructField Struct_PrimitivePointers
|
||||
}
|
||||
|
||||
// Manual DeepCopy method
|
||||
type ManualSlice []string
|
||||
|
||||
func (m ManualSlice) DeepCopy() ManualSlice {
|
||||
r := make(ManualSlice, len(m))
|
||||
copy(r, m)
|
||||
return r
|
||||
}
|
||||
|
||||
// Slices
|
||||
type Struct_Slices struct {
|
||||
SliceBoolField []bool
|
||||
SliceByteField []byte
|
||||
SliceIntField []int
|
||||
SliceStringField []string
|
||||
SliceFloatField []float64
|
||||
SliceStructPrimitivesField []Struct_Primitives
|
||||
SliceStructPrimitivesAliasField []Struct_Primitives_Alias
|
||||
SliceStructPrimitivePointersField []Struct_PrimitivePointers
|
||||
SliceStructPrimitivePointersAliasField []Struct_PrimitivePointers_Alias
|
||||
SliceSliceIntField [][]int
|
||||
SliceManualStructField []ManualStruct
|
||||
ManualSliceField ManualSlice
|
||||
}
|
||||
type Struct_Slices_Alias Struct_Slices
|
||||
type Struct_Embed_Struct_Slices struct {
|
||||
Struct_Slices
|
||||
}
|
||||
type Struct_Struct_Slices struct {
|
||||
StructField Struct_Slices
|
||||
}
|
||||
|
||||
// Everything
|
||||
type Struct_Everything struct {
|
||||
BoolField bool
|
||||
IntField int
|
||||
StringField string
|
||||
FloatField float64
|
||||
StructField Struct_Primitives
|
||||
EmptyStructField Struct_Empty
|
||||
ManualStructField ManualStruct
|
||||
ManualStructAliasField ManualStruct_Alias
|
||||
BoolPtrField *bool
|
||||
IntPtrField *int
|
||||
StringPtrField *string
|
||||
FloatPtrField *float64
|
||||
PrimitivePointersField Struct_PrimitivePointers
|
||||
ManualStructPtrField *ManualStruct
|
||||
ManualStructAliasPtrField *ManualStruct_Alias
|
||||
SliceBoolField []bool
|
||||
SliceByteField []byte
|
||||
SliceIntField []int
|
||||
SliceStringField []string
|
||||
SliceFloatField []float64
|
||||
SlicesField Struct_Slices
|
||||
SliceManualStructField []ManualStruct
|
||||
ManualSliceField ManualSlice
|
||||
}
|
||||
|
||||
// An Object
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg.Object
|
||||
type Struct_ExplicitObject struct {
|
||||
x int
|
||||
}
|
||||
|
||||
// An Object which is used a non-pointer
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg.Object
|
||||
// +k8s:deepcopy-gen:nonpointer-interfaces=true
|
||||
type Struct_NonPointerExplicitObject struct {
|
||||
x int
|
||||
}
|
||||
|
||||
// +k8s:deepcopy-gen=false
|
||||
type Struct_TypeMeta struct {
|
||||
}
|
||||
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg.Object
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg.List
|
||||
type Struct_ObjectAndList struct {
|
||||
}
|
||||
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg.Object
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg.Object
|
||||
type Struct_ObjectAndObject struct {
|
||||
}
|
||||
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg.Selector
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg.Object
|
||||
type Struct_ExplicitSelectorExplicitObject struct {
|
||||
Struct_TypeMeta
|
||||
}
|
||||
|
||||
type Struct_Interfaces struct {
|
||||
ObjectField otherpkg.Object
|
||||
NilObjectField otherpkg.Object
|
||||
SelectorField Selector
|
||||
}
|
20
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/b.go
generated
vendored
Normal file
20
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/b.go
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package wholepkg
|
||||
|
||||
// Another type in another file.
|
||||
type Struct_B struct{}
|
145
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/deepcopy_test.go
generated
vendored
Normal file
145
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/deepcopy_test.go
generated
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package wholepkg
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
fuzz "github.com/google/gofuzz"
|
||||
)
|
||||
|
||||
func TestDeepCopyPrimitives(t *testing.T) {
|
||||
x := Struct_Primitives{}
|
||||
y := Struct_Primitives{}
|
||||
|
||||
if !reflect.DeepEqual(&x, &y) {
|
||||
t.Errorf("objects should be equal to start, but are not")
|
||||
}
|
||||
|
||||
fuzzer := fuzz.New()
|
||||
fuzzer.Fuzz(&x)
|
||||
fuzzer.Fuzz(&y)
|
||||
|
||||
if reflect.DeepEqual(&x, &y) {
|
||||
t.Errorf("objects should not be equal, but are")
|
||||
}
|
||||
|
||||
x.DeepCopyInto(&y)
|
||||
if !reflect.DeepEqual(&x, &y) {
|
||||
t.Errorf("objects should be equal, but are not")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeepCopyInterfaceFields(t *testing.T) {
|
||||
x := Struct_Interfaces{}
|
||||
y := Struct_Interfaces{}
|
||||
|
||||
if !reflect.DeepEqual(&x, &y) {
|
||||
t.Errorf("objects should be equal to start, but are not")
|
||||
}
|
||||
|
||||
fuzzer := fuzz.New()
|
||||
|
||||
obj := Struct_ExplicitObject{}
|
||||
fuzzer.Fuzz(&obj)
|
||||
x.ObjectField = &obj
|
||||
|
||||
sel := Struct_ExplicitSelectorExplicitObject{}
|
||||
fuzzer.Fuzz(&sel)
|
||||
x.SelectorField = &sel
|
||||
|
||||
if reflect.DeepEqual(&x, &y) {
|
||||
t.Errorf("objects should not be equal, but are")
|
||||
}
|
||||
|
||||
x.DeepCopyInto(&y)
|
||||
if !reflect.DeepEqual(&x, &y) {
|
||||
t.Errorf("objects should be equal, but are not")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNilCopy(t *testing.T) {
|
||||
var x *Struct_B
|
||||
y := x.DeepCopy()
|
||||
if y != nil {
|
||||
t.Errorf("Expected nil as deepcopy of nil, got %+v", y)
|
||||
}
|
||||
}
|
||||
|
||||
func assertMethod(t *testing.T, typ reflect.Type, name string) {
|
||||
if _, found := typ.MethodByName(name); !found {
|
||||
t.Errorf("Struct_ExplicitObject must have %v method", name)
|
||||
}
|
||||
}
|
||||
|
||||
func assertNotMethod(t *testing.T, typ reflect.Type, name string) {
|
||||
if _, found := typ.MethodByName(name); found {
|
||||
t.Errorf("%v must not have %v method", typ, name)
|
||||
}
|
||||
}
|
||||
|
||||
func TestInterfaceTypes(t *testing.T) {
|
||||
explicitObject := reflect.TypeOf(&Struct_ExplicitObject{})
|
||||
assertMethod(t, explicitObject, "DeepCopyObject")
|
||||
|
||||
typeMeta := reflect.TypeOf(&Struct_TypeMeta{})
|
||||
assertNotMethod(t, typeMeta, "DeepCopy")
|
||||
|
||||
objectAndList := reflect.TypeOf(&Struct_ObjectAndList{})
|
||||
assertMethod(t, objectAndList, "DeepCopyObject")
|
||||
assertMethod(t, objectAndList, "DeepCopyList")
|
||||
|
||||
objectAndObject := reflect.TypeOf(&Struct_ObjectAndObject{})
|
||||
assertMethod(t, objectAndObject, "DeepCopyObject")
|
||||
|
||||
explicitSelectorExplicitObject := reflect.TypeOf(&Struct_ExplicitSelectorExplicitObject{})
|
||||
assertMethod(t, explicitSelectorExplicitObject, "DeepCopySelector")
|
||||
assertMethod(t, explicitSelectorExplicitObject, "DeepCopyObject")
|
||||
}
|
||||
|
||||
func TestInterfaceDeepCopy(t *testing.T) {
|
||||
x := Struct_ExplicitObject{}
|
||||
|
||||
fuzzer := fuzz.New()
|
||||
fuzzer.Fuzz(&x)
|
||||
|
||||
y_obj := x.DeepCopyObject()
|
||||
y, ok := y_obj.(*Struct_ExplicitObject)
|
||||
if !ok {
|
||||
t.Fatalf("epxected Struct_ExplicitObject from Struct_ExplicitObject.DeepCopyObject, got: %t", y_obj)
|
||||
}
|
||||
if !reflect.DeepEqual(y, &x) {
|
||||
t.Error("objects should be equal, but are not")
|
||||
}
|
||||
}
|
||||
|
||||
func TestInterfaceNonPointerDeepCopy(t *testing.T) {
|
||||
x := Struct_NonPointerExplicitObject{}
|
||||
|
||||
fuzzer := fuzz.New()
|
||||
fuzzer.Fuzz(&x)
|
||||
|
||||
y_obj := x.DeepCopyObject()
|
||||
y, ok := y_obj.(Struct_NonPointerExplicitObject)
|
||||
if !ok {
|
||||
t.Fatalf("epxected Struct_NonPointerExplicitObject from Struct_NonPointerExplicitObject.DeepCopyObject, got: %t", y_obj)
|
||||
}
|
||||
if !reflect.DeepEqual(y, x) {
|
||||
t.Error("objects should be equal, but are not")
|
||||
}
|
||||
}
|
20
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/doc.go
generated
vendored
Normal file
20
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/doc.go
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:deepcopy-gen=package
|
||||
|
||||
// This is a test package.
|
||||
package wholepkg
|
21
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/interfaces.go
generated
vendored
Normal file
21
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/interfaces.go
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
Copyright 2017 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package wholepkg
|
||||
|
||||
type Selector interface {
|
||||
DeepCopySelector() Selector
|
||||
}
|
760
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/zz_generated.go
generated
vendored
Normal file
760
vendor/k8s.io/gengo/examples/deepcopy-gen/output_tests/wholepkg/zz_generated.go
generated
vendored
Normal file
@@ -0,0 +1,760 @@
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package wholepkg
|
||||
|
||||
import (
|
||||
otherpkg "k8s.io/gengo/examples/deepcopy-gen/output_tests/otherpkg"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in ManualSlice) DeepCopyInto(out *ManualSlice) {
|
||||
{
|
||||
in := &in
|
||||
*out = in.DeepCopy()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ManualStruct) DeepCopyInto(out *ManualStruct) {
|
||||
*out = in.DeepCopy()
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ManualStruct_Alias) DeepCopyInto(out *ManualStruct_Alias) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManualStruct_Alias.
|
||||
func (in *ManualStruct_Alias) DeepCopy() *ManualStruct_Alias {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ManualStruct_Alias)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_B) DeepCopyInto(out *Struct_B) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_B.
|
||||
func (in *Struct_B) DeepCopy() *Struct_B {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_B)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Embed_Int) DeepCopyInto(out *Struct_Embed_Int) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Embed_Int.
|
||||
func (in *Struct_Embed_Int) DeepCopy() *Struct_Embed_Int {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Embed_Int)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Embed_ManualStruct) DeepCopyInto(out *Struct_Embed_ManualStruct) {
|
||||
*out = *in
|
||||
out.ManualStruct = in.ManualStruct.DeepCopy()
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Embed_ManualStruct.
|
||||
func (in *Struct_Embed_ManualStruct) DeepCopy() *Struct_Embed_ManualStruct {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Embed_ManualStruct)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Embed_Pointer) DeepCopyInto(out *Struct_Embed_Pointer) {
|
||||
*out = *in
|
||||
if in.int != nil {
|
||||
in, out := &in.int, &out.int
|
||||
*out = new(int)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Embed_Pointer.
|
||||
func (in *Struct_Embed_Pointer) DeepCopy() *Struct_Embed_Pointer {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Embed_Pointer)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Embed_Struct_PrimitivePointers) DeepCopyInto(out *Struct_Embed_Struct_PrimitivePointers) {
|
||||
*out = *in
|
||||
in.Struct_PrimitivePointers.DeepCopyInto(&out.Struct_PrimitivePointers)
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Embed_Struct_PrimitivePointers.
|
||||
func (in *Struct_Embed_Struct_PrimitivePointers) DeepCopy() *Struct_Embed_Struct_PrimitivePointers {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Embed_Struct_PrimitivePointers)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Embed_Struct_Primitives) DeepCopyInto(out *Struct_Embed_Struct_Primitives) {
|
||||
*out = *in
|
||||
out.Struct_Primitives = in.Struct_Primitives
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Embed_Struct_Primitives.
|
||||
func (in *Struct_Embed_Struct_Primitives) DeepCopy() *Struct_Embed_Struct_Primitives {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Embed_Struct_Primitives)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Embed_Struct_Slices) DeepCopyInto(out *Struct_Embed_Struct_Slices) {
|
||||
*out = *in
|
||||
in.Struct_Slices.DeepCopyInto(&out.Struct_Slices)
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Embed_Struct_Slices.
|
||||
func (in *Struct_Embed_Struct_Slices) DeepCopy() *Struct_Embed_Struct_Slices {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Embed_Struct_Slices)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Empty) DeepCopyInto(out *Struct_Empty) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Empty.
|
||||
func (in *Struct_Empty) DeepCopy() *Struct_Empty {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Empty)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Everything) DeepCopyInto(out *Struct_Everything) {
|
||||
*out = *in
|
||||
out.StructField = in.StructField
|
||||
out.EmptyStructField = in.EmptyStructField
|
||||
out.ManualStructField = in.ManualStructField.DeepCopy()
|
||||
out.ManualStructAliasField = in.ManualStructAliasField
|
||||
if in.BoolPtrField != nil {
|
||||
in, out := &in.BoolPtrField, &out.BoolPtrField
|
||||
*out = new(bool)
|
||||
**out = **in
|
||||
}
|
||||
if in.IntPtrField != nil {
|
||||
in, out := &in.IntPtrField, &out.IntPtrField
|
||||
*out = new(int)
|
||||
**out = **in
|
||||
}
|
||||
if in.StringPtrField != nil {
|
||||
in, out := &in.StringPtrField, &out.StringPtrField
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
if in.FloatPtrField != nil {
|
||||
in, out := &in.FloatPtrField, &out.FloatPtrField
|
||||
*out = new(float64)
|
||||
**out = **in
|
||||
}
|
||||
in.PrimitivePointersField.DeepCopyInto(&out.PrimitivePointersField)
|
||||
if in.ManualStructPtrField != nil {
|
||||
in, out := &in.ManualStructPtrField, &out.ManualStructPtrField
|
||||
x := (*in).DeepCopy()
|
||||
*out = &x
|
||||
}
|
||||
if in.ManualStructAliasPtrField != nil {
|
||||
in, out := &in.ManualStructAliasPtrField, &out.ManualStructAliasPtrField
|
||||
*out = new(ManualStruct_Alias)
|
||||
**out = **in
|
||||
}
|
||||
if in.SliceBoolField != nil {
|
||||
in, out := &in.SliceBoolField, &out.SliceBoolField
|
||||
*out = make([]bool, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceByteField != nil {
|
||||
in, out := &in.SliceByteField, &out.SliceByteField
|
||||
*out = make([]byte, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceIntField != nil {
|
||||
in, out := &in.SliceIntField, &out.SliceIntField
|
||||
*out = make([]int, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStringField != nil {
|
||||
in, out := &in.SliceStringField, &out.SliceStringField
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceFloatField != nil {
|
||||
in, out := &in.SliceFloatField, &out.SliceFloatField
|
||||
*out = make([]float64, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
in.SlicesField.DeepCopyInto(&out.SlicesField)
|
||||
if in.SliceManualStructField != nil {
|
||||
in, out := &in.SliceManualStructField, &out.SliceManualStructField
|
||||
*out = make([]ManualStruct, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
out.ManualSliceField = in.ManualSliceField.DeepCopy()
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Everything.
|
||||
func (in *Struct_Everything) DeepCopy() *Struct_Everything {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Everything)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_ExplicitObject) DeepCopyInto(out *Struct_ExplicitObject) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_ExplicitObject.
|
||||
func (in *Struct_ExplicitObject) DeepCopy() *Struct_ExplicitObject {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_ExplicitObject)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new otherpkg.Object.
|
||||
func (in *Struct_ExplicitObject) DeepCopyObject() otherpkg.Object {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_ExplicitSelectorExplicitObject) DeepCopyInto(out *Struct_ExplicitSelectorExplicitObject) {
|
||||
*out = *in
|
||||
out.Struct_TypeMeta = in.Struct_TypeMeta
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_ExplicitSelectorExplicitObject.
|
||||
func (in *Struct_ExplicitSelectorExplicitObject) DeepCopy() *Struct_ExplicitSelectorExplicitObject {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_ExplicitSelectorExplicitObject)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new otherpkg.Object.
|
||||
func (in *Struct_ExplicitSelectorExplicitObject) DeepCopyObject() otherpkg.Object {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopySelector is an autogenerated deepcopy function, copying the receiver, creating a new Selector.
|
||||
func (in *Struct_ExplicitSelectorExplicitObject) DeepCopySelector() Selector {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Interfaces) DeepCopyInto(out *Struct_Interfaces) {
|
||||
*out = *in
|
||||
if in.ObjectField != nil {
|
||||
out.ObjectField = in.ObjectField.DeepCopyObject()
|
||||
}
|
||||
if in.NilObjectField != nil {
|
||||
out.NilObjectField = in.NilObjectField.DeepCopyObject()
|
||||
}
|
||||
if in.SelectorField != nil {
|
||||
out.SelectorField = in.SelectorField.DeepCopySelector()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Interfaces.
|
||||
func (in *Struct_Interfaces) DeepCopy() *Struct_Interfaces {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Interfaces)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_NonPointerExplicitObject) DeepCopyInto(out *Struct_NonPointerExplicitObject) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_NonPointerExplicitObject.
|
||||
func (in *Struct_NonPointerExplicitObject) DeepCopy() *Struct_NonPointerExplicitObject {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_NonPointerExplicitObject)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new otherpkg.Object.
|
||||
func (in Struct_NonPointerExplicitObject) DeepCopyObject() otherpkg.Object {
|
||||
return *in.DeepCopy()
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_ObjectAndList) DeepCopyInto(out *Struct_ObjectAndList) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_ObjectAndList.
|
||||
func (in *Struct_ObjectAndList) DeepCopy() *Struct_ObjectAndList {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_ObjectAndList)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyList is an autogenerated deepcopy function, copying the receiver, creating a new otherpkg.List.
|
||||
func (in *Struct_ObjectAndList) DeepCopyList() otherpkg.List {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new otherpkg.Object.
|
||||
func (in *Struct_ObjectAndList) DeepCopyObject() otherpkg.Object {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_ObjectAndObject) DeepCopyInto(out *Struct_ObjectAndObject) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_ObjectAndObject.
|
||||
func (in *Struct_ObjectAndObject) DeepCopy() *Struct_ObjectAndObject {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_ObjectAndObject)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new otherpkg.Object.
|
||||
func (in *Struct_ObjectAndObject) DeepCopyObject() otherpkg.Object {
|
||||
if c := in.DeepCopy(); c != nil {
|
||||
return c
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_PrimitivePointers) DeepCopyInto(out *Struct_PrimitivePointers) {
|
||||
*out = *in
|
||||
if in.BoolPtrField != nil {
|
||||
in, out := &in.BoolPtrField, &out.BoolPtrField
|
||||
*out = new(bool)
|
||||
**out = **in
|
||||
}
|
||||
if in.IntPtrField != nil {
|
||||
in, out := &in.IntPtrField, &out.IntPtrField
|
||||
*out = new(int)
|
||||
**out = **in
|
||||
}
|
||||
if in.StringPtrField != nil {
|
||||
in, out := &in.StringPtrField, &out.StringPtrField
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
if in.FloatPtrField != nil {
|
||||
in, out := &in.FloatPtrField, &out.FloatPtrField
|
||||
*out = new(float64)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_PrimitivePointers.
|
||||
func (in *Struct_PrimitivePointers) DeepCopy() *Struct_PrimitivePointers {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_PrimitivePointers)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_PrimitivePointers_Alias) DeepCopyInto(out *Struct_PrimitivePointers_Alias) {
|
||||
*out = *in
|
||||
if in.BoolPtrField != nil {
|
||||
in, out := &in.BoolPtrField, &out.BoolPtrField
|
||||
*out = new(bool)
|
||||
**out = **in
|
||||
}
|
||||
if in.IntPtrField != nil {
|
||||
in, out := &in.IntPtrField, &out.IntPtrField
|
||||
*out = new(int)
|
||||
**out = **in
|
||||
}
|
||||
if in.StringPtrField != nil {
|
||||
in, out := &in.StringPtrField, &out.StringPtrField
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
if in.FloatPtrField != nil {
|
||||
in, out := &in.FloatPtrField, &out.FloatPtrField
|
||||
*out = new(float64)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_PrimitivePointers_Alias.
|
||||
func (in *Struct_PrimitivePointers_Alias) DeepCopy() *Struct_PrimitivePointers_Alias {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_PrimitivePointers_Alias)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Primitives) DeepCopyInto(out *Struct_Primitives) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Primitives.
|
||||
func (in *Struct_Primitives) DeepCopy() *Struct_Primitives {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Primitives)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Primitives_Alias) DeepCopyInto(out *Struct_Primitives_Alias) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Primitives_Alias.
|
||||
func (in *Struct_Primitives_Alias) DeepCopy() *Struct_Primitives_Alias {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Primitives_Alias)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Slices) DeepCopyInto(out *Struct_Slices) {
|
||||
*out = *in
|
||||
if in.SliceBoolField != nil {
|
||||
in, out := &in.SliceBoolField, &out.SliceBoolField
|
||||
*out = make([]bool, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceByteField != nil {
|
||||
in, out := &in.SliceByteField, &out.SliceByteField
|
||||
*out = make([]byte, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceIntField != nil {
|
||||
in, out := &in.SliceIntField, &out.SliceIntField
|
||||
*out = make([]int, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStringField != nil {
|
||||
in, out := &in.SliceStringField, &out.SliceStringField
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceFloatField != nil {
|
||||
in, out := &in.SliceFloatField, &out.SliceFloatField
|
||||
*out = make([]float64, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStructPrimitivesField != nil {
|
||||
in, out := &in.SliceStructPrimitivesField, &out.SliceStructPrimitivesField
|
||||
*out = make([]Struct_Primitives, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStructPrimitivesAliasField != nil {
|
||||
in, out := &in.SliceStructPrimitivesAliasField, &out.SliceStructPrimitivesAliasField
|
||||
*out = make([]Struct_Primitives_Alias, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStructPrimitivePointersField != nil {
|
||||
in, out := &in.SliceStructPrimitivePointersField, &out.SliceStructPrimitivePointersField
|
||||
*out = make([]Struct_PrimitivePointers, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.SliceStructPrimitivePointersAliasField != nil {
|
||||
in, out := &in.SliceStructPrimitivePointersAliasField, &out.SliceStructPrimitivePointersAliasField
|
||||
*out = make([]Struct_PrimitivePointers_Alias, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.SliceSliceIntField != nil {
|
||||
in, out := &in.SliceSliceIntField, &out.SliceSliceIntField
|
||||
*out = make([][]int, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = make([]int, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.SliceManualStructField != nil {
|
||||
in, out := &in.SliceManualStructField, &out.SliceManualStructField
|
||||
*out = make([]ManualStruct, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
out.ManualSliceField = in.ManualSliceField.DeepCopy()
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Slices.
|
||||
func (in *Struct_Slices) DeepCopy() *Struct_Slices {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Slices)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Slices_Alias) DeepCopyInto(out *Struct_Slices_Alias) {
|
||||
*out = *in
|
||||
if in.SliceBoolField != nil {
|
||||
in, out := &in.SliceBoolField, &out.SliceBoolField
|
||||
*out = make([]bool, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceByteField != nil {
|
||||
in, out := &in.SliceByteField, &out.SliceByteField
|
||||
*out = make([]byte, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceIntField != nil {
|
||||
in, out := &in.SliceIntField, &out.SliceIntField
|
||||
*out = make([]int, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStringField != nil {
|
||||
in, out := &in.SliceStringField, &out.SliceStringField
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceFloatField != nil {
|
||||
in, out := &in.SliceFloatField, &out.SliceFloatField
|
||||
*out = make([]float64, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStructPrimitivesField != nil {
|
||||
in, out := &in.SliceStructPrimitivesField, &out.SliceStructPrimitivesField
|
||||
*out = make([]Struct_Primitives, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStructPrimitivesAliasField != nil {
|
||||
in, out := &in.SliceStructPrimitivesAliasField, &out.SliceStructPrimitivesAliasField
|
||||
*out = make([]Struct_Primitives_Alias, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.SliceStructPrimitivePointersField != nil {
|
||||
in, out := &in.SliceStructPrimitivePointersField, &out.SliceStructPrimitivePointersField
|
||||
*out = make([]Struct_PrimitivePointers, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.SliceStructPrimitivePointersAliasField != nil {
|
||||
in, out := &in.SliceStructPrimitivePointersAliasField, &out.SliceStructPrimitivePointersAliasField
|
||||
*out = make([]Struct_PrimitivePointers_Alias, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.SliceSliceIntField != nil {
|
||||
in, out := &in.SliceSliceIntField, &out.SliceSliceIntField
|
||||
*out = make([][]int, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = make([]int, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.SliceManualStructField != nil {
|
||||
in, out := &in.SliceManualStructField, &out.SliceManualStructField
|
||||
*out = make([]ManualStruct, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
out.ManualSliceField = in.ManualSliceField.DeepCopy()
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Slices_Alias.
|
||||
func (in *Struct_Slices_Alias) DeepCopy() *Struct_Slices_Alias {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Slices_Alias)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Struct_PrimitivePointers) DeepCopyInto(out *Struct_Struct_PrimitivePointers) {
|
||||
*out = *in
|
||||
in.StructField.DeepCopyInto(&out.StructField)
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Struct_PrimitivePointers.
|
||||
func (in *Struct_Struct_PrimitivePointers) DeepCopy() *Struct_Struct_PrimitivePointers {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Struct_PrimitivePointers)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Struct_Primitives) DeepCopyInto(out *Struct_Struct_Primitives) {
|
||||
*out = *in
|
||||
out.StructField = in.StructField
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Struct_Primitives.
|
||||
func (in *Struct_Struct_Primitives) DeepCopy() *Struct_Struct_Primitives {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Struct_Primitives)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Struct_Struct_Slices) DeepCopyInto(out *Struct_Struct_Slices) {
|
||||
*out = *in
|
||||
in.StructField.DeepCopyInto(&out.StructField)
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Struct_Struct_Slices.
|
||||
func (in *Struct_Struct_Slices) DeepCopy() *Struct_Struct_Slices {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Struct_Struct_Slices)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
Reference in New Issue
Block a user