mirror of
https://github.com/openshift/installer.git
synced 2026-02-05 06:46:36 +01:00
Add generated DeepCopy implementations for pkg/types/installconfig
This commit is contained in:
2
go.mod
2
go.mod
@@ -132,6 +132,7 @@ require (
|
||||
k8s.io/apimachinery v0.34.1
|
||||
k8s.io/client-go v0.34.1
|
||||
k8s.io/cloud-provider-vsphere v1.31.0
|
||||
k8s.io/code-generator v0.34.1
|
||||
k8s.io/klog v1.0.0
|
||||
k8s.io/klog/v2 v2.130.1
|
||||
k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d
|
||||
@@ -347,6 +348,7 @@ require (
|
||||
k8s.io/cli-runtime v0.33.4 // indirect
|
||||
k8s.io/cluster-bootstrap v0.33.3 // indirect
|
||||
k8s.io/component-base v0.34.1 // indirect
|
||||
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
|
||||
k8s.io/kubectl v0.33.4 // indirect
|
||||
sigs.k8s.io/kustomize/api v0.19.0 // indirect
|
||||
|
||||
4
go.sum
4
go.sum
@@ -1172,10 +1172,14 @@ k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8=
|
||||
k8s.io/cluster-bootstrap v0.33.3 h1:u2NTxJ5CFSBFXaDxLQoOWMly8eni31psVso+caq6uwI=
|
||||
k8s.io/cluster-bootstrap v0.33.3/go.mod h1:p970f8u8jf273zyQ5raD8WUu2XyAl0SAWOY82o7i/ds=
|
||||
k8s.io/code-generator v0.23.3/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk=
|
||||
k8s.io/code-generator v0.34.1 h1:WpphT26E+j7tEgIUfFr5WfbJrktCGzB3JoJH9149xYc=
|
||||
k8s.io/code-generator v0.34.1/go.mod h1:DeWjekbDnJWRwpw3s0Jat87c+e0TgkxoR4ar608yqvg=
|
||||
k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A=
|
||||
k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0=
|
||||
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q=
|
||||
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
|
||||
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
|
||||
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
|
||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
||||
|
||||
@@ -95,3 +95,22 @@ func MustParseCIDR(s string) *IPNet {
|
||||
}
|
||||
return cidr
|
||||
}
|
||||
|
||||
// DeepCopyInto copies the receiver into out. out must be non-nil.
|
||||
func (ipnet *IPNet) DeepCopyInto(out *IPNet) {
|
||||
if ipnet == nil {
|
||||
*out = IPNet{}
|
||||
} else {
|
||||
*out = *ipnet
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy copies the receiver, creating a new IPNet.
|
||||
func (ipnet *IPNet) DeepCopy() *IPNet {
|
||||
if ipnet == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(IPNet)
|
||||
ipnet.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
@@ -56,3 +56,36 @@ func TestUnmarshal(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeepCopy(t *testing.T) {
|
||||
for _, ipNetIn := range []*IPNet{
|
||||
{},
|
||||
{IPNet: net.IPNet{
|
||||
IP: net.IP{192, 168, 0, 10},
|
||||
Mask: net.IPv4Mask(255, 255, 255, 0),
|
||||
}},
|
||||
} {
|
||||
t.Run(ipNetIn.String(), func(t *testing.T) {
|
||||
t.Run("DeepCopyInto", func(t *testing.T) {
|
||||
ipNetOut := &IPNet{}
|
||||
ipNetIn.DeepCopyInto(ipNetOut)
|
||||
if ipNetOut.String() != ipNetIn.String() {
|
||||
t.Fatalf("%v != %v", ipNetOut, ipNetIn)
|
||||
}
|
||||
if ipNetOut == ipNetIn {
|
||||
t.Fatalf("DeepCopyInto did not deep copy (pointers are equal)")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("DeepCopy", func(t *testing.T) {
|
||||
ipNetOut := ipNetIn.DeepCopy()
|
||||
if ipNetOut.String() != ipNetIn.String() {
|
||||
t.Fatalf("%v != %v", ipNetOut, ipNetIn)
|
||||
}
|
||||
if ipNetOut == ipNetIn {
|
||||
t.Fatalf("DeepCopy did not deep copy (pointers are equal)")
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package aws contains AWS-specific structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package aws
|
||||
|
||||
// Name is name for the AWS platform.
|
||||
|
||||
215
pkg/types/aws/zz_generated.deepcopy.go
Normal file
215
pkg/types/aws/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,215 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package aws
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *EC2Metadata) DeepCopyInto(out *EC2Metadata) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EC2Metadata.
|
||||
func (in *EC2Metadata) DeepCopy() *EC2Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(EC2Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *EC2RootVolume) DeepCopyInto(out *EC2RootVolume) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EC2RootVolume.
|
||||
func (in *EC2RootVolume) DeepCopy() *EC2RootVolume {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(EC2RootVolume)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
if in.Zones != nil {
|
||||
in, out := &in.Zones, &out.Zones
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
out.EC2RootVolume = in.EC2RootVolume
|
||||
out.EC2Metadata = in.EC2Metadata
|
||||
if in.AdditionalSecurityGroupIDs != nil {
|
||||
in, out := &in.AdditionalSecurityGroupIDs, &out.AdditionalSecurityGroupIDs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
if in.ServiceEndpoints != nil {
|
||||
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
|
||||
*out = make([]ServiceEndpoint, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Identifier != nil {
|
||||
in, out := &in.Identifier, &out.Identifier
|
||||
*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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.DeprecatedSubnets != nil {
|
||||
in, out := &in.DeprecatedSubnets, &out.DeprecatedSubnets
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
in.VPC.DeepCopyInto(&out.VPC)
|
||||
if in.UserTags != nil {
|
||||
in, out := &in.UserTags, &out.UserTags
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.ServiceEndpoints != nil {
|
||||
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
|
||||
*out = make([]ServiceEndpoint, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ServiceEndpoint) DeepCopyInto(out *ServiceEndpoint) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceEndpoint.
|
||||
func (in *ServiceEndpoint) DeepCopy() *ServiceEndpoint {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ServiceEndpoint)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Subnet) DeepCopyInto(out *Subnet) {
|
||||
*out = *in
|
||||
if in.Roles != nil {
|
||||
in, out := &in.Roles, &out.Roles
|
||||
*out = make([]SubnetRole, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Subnet.
|
||||
func (in *Subnet) DeepCopy() *Subnet {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Subnet)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *SubnetRole) DeepCopyInto(out *SubnetRole) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubnetRole.
|
||||
func (in *SubnetRole) DeepCopy() *SubnetRole {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(SubnetRole)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *VPC) DeepCopyInto(out *VPC) {
|
||||
*out = *in
|
||||
if in.Subnets != nil {
|
||||
in, out := &in.Subnets, &out.Subnets
|
||||
*out = make([]Subnet, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VPC.
|
||||
func (in *VPC) DeepCopy() *VPC {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(VPC)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package azure contains Azure-specific structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package azure
|
||||
|
||||
// Name is the name for the Azure platform.
|
||||
|
||||
363
pkg/types/azure/zz_generated.deepcopy.go
Normal file
363
pkg/types/azure/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,363 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package azure
|
||||
|
||||
import (
|
||||
v1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *BootDiagnostics) DeepCopyInto(out *BootDiagnostics) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BootDiagnostics.
|
||||
func (in *BootDiagnostics) DeepCopy() *BootDiagnostics {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(BootDiagnostics)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ConfidentialVM) DeepCopyInto(out *ConfidentialVM) {
|
||||
*out = *in
|
||||
if in.UEFISettings != nil {
|
||||
in, out := &in.UEFISettings, &out.UEFISettings
|
||||
*out = new(UEFISettings)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfidentialVM.
|
||||
func (in *ConfidentialVM) DeepCopy() *ConfidentialVM {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ConfidentialVM)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *CustomerManagedKey) DeepCopyInto(out *CustomerManagedKey) {
|
||||
*out = *in
|
||||
out.KeyVault = in.KeyVault
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomerManagedKey.
|
||||
func (in *CustomerManagedKey) DeepCopy() *CustomerManagedKey {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(CustomerManagedKey)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DiskEncryptionSet) DeepCopyInto(out *DiskEncryptionSet) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskEncryptionSet.
|
||||
func (in *DiskEncryptionSet) DeepCopy() *DiskEncryptionSet {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DiskEncryptionSet)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *KeyVault) DeepCopyInto(out *KeyVault) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeyVault.
|
||||
func (in *KeyVault) DeepCopy() *KeyVault {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(KeyVault)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
if in.Zones != nil {
|
||||
in, out := &in.Zones, &out.Zones
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
in.OSDisk.DeepCopyInto(&out.OSDisk)
|
||||
if in.BootDiagnostics != nil {
|
||||
in, out := &in.BootDiagnostics, &out.BootDiagnostics
|
||||
*out = new(BootDiagnostics)
|
||||
**out = **in
|
||||
}
|
||||
out.OSImage = in.OSImage
|
||||
if in.Settings != nil {
|
||||
in, out := &in.Settings, &out.Settings
|
||||
*out = new(SecuritySettings)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Identity != nil {
|
||||
in, out := &in.Identity, &out.Identity
|
||||
*out = new(VMIdentity)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.DataDisks != nil {
|
||||
in, out := &in.DataDisks, &out.DataDisks
|
||||
*out = make([]v1beta1.DataDisk, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *OSDisk) DeepCopyInto(out *OSDisk) {
|
||||
*out = *in
|
||||
if in.DiskEncryptionSet != nil {
|
||||
in, out := &in.DiskEncryptionSet, &out.DiskEncryptionSet
|
||||
*out = new(DiskEncryptionSet)
|
||||
**out = **in
|
||||
}
|
||||
if in.SecurityProfile != nil {
|
||||
in, out := &in.SecurityProfile, &out.SecurityProfile
|
||||
*out = new(VMDiskSecurityProfile)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSDisk.
|
||||
func (in *OSDisk) DeepCopy() *OSDisk {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(OSDisk)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *OSImage) DeepCopyInto(out *OSImage) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSImage.
|
||||
func (in *OSImage) DeepCopy() *OSImage {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(OSImage)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.UserTags != nil {
|
||||
in, out := &in.UserTags, &out.UserTags
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.CustomerManagedKey != nil {
|
||||
in, out := &in.CustomerManagedKey, &out.CustomerManagedKey
|
||||
*out = new(CustomerManagedKey)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *SecuritySettings) DeepCopyInto(out *SecuritySettings) {
|
||||
*out = *in
|
||||
if in.ConfidentialVM != nil {
|
||||
in, out := &in.ConfidentialVM, &out.ConfidentialVM
|
||||
*out = new(ConfidentialVM)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.TrustedLaunch != nil {
|
||||
in, out := &in.TrustedLaunch, &out.TrustedLaunch
|
||||
*out = new(TrustedLaunch)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecuritySettings.
|
||||
func (in *SecuritySettings) DeepCopy() *SecuritySettings {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(SecuritySettings)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *TrustedLaunch) DeepCopyInto(out *TrustedLaunch) {
|
||||
*out = *in
|
||||
if in.UEFISettings != nil {
|
||||
in, out := &in.UEFISettings, &out.UEFISettings
|
||||
*out = new(UEFISettings)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrustedLaunch.
|
||||
func (in *TrustedLaunch) DeepCopy() *TrustedLaunch {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(TrustedLaunch)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *UEFISettings) DeepCopyInto(out *UEFISettings) {
|
||||
*out = *in
|
||||
if in.SecureBoot != nil {
|
||||
in, out := &in.SecureBoot, &out.SecureBoot
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
if in.VirtualizedTrustedPlatformModule != nil {
|
||||
in, out := &in.VirtualizedTrustedPlatformModule, &out.VirtualizedTrustedPlatformModule
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UEFISettings.
|
||||
func (in *UEFISettings) DeepCopy() *UEFISettings {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(UEFISettings)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *UserAssignedIdentity) DeepCopyInto(out *UserAssignedIdentity) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserAssignedIdentity.
|
||||
func (in *UserAssignedIdentity) DeepCopy() *UserAssignedIdentity {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(UserAssignedIdentity)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *VMDiskSecurityProfile) DeepCopyInto(out *VMDiskSecurityProfile) {
|
||||
*out = *in
|
||||
if in.DiskEncryptionSet != nil {
|
||||
in, out := &in.DiskEncryptionSet, &out.DiskEncryptionSet
|
||||
*out = new(DiskEncryptionSet)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VMDiskSecurityProfile.
|
||||
func (in *VMDiskSecurityProfile) DeepCopy() *VMDiskSecurityProfile {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(VMDiskSecurityProfile)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *VMIdentity) DeepCopyInto(out *VMIdentity) {
|
||||
*out = *in
|
||||
if in.UserAssignedIdentities != nil {
|
||||
in, out := &in.UserAssignedIdentities, &out.UserAssignedIdentities
|
||||
*out = make([]UserAssignedIdentity, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VMIdentity.
|
||||
func (in *VMIdentity) DeepCopy() *VMIdentity {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(VMIdentity)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package baremetal contains baremetal-specific structures for
|
||||
// installer configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package baremetal
|
||||
|
||||
// Name is the name for the baremetal platform.
|
||||
|
||||
163
pkg/types/baremetal/zz_generated.deepcopy.go
Normal file
163
pkg/types/baremetal/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,163 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package baremetal
|
||||
|
||||
import (
|
||||
configv1 "github.com/openshift/api/config/v1"
|
||||
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *BMC) DeepCopyInto(out *BMC) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BMC.
|
||||
func (in *BMC) DeepCopy() *BMC {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(BMC)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Host) DeepCopyInto(out *Host) {
|
||||
*out = *in
|
||||
out.BMC = in.BMC
|
||||
if in.RootDeviceHints != nil {
|
||||
in, out := &in.RootDeviceHints, &out.RootDeviceHints
|
||||
*out = new(RootDeviceHints)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.NetworkConfig != nil {
|
||||
in, out := &in.NetworkConfig, &out.NetworkConfig
|
||||
*out = new(v1.JSON)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Host.
|
||||
func (in *Host) DeepCopy() *Host {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Host)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.ProvisioningNetworkCIDR != nil {
|
||||
in, out := &in.ProvisioningNetworkCIDR, &out.ProvisioningNetworkCIDR
|
||||
*out = (*in).DeepCopy()
|
||||
}
|
||||
if in.Hosts != nil {
|
||||
in, out := &in.Hosts, &out.Hosts
|
||||
*out = make([]*Host, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Host)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
**out = **in
|
||||
}
|
||||
if in.APIVIPs != nil {
|
||||
in, out := &in.APIVIPs, &out.APIVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.IngressVIPs != nil {
|
||||
in, out := &in.IngressVIPs, &out.IngressVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.LoadBalancer != nil {
|
||||
in, out := &in.LoadBalancer, &out.LoadBalancer
|
||||
*out = new(configv1.BareMetalPlatformLoadBalancer)
|
||||
**out = **in
|
||||
}
|
||||
if in.AdditionalNTPServers != nil {
|
||||
in, out := &in.AdditionalNTPServers, &out.AdditionalNTPServers
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *RootDeviceHints) DeepCopyInto(out *RootDeviceHints) {
|
||||
*out = *in
|
||||
if in.Rotational != nil {
|
||||
in, out := &in.Rotational, &out.Rotational
|
||||
*out = new(bool)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RootDeviceHints.
|
||||
func (in *RootDeviceHints) DeepCopy() *RootDeviceHints {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(RootDeviceHints)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -3,4 +3,5 @@
|
||||
|
||||
// Package types defines structures for installer configuration and
|
||||
// management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package types
|
||||
|
||||
3
pkg/types/external/doc.go
vendored
3
pkg/types/external/doc.go
vendored
@@ -1,5 +1,6 @@
|
||||
// Package none contains generic structures for installer
|
||||
// Package external contains generic structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package external
|
||||
|
||||
// Name is name for the External platform.
|
||||
|
||||
22
pkg/types/external/zz_generated.deepcopy.go
vendored
Normal file
22
pkg/types/external/zz_generated.deepcopy.go
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package external
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package gcp contains GCP-specific structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package gcp
|
||||
|
||||
// Name is name for the gcp platform.
|
||||
|
||||
346
pkg/types/gcp/zz_generated.deepcopy.go
Normal file
346
pkg/types/gcp/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,346 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package gcp
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DNS) DeepCopyInto(out *DNS) {
|
||||
*out = *in
|
||||
if in.PrivateZone != nil {
|
||||
in, out := &in.PrivateZone, &out.PrivateZone
|
||||
*out = new(DNSZone)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNS.
|
||||
func (in *DNS) DeepCopy() *DNS {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DNS)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DNSZone) DeepCopyInto(out *DNSZone) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSZone.
|
||||
func (in *DNSZone) DeepCopy() *DNSZone {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DNSZone)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DNSZoneParams) DeepCopyInto(out *DNSZoneParams) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSZoneParams.
|
||||
func (in *DNSZoneParams) DeepCopy() *DNSZoneParams {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DNSZoneParams)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *EncryptionKeyReference) DeepCopyInto(out *EncryptionKeyReference) {
|
||||
*out = *in
|
||||
if in.KMSKey != nil {
|
||||
in, out := &in.KMSKey, &out.KMSKey
|
||||
*out = new(KMSKeyReference)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EncryptionKeyReference.
|
||||
func (in *EncryptionKeyReference) DeepCopy() *EncryptionKeyReference {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(EncryptionKeyReference)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *KMSKeyReference) DeepCopyInto(out *KMSKeyReference) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KMSKeyReference.
|
||||
func (in *KMSKeyReference) DeepCopy() *KMSKeyReference {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(KMSKeyReference)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
if in.Zones != nil {
|
||||
in, out := &in.Zones, &out.Zones
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
in.OSDisk.DeepCopyInto(&out.OSDisk)
|
||||
if in.OSImage != nil {
|
||||
in, out := &in.OSImage, &out.OSImage
|
||||
*out = new(OSImage)
|
||||
**out = **in
|
||||
}
|
||||
if in.Tags != nil {
|
||||
in, out := &in.Tags, &out.Tags
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
if in.Endpoint != nil {
|
||||
in, out := &in.Endpoint, &out.Endpoint
|
||||
*out = new(PSCEndpoint)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metric) DeepCopyInto(out *Metric) {
|
||||
*out = *in
|
||||
if in.Dimensions != nil {
|
||||
in, out := &in.Dimensions, &out.Dimensions
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metric.
|
||||
func (in *Metric) DeepCopy() *Metric {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metric)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *OSDisk) DeepCopyInto(out *OSDisk) {
|
||||
*out = *in
|
||||
if in.EncryptionKey != nil {
|
||||
in, out := &in.EncryptionKey, &out.EncryptionKey
|
||||
*out = new(EncryptionKeyReference)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSDisk.
|
||||
func (in *OSDisk) DeepCopy() *OSDisk {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(OSDisk)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *OSImage) DeepCopyInto(out *OSImage) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSImage.
|
||||
func (in *OSImage) DeepCopy() *OSImage {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(OSImage)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PSCEndpoint) DeepCopyInto(out *PSCEndpoint) {
|
||||
*out = *in
|
||||
if in.ClusterUseOnly != nil {
|
||||
in, out := &in.ClusterUseOnly, &out.ClusterUseOnly
|
||||
*out = new(bool)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PSCEndpoint.
|
||||
func (in *PSCEndpoint) DeepCopy() *PSCEndpoint {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(PSCEndpoint)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.UserLabels != nil {
|
||||
in, out := &in.UserLabels, &out.UserLabels
|
||||
*out = make([]UserLabel, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.UserTags != nil {
|
||||
in, out := &in.UserTags, &out.UserTags
|
||||
*out = make([]UserTag, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Endpoint != nil {
|
||||
in, out := &in.Endpoint, &out.Endpoint
|
||||
*out = new(PSCEndpoint)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.DNS != nil {
|
||||
in, out := &in.DNS, &out.DNS
|
||||
*out = new(DNS)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in Quota) DeepCopyInto(out *Quota) {
|
||||
{
|
||||
in := &in
|
||||
*out = make(Quota, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Quota.
|
||||
func (in Quota) DeepCopy() Quota {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Quota)
|
||||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *QuotaUsage) DeepCopyInto(out *QuotaUsage) {
|
||||
*out = *in
|
||||
if in.Metric != nil {
|
||||
in, out := &in.Metric, &out.Metric
|
||||
*out = new(Metric)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QuotaUsage.
|
||||
func (in *QuotaUsage) DeepCopy() *QuotaUsage {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(QuotaUsage)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *UserLabel) DeepCopyInto(out *UserLabel) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserLabel.
|
||||
func (in *UserLabel) DeepCopy() *UserLabel {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(UserLabel)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *UserTag) DeepCopyInto(out *UserTag) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserTag.
|
||||
func (in *UserTag) DeepCopy() *UserTag {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(UserTag)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package ibmcloud contains IBM Cloud-specific structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package ibmcloud
|
||||
|
||||
// Name is name for the ibmcloud platform.
|
||||
|
||||
246
pkg/types/ibmcloud/zz_generated.deepcopy.go
Normal file
246
pkg/types/ibmcloud/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,246 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package ibmcloud
|
||||
|
||||
import (
|
||||
v1 "github.com/openshift/api/config/v1"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *BootVolume) DeepCopyInto(out *BootVolume) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BootVolume.
|
||||
func (in *BootVolume) DeepCopy() *BootVolume {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(BootVolume)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DedicatedHost) DeepCopyInto(out *DedicatedHost) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DedicatedHost.
|
||||
func (in *DedicatedHost) DeepCopy() *DedicatedHost {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DedicatedHost)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *EndpointsJSON) DeepCopyInto(out *EndpointsJSON) {
|
||||
*out = *in
|
||||
if in.IBMCloudEndpointCIS != nil {
|
||||
in, out := &in.IBMCloudEndpointCIS, &out.IBMCloudEndpointCIS
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointCOS != nil {
|
||||
in, out := &in.IBMCloudEndpointCOS, &out.IBMCloudEndpointCOS
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointCOSConfig != nil {
|
||||
in, out := &in.IBMCloudEndpointCOSConfig, &out.IBMCloudEndpointCOSConfig
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointDNSServices != nil {
|
||||
in, out := &in.IBMCloudEndpointDNSServices, &out.IBMCloudEndpointDNSServices
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointGlobalCatalog != nil {
|
||||
in, out := &in.IBMCloudEndpointGlobalCatalog, &out.IBMCloudEndpointGlobalCatalog
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointGlobalSearch != nil {
|
||||
in, out := &in.IBMCloudEndpointGlobalSearch, &out.IBMCloudEndpointGlobalSearch
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointGlobalTagging != nil {
|
||||
in, out := &in.IBMCloudEndpointGlobalTagging, &out.IBMCloudEndpointGlobalTagging
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointHyperProtect != nil {
|
||||
in, out := &in.IBMCloudEndpointHyperProtect, &out.IBMCloudEndpointHyperProtect
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointIAM != nil {
|
||||
in, out := &in.IBMCloudEndpointIAM, &out.IBMCloudEndpointIAM
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointKeyProtect != nil {
|
||||
in, out := &in.IBMCloudEndpointKeyProtect, &out.IBMCloudEndpointKeyProtect
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointResourceController != nil {
|
||||
in, out := &in.IBMCloudEndpointResourceController, &out.IBMCloudEndpointResourceController
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointResourceManager != nil {
|
||||
in, out := &in.IBMCloudEndpointResourceManager, &out.IBMCloudEndpointResourceManager
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloudEndpointVPC != nil {
|
||||
in, out := &in.IBMCloudEndpointVPC, &out.IBMCloudEndpointVPC
|
||||
*out = new(EndpointsVisibility)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointsJSON.
|
||||
func (in *EndpointsJSON) DeepCopy() *EndpointsJSON {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(EndpointsJSON)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *EndpointsVisibility) DeepCopyInto(out *EndpointsVisibility) {
|
||||
*out = *in
|
||||
if in.Private != nil {
|
||||
in, out := &in.Private, &out.Private
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.Public != nil {
|
||||
in, out := &in.Public, &out.Public
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointsVisibility.
|
||||
func (in *EndpointsVisibility) DeepCopy() *EndpointsVisibility {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(EndpointsVisibility)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
if in.Zones != nil {
|
||||
in, out := &in.Zones, &out.Zones
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.BootVolume != nil {
|
||||
in, out := &in.BootVolume, &out.BootVolume
|
||||
*out = new(BootVolume)
|
||||
**out = **in
|
||||
}
|
||||
if in.DedicatedHosts != nil {
|
||||
in, out := &in.DedicatedHosts, &out.DedicatedHosts
|
||||
*out = make([]DedicatedHost, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
if in.ServiceEndpoints != nil {
|
||||
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
|
||||
*out = make([]v1.IBMCloudServiceEndpoint, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Subnets != nil {
|
||||
in, out := &in.Subnets, &out.Subnets
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.ControlPlaneSubnets != nil {
|
||||
in, out := &in.ControlPlaneSubnets, &out.ControlPlaneSubnets
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.ComputeSubnets != nil {
|
||||
in, out := &in.ComputeSubnets, &out.ComputeSubnets
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.ServiceEndpoints != nil {
|
||||
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
|
||||
*out = make([]v1.IBMCloudServiceEndpoint, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -86,6 +86,7 @@ const (
|
||||
)
|
||||
|
||||
//go:generate go run ../../vendor/sigs.k8s.io/controller-tools/cmd/controller-gen crd:crdVersions=v1 paths=. output:dir=../../data/data/
|
||||
//go:generate go run ../../vendor/k8s.io/code-generator/cmd/deepcopy-gen --output-file zz_generated.deepcopy.go ./...
|
||||
|
||||
// InstallConfig is the configuration for an OpenShift install.
|
||||
type InstallConfig struct {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package none contains generic structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package none
|
||||
|
||||
// Name is name for the None platform.
|
||||
|
||||
22
pkg/types/none/zz_generated.deepcopy.go
Normal file
22
pkg/types/none/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,22 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package none
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package nutanix contains Nutanix-specific structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package nutanix
|
||||
|
||||
// Name is the platform in the package
|
||||
|
||||
299
pkg/types/nutanix/zz_generated.deepcopy.go
Normal file
299
pkg/types/nutanix/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,299 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package nutanix
|
||||
|
||||
import (
|
||||
configv1 "github.com/openshift/api/config/v1"
|
||||
v1 "github.com/openshift/api/machine/v1"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DataDisk) DeepCopyInto(out *DataDisk) {
|
||||
*out = *in
|
||||
out.DiskSize = in.DiskSize.DeepCopy()
|
||||
if in.DeviceProperties != nil {
|
||||
in, out := &in.DeviceProperties, &out.DeviceProperties
|
||||
*out = new(v1.NutanixVMDiskDeviceProperties)
|
||||
**out = **in
|
||||
}
|
||||
if in.StorageConfig != nil {
|
||||
in, out := &in.StorageConfig, &out.StorageConfig
|
||||
*out = new(StorageConfig)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.DataSourceImage != nil {
|
||||
in, out := &in.DataSourceImage, &out.DataSourceImage
|
||||
*out = new(StorageResourceReference)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DataDisk.
|
||||
func (in *DataDisk) DeepCopy() *DataDisk {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DataDisk)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *FailureDomain) DeepCopyInto(out *FailureDomain) {
|
||||
*out = *in
|
||||
out.PrismElement = in.PrismElement
|
||||
if in.SubnetUUIDs != nil {
|
||||
in, out := &in.SubnetUUIDs, &out.SubnetUUIDs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.StorageContainers != nil {
|
||||
in, out := &in.StorageContainers, &out.StorageContainers
|
||||
*out = make([]StorageResourceReference, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.DataSourceImages != nil {
|
||||
in, out := &in.DataSourceImages, &out.DataSourceImages
|
||||
*out = make([]StorageResourceReference, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FailureDomain.
|
||||
func (in *FailureDomain) DeepCopy() *FailureDomain {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(FailureDomain)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
out.OSDisk = in.OSDisk
|
||||
if in.Project != nil {
|
||||
in, out := &in.Project, &out.Project
|
||||
*out = new(v1.NutanixResourceIdentifier)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Categories != nil {
|
||||
in, out := &in.Categories, &out.Categories
|
||||
*out = make([]v1.NutanixCategory, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.GPUs != nil {
|
||||
in, out := &in.GPUs, &out.GPUs
|
||||
*out = make([]v1.NutanixGPU, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.DataDisks != nil {
|
||||
in, out := &in.DataDisks, &out.DataDisks
|
||||
*out = make([]DataDisk, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.FailureDomains != nil {
|
||||
in, out := &in.FailureDomains, &out.FailureDomains
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *OSDisk) DeepCopyInto(out *OSDisk) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSDisk.
|
||||
func (in *OSDisk) DeepCopy() *OSDisk {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(OSDisk)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
out.PrismCentral = in.PrismCentral
|
||||
if in.PrismElements != nil {
|
||||
in, out := &in.PrismElements, &out.PrismElements
|
||||
*out = make([]PrismElement, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.APIVIPs != nil {
|
||||
in, out := &in.APIVIPs, &out.APIVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.IngressVIPs != nil {
|
||||
in, out := &in.IngressVIPs, &out.IngressVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.SubnetUUIDs != nil {
|
||||
in, out := &in.SubnetUUIDs, &out.SubnetUUIDs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.LoadBalancer != nil {
|
||||
in, out := &in.LoadBalancer, &out.LoadBalancer
|
||||
*out = new(configv1.NutanixPlatformLoadBalancer)
|
||||
**out = **in
|
||||
}
|
||||
if in.FailureDomains != nil {
|
||||
in, out := &in.FailureDomains, &out.FailureDomains
|
||||
*out = make([]FailureDomain, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.PrismAPICallTimeout != nil {
|
||||
in, out := &in.PrismAPICallTimeout, &out.PrismAPICallTimeout
|
||||
*out = new(int)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PrismCentral) DeepCopyInto(out *PrismCentral) {
|
||||
*out = *in
|
||||
out.Endpoint = in.Endpoint
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrismCentral.
|
||||
func (in *PrismCentral) DeepCopy() *PrismCentral {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(PrismCentral)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PrismElement) DeepCopyInto(out *PrismElement) {
|
||||
*out = *in
|
||||
out.Endpoint = in.Endpoint
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrismElement.
|
||||
func (in *PrismElement) DeepCopy() *PrismElement {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(PrismElement)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PrismEndpoint) DeepCopyInto(out *PrismEndpoint) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrismEndpoint.
|
||||
func (in *PrismEndpoint) DeepCopy() *PrismEndpoint {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(PrismEndpoint)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *StorageConfig) DeepCopyInto(out *StorageConfig) {
|
||||
*out = *in
|
||||
if in.StorageContainer != nil {
|
||||
in, out := &in.StorageContainer, &out.StorageContainer
|
||||
*out = new(StorageResourceReference)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageConfig.
|
||||
func (in *StorageConfig) DeepCopy() *StorageConfig {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(StorageConfig)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *StorageResourceReference) DeepCopyInto(out *StorageResourceReference) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageResourceReference.
|
||||
func (in *StorageResourceReference) DeepCopy() *StorageResourceReference {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(StorageResourceReference)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package openstack contains OpenStack-specific structures for
|
||||
// installer configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package openstack
|
||||
|
||||
// Name is the name for the Openstack platform.
|
||||
|
||||
219
pkg/types/openstack/zz_generated.deepcopy.go
Normal file
219
pkg/types/openstack/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,219 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package openstack
|
||||
|
||||
import (
|
||||
v1 "github.com/openshift/api/config/v1"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *FixedIP) DeepCopyInto(out *FixedIP) {
|
||||
*out = *in
|
||||
out.Subnet = in.Subnet
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FixedIP.
|
||||
func (in *FixedIP) DeepCopy() *FixedIP {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(FixedIP)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
if in.RootVolume != nil {
|
||||
in, out := &in.RootVolume, &out.RootVolume
|
||||
*out = new(RootVolume)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.AdditionalNetworkIDs != nil {
|
||||
in, out := &in.AdditionalNetworkIDs, &out.AdditionalNetworkIDs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.AdditionalSecurityGroupIDs != nil {
|
||||
in, out := &in.AdditionalSecurityGroupIDs, &out.AdditionalSecurityGroupIDs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Zones != nil {
|
||||
in, out := &in.Zones, &out.Zones
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
if in.Identifier != nil {
|
||||
in, out := &in.Identifier, &out.Identifier
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *NetworkFilter) DeepCopyInto(out *NetworkFilter) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkFilter.
|
||||
func (in *NetworkFilter) DeepCopy() *NetworkFilter {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(NetworkFilter)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.ExternalDNS != nil {
|
||||
in, out := &in.ExternalDNS, &out.ExternalDNS
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.ClusterOSImageProperties != nil {
|
||||
in, out := &in.ClusterOSImageProperties, &out.ClusterOSImageProperties
|
||||
*out = make(map[string]string, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = val
|
||||
}
|
||||
}
|
||||
if in.APIVIPs != nil {
|
||||
in, out := &in.APIVIPs, &out.APIVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.IngressVIPs != nil {
|
||||
in, out := &in.IngressVIPs, &out.IngressVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.ControlPlanePort != nil {
|
||||
in, out := &in.ControlPlanePort, &out.ControlPlanePort
|
||||
*out = new(PortTarget)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.LoadBalancer != nil {
|
||||
in, out := &in.LoadBalancer, &out.LoadBalancer
|
||||
*out = new(v1.OpenStackPlatformLoadBalancer)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PortTarget) DeepCopyInto(out *PortTarget) {
|
||||
*out = *in
|
||||
out.Network = in.Network
|
||||
if in.FixedIPs != nil {
|
||||
in, out := &in.FixedIPs, &out.FixedIPs
|
||||
*out = make([]FixedIP, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PortTarget.
|
||||
func (in *PortTarget) DeepCopy() *PortTarget {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(PortTarget)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *RootVolume) DeepCopyInto(out *RootVolume) {
|
||||
*out = *in
|
||||
if in.Types != nil {
|
||||
in, out := &in.Types, &out.Types
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Zones != nil {
|
||||
in, out := &in.Zones, &out.Zones
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RootVolume.
|
||||
func (in *RootVolume) DeepCopy() *RootVolume {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(RootVolume)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *SubnetFilter) DeepCopyInto(out *SubnetFilter) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubnetFilter.
|
||||
func (in *SubnetFilter) DeepCopy() *SubnetFilter {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(SubnetFilter)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package ovirt contains ovirt-specific structures for
|
||||
// installer configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package ovirt
|
||||
|
||||
// Name is the name for the ovirt platform.
|
||||
|
||||
156
pkg/types/ovirt/zz_generated.deepcopy.go
Normal file
156
pkg/types/ovirt/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,156 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package ovirt
|
||||
|
||||
import (
|
||||
v1 "github.com/openshift/api/config/v1"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *AffinityGroup) DeepCopyInto(out *AffinityGroup) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AffinityGroup.
|
||||
func (in *AffinityGroup) DeepCopy() *AffinityGroup {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(AffinityGroup)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *CPU) DeepCopyInto(out *CPU) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CPU.
|
||||
func (in *CPU) DeepCopy() *CPU {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(CPU)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Disk) DeepCopyInto(out *Disk) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Disk.
|
||||
func (in *Disk) DeepCopy() *Disk {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Disk)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
if in.CPU != nil {
|
||||
in, out := &in.CPU, &out.CPU
|
||||
*out = new(CPU)
|
||||
**out = **in
|
||||
}
|
||||
if in.OSDisk != nil {
|
||||
in, out := &in.OSDisk, &out.OSDisk
|
||||
*out = new(Disk)
|
||||
**out = **in
|
||||
}
|
||||
if in.AffinityGroupsNames != nil {
|
||||
in, out := &in.AffinityGroupsNames, &out.AffinityGroupsNames
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Clone != nil {
|
||||
in, out := &in.Clone, &out.Clone
|
||||
*out = new(bool)
|
||||
**out = **in
|
||||
}
|
||||
if in.Sparse != nil {
|
||||
in, out := &in.Sparse, &out.Sparse
|
||||
*out = new(bool)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.APIVIPs != nil {
|
||||
in, out := &in.APIVIPs, &out.APIVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.IngressVIPs != nil {
|
||||
in, out := &in.IngressVIPs, &out.IngressVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.AffinityGroups != nil {
|
||||
in, out := &in.AffinityGroups, &out.AffinityGroups
|
||||
*out = make([]AffinityGroup, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.LoadBalancer != nil {
|
||||
in, out := &in.LoadBalancer, &out.LoadBalancer
|
||||
*out = new(v1.OvirtPlatformLoadBalancer)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package powervs contains Power VS-specific structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package powervs
|
||||
|
||||
// Name is name for the Power VS platform.
|
||||
|
||||
133
pkg/types/powervs/zz_generated.deepcopy.go
Normal file
133
pkg/types/powervs/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,133 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package powervs
|
||||
|
||||
import (
|
||||
v1 "github.com/openshift/api/config/v1"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
if in.VolumeIDs != nil {
|
||||
in, out := &in.VolumeIDs, &out.VolumeIDs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
out.Processors = in.Processors
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
if in.ServiceEndpoints != nil {
|
||||
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
|
||||
*out = make([]v1.PowerVSServiceEndpoint, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.VPCSubnets != nil {
|
||||
in, out := &in.VPCSubnets, &out.VPCSubnets
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.ServiceEndpoints != nil {
|
||||
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
|
||||
*out = make([]v1.PowerVSServiceEndpoint, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Region) DeepCopyInto(out *Region) {
|
||||
*out = *in
|
||||
if in.Zones != nil {
|
||||
in, out := &in.Zones, &out.Zones
|
||||
*out = make(map[string]Zone, len(*in))
|
||||
for key, val := range *in {
|
||||
(*out)[key] = *val.DeepCopy()
|
||||
}
|
||||
}
|
||||
if in.VPCZones != nil {
|
||||
in, out := &in.VPCZones, &out.VPCZones
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Region.
|
||||
func (in *Region) DeepCopy() *Region {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Region)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Zone) DeepCopyInto(out *Zone) {
|
||||
*out = *in
|
||||
if in.SysTypes != nil {
|
||||
in, out := &in.SysTypes, &out.SysTypes
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Zone.
|
||||
func (in *Zone) DeepCopy() *Zone {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Zone)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
// Package vsphere contains vSphere-specific structures for installer
|
||||
// configuration and management.
|
||||
// +k8s:deepcopy-gen=package
|
||||
package vsphere
|
||||
|
||||
// Name is name for the vsphere platform.
|
||||
|
||||
283
pkg/types/vsphere/zz_generated.deepcopy.go
Normal file
283
pkg/types/vsphere/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,283 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package vsphere
|
||||
|
||||
import (
|
||||
v1 "github.com/openshift/api/config/v1"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DataDisk) DeepCopyInto(out *DataDisk) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DataDisk.
|
||||
func (in *DataDisk) DeepCopy() *DataDisk {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DataDisk)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *FailureDomain) DeepCopyInto(out *FailureDomain) {
|
||||
*out = *in
|
||||
in.Topology.DeepCopyInto(&out.Topology)
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FailureDomain.
|
||||
func (in *FailureDomain) DeepCopy() *FailureDomain {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(FailureDomain)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Host) DeepCopyInto(out *Host) {
|
||||
*out = *in
|
||||
if in.NetworkDevice != nil {
|
||||
in, out := &in.NetworkDevice, &out.NetworkDevice
|
||||
*out = new(NetworkDeviceSpec)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Host.
|
||||
func (in *Host) DeepCopy() *Host {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Host)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
out.OSDisk = in.OSDisk
|
||||
if in.DataDisks != nil {
|
||||
in, out := &in.DataDisks, &out.DataDisks
|
||||
*out = make([]DataDisk, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Zones != nil {
|
||||
in, out := &in.Zones, &out.Zones
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Metadata) DeepCopyInto(out *Metadata) {
|
||||
*out = *in
|
||||
if in.VCenters != nil {
|
||||
in, out := &in.VCenters, &out.VCenters
|
||||
*out = make([]VCenters, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
|
||||
func (in *Metadata) DeepCopy() *Metadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Metadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *NetworkDeviceSpec) DeepCopyInto(out *NetworkDeviceSpec) {
|
||||
*out = *in
|
||||
if in.IPAddrs != nil {
|
||||
in, out := &in.IPAddrs, &out.IPAddrs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.Nameservers != nil {
|
||||
in, out := &in.Nameservers, &out.Nameservers
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDeviceSpec.
|
||||
func (in *NetworkDeviceSpec) DeepCopy() *NetworkDeviceSpec {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(NetworkDeviceSpec)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *OSDisk) DeepCopyInto(out *OSDisk) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSDisk.
|
||||
func (in *OSDisk) DeepCopy() *OSDisk {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(OSDisk)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.APIVIPs != nil {
|
||||
in, out := &in.APIVIPs, &out.APIVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.IngressVIPs != nil {
|
||||
in, out := &in.IngressVIPs, &out.IngressVIPs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.DefaultMachinePlatform != nil {
|
||||
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.VCenters != nil {
|
||||
in, out := &in.VCenters, &out.VCenters
|
||||
*out = make([]VCenter, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.FailureDomains != nil {
|
||||
in, out := &in.FailureDomains, &out.FailureDomains
|
||||
*out = make([]FailureDomain, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.NodeNetworking != nil {
|
||||
in, out := &in.NodeNetworking, &out.NodeNetworking
|
||||
*out = new(v1.VSpherePlatformNodeNetworking)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.LoadBalancer != nil {
|
||||
in, out := &in.LoadBalancer, &out.LoadBalancer
|
||||
*out = new(v1.VSpherePlatformLoadBalancer)
|
||||
**out = **in
|
||||
}
|
||||
if in.Hosts != nil {
|
||||
in, out := &in.Hosts, &out.Hosts
|
||||
*out = make([]*Host, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Host)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Topology) DeepCopyInto(out *Topology) {
|
||||
*out = *in
|
||||
if in.Networks != nil {
|
||||
in, out := &in.Networks, &out.Networks
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.TagIDs != nil {
|
||||
in, out := &in.TagIDs, &out.TagIDs
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Topology.
|
||||
func (in *Topology) DeepCopy() *Topology {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Topology)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *VCenter) DeepCopyInto(out *VCenter) {
|
||||
*out = *in
|
||||
if in.Datacenters != nil {
|
||||
in, out := &in.Datacenters, &out.Datacenters
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VCenter.
|
||||
func (in *VCenter) DeepCopy() *VCenter {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(VCenter)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *VCenters) DeepCopyInto(out *VCenters) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VCenters.
|
||||
func (in *VCenters) DeepCopy() *VCenters {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(VCenters)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
759
pkg/types/zz_generated.deepcopy.go
Normal file
759
pkg/types/zz_generated.deepcopy.go
Normal file
@@ -0,0 +1,759 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by deepcopy-gen. DO NOT EDIT.
|
||||
|
||||
package types
|
||||
|
||||
import (
|
||||
v1 "github.com/openshift/api/config/v1"
|
||||
ipnet "github.com/openshift/installer/pkg/ipnet"
|
||||
aws "github.com/openshift/installer/pkg/types/aws"
|
||||
azure "github.com/openshift/installer/pkg/types/azure"
|
||||
baremetal "github.com/openshift/installer/pkg/types/baremetal"
|
||||
external "github.com/openshift/installer/pkg/types/external"
|
||||
gcp "github.com/openshift/installer/pkg/types/gcp"
|
||||
ibmcloud "github.com/openshift/installer/pkg/types/ibmcloud"
|
||||
none "github.com/openshift/installer/pkg/types/none"
|
||||
nutanix "github.com/openshift/installer/pkg/types/nutanix"
|
||||
openstack "github.com/openshift/installer/pkg/types/openstack"
|
||||
ovirt "github.com/openshift/installer/pkg/types/ovirt"
|
||||
powervs "github.com/openshift/installer/pkg/types/powervs"
|
||||
vsphere "github.com/openshift/installer/pkg/types/vsphere"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *BootstrapInPlace) DeepCopyInto(out *BootstrapInPlace) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BootstrapInPlace.
|
||||
func (in *BootstrapInPlace) DeepCopy() *BootstrapInPlace {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(BootstrapInPlace)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Capabilities) DeepCopyInto(out *Capabilities) {
|
||||
*out = *in
|
||||
if in.AdditionalEnabledCapabilities != nil {
|
||||
in, out := &in.AdditionalEnabledCapabilities, &out.AdditionalEnabledCapabilities
|
||||
*out = make([]v1.ClusterVersionCapability, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Capabilities.
|
||||
func (in *Capabilities) DeepCopy() *Capabilities {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Capabilities)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ClusterMetadata) DeepCopyInto(out *ClusterMetadata) {
|
||||
*out = *in
|
||||
in.ClusterPlatformMetadata.DeepCopyInto(&out.ClusterPlatformMetadata)
|
||||
if in.CustomFeatureSet != nil {
|
||||
in, out := &in.CustomFeatureSet, &out.CustomFeatureSet
|
||||
*out = new(v1.CustomFeatureGates)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterMetadata.
|
||||
func (in *ClusterMetadata) DeepCopy() *ClusterMetadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ClusterMetadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ClusterNetworkEntry) DeepCopyInto(out *ClusterNetworkEntry) {
|
||||
*out = *in
|
||||
in.CIDR.DeepCopyInto(&out.CIDR)
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterNetworkEntry.
|
||||
func (in *ClusterNetworkEntry) DeepCopy() *ClusterNetworkEntry {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ClusterNetworkEntry)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ClusterPlatformMetadata) DeepCopyInto(out *ClusterPlatformMetadata) {
|
||||
*out = *in
|
||||
if in.AWS != nil {
|
||||
in, out := &in.AWS, &out.AWS
|
||||
*out = new(aws.Metadata)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.OpenStack != nil {
|
||||
in, out := &in.OpenStack, &out.OpenStack
|
||||
*out = new(openstack.Metadata)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Azure != nil {
|
||||
in, out := &in.Azure, &out.Azure
|
||||
*out = new(azure.Metadata)
|
||||
**out = **in
|
||||
}
|
||||
if in.GCP != nil {
|
||||
in, out := &in.GCP, &out.GCP
|
||||
*out = new(gcp.Metadata)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloud != nil {
|
||||
in, out := &in.IBMCloud, &out.IBMCloud
|
||||
*out = new(ibmcloud.Metadata)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.BareMetal != nil {
|
||||
in, out := &in.BareMetal, &out.BareMetal
|
||||
*out = new(baremetal.Metadata)
|
||||
**out = **in
|
||||
}
|
||||
if in.Ovirt != nil {
|
||||
in, out := &in.Ovirt, &out.Ovirt
|
||||
*out = new(ovirt.Metadata)
|
||||
**out = **in
|
||||
}
|
||||
if in.PowerVS != nil {
|
||||
in, out := &in.PowerVS, &out.PowerVS
|
||||
*out = new(powervs.Metadata)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.VSphere != nil {
|
||||
in, out := &in.VSphere, &out.VSphere
|
||||
*out = new(vsphere.Metadata)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Nutanix != nil {
|
||||
in, out := &in.Nutanix, &out.Nutanix
|
||||
*out = new(nutanix.Metadata)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterPlatformMetadata.
|
||||
func (in *ClusterPlatformMetadata) DeepCopy() *ClusterPlatformMetadata {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ClusterPlatformMetadata)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ClusterQuota) DeepCopyInto(out *ClusterQuota) {
|
||||
*out = *in
|
||||
if in.GCP != nil {
|
||||
in, out := &in.GCP, &out.GCP
|
||||
*out = new(gcp.Quota)
|
||||
if **in != nil {
|
||||
in, out := *in, *out
|
||||
*out = make([]gcp.QuotaUsage, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterQuota.
|
||||
func (in *ClusterQuota) DeepCopy() *ClusterQuota {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ClusterQuota)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Credential) DeepCopyInto(out *Credential) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Credential.
|
||||
func (in *Credential) DeepCopy() *Credential {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Credential)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Disk) DeepCopyInto(out *Disk) {
|
||||
*out = *in
|
||||
if in.UserDefined != nil {
|
||||
in, out := &in.UserDefined, &out.UserDefined
|
||||
*out = new(DiskUserDefined)
|
||||
**out = **in
|
||||
}
|
||||
if in.Etcd != nil {
|
||||
in, out := &in.Etcd, &out.Etcd
|
||||
*out = new(DiskEtcd)
|
||||
**out = **in
|
||||
}
|
||||
if in.Swap != nil {
|
||||
in, out := &in.Swap, &out.Swap
|
||||
*out = new(DiskSwap)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Disk.
|
||||
func (in *Disk) DeepCopy() *Disk {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Disk)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DiskEtcd) DeepCopyInto(out *DiskEtcd) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskEtcd.
|
||||
func (in *DiskEtcd) DeepCopy() *DiskEtcd {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DiskEtcd)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DiskSwap) DeepCopyInto(out *DiskSwap) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskSwap.
|
||||
func (in *DiskSwap) DeepCopy() *DiskSwap {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DiskSwap)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *DiskUserDefined) DeepCopyInto(out *DiskUserDefined) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskUserDefined.
|
||||
func (in *DiskUserDefined) DeepCopy() *DiskUserDefined {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(DiskUserDefined)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Fencing) DeepCopyInto(out *Fencing) {
|
||||
*out = *in
|
||||
if in.Credentials != nil {
|
||||
in, out := &in.Credentials, &out.Credentials
|
||||
*out = make([]*Credential, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Credential)
|
||||
**out = **in
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Fencing.
|
||||
func (in *Fencing) DeepCopy() *Fencing {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Fencing)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *IPv4OVNKubernetesConfig) DeepCopyInto(out *IPv4OVNKubernetesConfig) {
|
||||
*out = *in
|
||||
if in.InternalJoinSubnet != nil {
|
||||
in, out := &in.InternalJoinSubnet, &out.InternalJoinSubnet
|
||||
*out = (*in).DeepCopy()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPv4OVNKubernetesConfig.
|
||||
func (in *IPv4OVNKubernetesConfig) DeepCopy() *IPv4OVNKubernetesConfig {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(IPv4OVNKubernetesConfig)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ImageContentSource) DeepCopyInto(out *ImageContentSource) {
|
||||
*out = *in
|
||||
if in.Mirrors != nil {
|
||||
in, out := &in.Mirrors, &out.Mirrors
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentSource.
|
||||
func (in *ImageContentSource) DeepCopy() *ImageContentSource {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ImageContentSource)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ImageDigestSource) DeepCopyInto(out *ImageDigestSource) {
|
||||
*out = *in
|
||||
if in.Mirrors != nil {
|
||||
in, out := &in.Mirrors, &out.Mirrors
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestSource.
|
||||
func (in *ImageDigestSource) DeepCopy() *ImageDigestSource {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ImageDigestSource)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *InstallConfig) DeepCopyInto(out *InstallConfig) {
|
||||
*out = *in
|
||||
out.TypeMeta = in.TypeMeta
|
||||
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||
if in.Networking != nil {
|
||||
in, out := &in.Networking, &out.Networking
|
||||
*out = new(Networking)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.ControlPlane != nil {
|
||||
in, out := &in.ControlPlane, &out.ControlPlane
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Arbiter != nil {
|
||||
in, out := &in.Arbiter, &out.Arbiter
|
||||
*out = new(MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Compute != nil {
|
||||
in, out := &in.Compute, &out.Compute
|
||||
*out = make([]MachinePool, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
in.Platform.DeepCopyInto(&out.Platform)
|
||||
if in.Proxy != nil {
|
||||
in, out := &in.Proxy, &out.Proxy
|
||||
*out = new(Proxy)
|
||||
**out = **in
|
||||
}
|
||||
if in.DeprecatedImageContentSources != nil {
|
||||
in, out := &in.DeprecatedImageContentSources, &out.DeprecatedImageContentSources
|
||||
*out = make([]ImageContentSource, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.ImageDigestSources != nil {
|
||||
in, out := &in.ImageDigestSources, &out.ImageDigestSources
|
||||
*out = make([]ImageDigestSource, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.OperatorPublishingStrategy != nil {
|
||||
in, out := &in.OperatorPublishingStrategy, &out.OperatorPublishingStrategy
|
||||
*out = new(OperatorPublishingStrategy)
|
||||
**out = **in
|
||||
}
|
||||
if in.BootstrapInPlace != nil {
|
||||
in, out := &in.BootstrapInPlace, &out.BootstrapInPlace
|
||||
*out = new(BootstrapInPlace)
|
||||
**out = **in
|
||||
}
|
||||
if in.Capabilities != nil {
|
||||
in, out := &in.Capabilities, &out.Capabilities
|
||||
*out = new(Capabilities)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.FeatureGates != nil {
|
||||
in, out := &in.FeatureGates, &out.FeatureGates
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstallConfig.
|
||||
func (in *InstallConfig) DeepCopy() *InstallConfig {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(InstallConfig)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachineNetworkEntry) DeepCopyInto(out *MachineNetworkEntry) {
|
||||
*out = *in
|
||||
in.CIDR.DeepCopyInto(&out.CIDR)
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineNetworkEntry.
|
||||
func (in *MachineNetworkEntry) DeepCopy() *MachineNetworkEntry {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachineNetworkEntry)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
|
||||
*out = *in
|
||||
if in.Replicas != nil {
|
||||
in, out := &in.Replicas, &out.Replicas
|
||||
*out = new(int64)
|
||||
**out = **in
|
||||
}
|
||||
in.Platform.DeepCopyInto(&out.Platform)
|
||||
if in.Fencing != nil {
|
||||
in, out := &in.Fencing, &out.Fencing
|
||||
*out = new(Fencing)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.DiskSetup != nil {
|
||||
in, out := &in.DiskSetup, &out.DiskSetup
|
||||
*out = make([]Disk, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
|
||||
func (in *MachinePool) DeepCopy() *MachinePool {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePool)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MachinePoolPlatform) DeepCopyInto(out *MachinePoolPlatform) {
|
||||
*out = *in
|
||||
if in.AWS != nil {
|
||||
in, out := &in.AWS, &out.AWS
|
||||
*out = new(aws.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Azure != nil {
|
||||
in, out := &in.Azure, &out.Azure
|
||||
*out = new(azure.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.BareMetal != nil {
|
||||
in, out := &in.BareMetal, &out.BareMetal
|
||||
*out = new(baremetal.MachinePool)
|
||||
**out = **in
|
||||
}
|
||||
if in.GCP != nil {
|
||||
in, out := &in.GCP, &out.GCP
|
||||
*out = new(gcp.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloud != nil {
|
||||
in, out := &in.IBMCloud, &out.IBMCloud
|
||||
*out = new(ibmcloud.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.OpenStack != nil {
|
||||
in, out := &in.OpenStack, &out.OpenStack
|
||||
*out = new(openstack.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.VSphere != nil {
|
||||
in, out := &in.VSphere, &out.VSphere
|
||||
*out = new(vsphere.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Ovirt != nil {
|
||||
in, out := &in.Ovirt, &out.Ovirt
|
||||
*out = new(ovirt.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.PowerVS != nil {
|
||||
in, out := &in.PowerVS, &out.PowerVS
|
||||
*out = new(powervs.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Nutanix != nil {
|
||||
in, out := &in.Nutanix, &out.Nutanix
|
||||
*out = new(nutanix.MachinePool)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePoolPlatform.
|
||||
func (in *MachinePoolPlatform) DeepCopy() *MachinePoolPlatform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MachinePoolPlatform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Networking) DeepCopyInto(out *Networking) {
|
||||
*out = *in
|
||||
if in.MachineNetwork != nil {
|
||||
in, out := &in.MachineNetwork, &out.MachineNetwork
|
||||
*out = make([]MachineNetworkEntry, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.ClusterNetwork != nil {
|
||||
in, out := &in.ClusterNetwork, &out.ClusterNetwork
|
||||
*out = make([]ClusterNetworkEntry, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.ServiceNetwork != nil {
|
||||
in, out := &in.ServiceNetwork, &out.ServiceNetwork
|
||||
*out = make([]ipnet.IPNet, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.OVNKubernetesConfig != nil {
|
||||
in, out := &in.OVNKubernetesConfig, &out.OVNKubernetesConfig
|
||||
*out = new(OVNKubernetesConfig)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.DeprecatedMachineCIDR != nil {
|
||||
in, out := &in.DeprecatedMachineCIDR, &out.DeprecatedMachineCIDR
|
||||
*out = (*in).DeepCopy()
|
||||
}
|
||||
if in.DeprecatedServiceCIDR != nil {
|
||||
in, out := &in.DeprecatedServiceCIDR, &out.DeprecatedServiceCIDR
|
||||
*out = (*in).DeepCopy()
|
||||
}
|
||||
if in.DeprecatedClusterNetworks != nil {
|
||||
in, out := &in.DeprecatedClusterNetworks, &out.DeprecatedClusterNetworks
|
||||
*out = make([]ClusterNetworkEntry, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Networking.
|
||||
func (in *Networking) DeepCopy() *Networking {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Networking)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *OVNKubernetesConfig) DeepCopyInto(out *OVNKubernetesConfig) {
|
||||
*out = *in
|
||||
if in.IPv4 != nil {
|
||||
in, out := &in.IPv4, &out.IPv4
|
||||
*out = new(IPv4OVNKubernetesConfig)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OVNKubernetesConfig.
|
||||
func (in *OVNKubernetesConfig) DeepCopy() *OVNKubernetesConfig {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(OVNKubernetesConfig)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *OperatorPublishingStrategy) DeepCopyInto(out *OperatorPublishingStrategy) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorPublishingStrategy.
|
||||
func (in *OperatorPublishingStrategy) DeepCopy() *OperatorPublishingStrategy {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(OperatorPublishingStrategy)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Platform) DeepCopyInto(out *Platform) {
|
||||
*out = *in
|
||||
if in.AWS != nil {
|
||||
in, out := &in.AWS, &out.AWS
|
||||
*out = new(aws.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Azure != nil {
|
||||
in, out := &in.Azure, &out.Azure
|
||||
*out = new(azure.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.BareMetal != nil {
|
||||
in, out := &in.BareMetal, &out.BareMetal
|
||||
*out = new(baremetal.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.GCP != nil {
|
||||
in, out := &in.GCP, &out.GCP
|
||||
*out = new(gcp.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.IBMCloud != nil {
|
||||
in, out := &in.IBMCloud, &out.IBMCloud
|
||||
*out = new(ibmcloud.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.None != nil {
|
||||
in, out := &in.None, &out.None
|
||||
*out = new(none.Platform)
|
||||
**out = **in
|
||||
}
|
||||
if in.External != nil {
|
||||
in, out := &in.External, &out.External
|
||||
*out = new(external.Platform)
|
||||
**out = **in
|
||||
}
|
||||
if in.OpenStack != nil {
|
||||
in, out := &in.OpenStack, &out.OpenStack
|
||||
*out = new(openstack.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.PowerVS != nil {
|
||||
in, out := &in.PowerVS, &out.PowerVS
|
||||
*out = new(powervs.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.VSphere != nil {
|
||||
in, out := &in.VSphere, &out.VSphere
|
||||
*out = new(vsphere.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Ovirt != nil {
|
||||
in, out := &in.Ovirt, &out.Ovirt
|
||||
*out = new(ovirt.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Nutanix != nil {
|
||||
in, out := &in.Nutanix, &out.Nutanix
|
||||
*out = new(nutanix.Platform)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
|
||||
func (in *Platform) DeepCopy() *Platform {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Platform)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Proxy) DeepCopyInto(out *Proxy) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy.
|
||||
func (in *Proxy) DeepCopy() *Proxy {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Proxy)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
2
tools.go
2
tools.go
@@ -13,6 +13,8 @@ import (
|
||||
_ "github.com/daixiang0/gci" // dependency of hack/go-fmt.sh
|
||||
// used to generate mocks
|
||||
_ "go.uber.org/mock/mockgen"
|
||||
// dependency of generating DeepCopy implementations for install-config
|
||||
_ "k8s.io/code-generator/cmd/deepcopy-gen"
|
||||
// dependency of generating CRD for install-config
|
||||
_ "sigs.k8s.io/controller-tools/cmd/controller-gen"
|
||||
)
|
||||
|
||||
202
vendor/k8s.io/code-generator/LICENSE
generated
vendored
Normal file
202
vendor/k8s.io/code-generator/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
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.
|
||||
52
vendor/k8s.io/code-generator/cmd/deepcopy-gen/args/args.go
generated
vendored
Normal file
52
vendor/k8s.io/code-generator/cmd/deepcopy-gen/args/args.go
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
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 args
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/pflag"
|
||||
)
|
||||
|
||||
type Args struct {
|
||||
OutputFile string
|
||||
BoundingDirs []string // Only deal with types rooted under these dirs.
|
||||
GoHeaderFile string
|
||||
}
|
||||
|
||||
// New returns default arguments for the generator.
|
||||
func New() *Args {
|
||||
return &Args{}
|
||||
}
|
||||
|
||||
// AddFlags add the generator flags to the flag set.
|
||||
func (args *Args) AddFlags(fs *pflag.FlagSet) {
|
||||
fs.StringVar(&args.OutputFile, "output-file", "generated.deepcopy.go",
|
||||
"the name of the file to be generated")
|
||||
fs.StringSliceVar(&args.BoundingDirs, "bounding-dirs", args.BoundingDirs,
|
||||
"Comma-separated list of import paths which bound the types for which deep-copies will be generated.")
|
||||
fs.StringVar(&args.GoHeaderFile, "go-header-file", "",
|
||||
"the path to a file containing boilerplate header text; the string \"YEAR\" will be replaced with the current 4-digit year")
|
||||
}
|
||||
|
||||
// Validate checks the given arguments.
|
||||
func (args *Args) Validate() error {
|
||||
if len(args.OutputFile) == 0 {
|
||||
return fmt.Errorf("--output-file must be specified")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
904
vendor/k8s.io/code-generator/cmd/deepcopy-gen/generators/deepcopy.go
generated
vendored
Normal file
904
vendor/k8s.io/code-generator/cmd/deepcopy-gen/generators/deepcopy.go
generated
vendored
Normal file
@@ -0,0 +1,904 @@
|
||||
/*
|
||||
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"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"k8s.io/code-generator/cmd/deepcopy-gen/args"
|
||||
genutil "k8s.io/code-generator/pkg/util"
|
||||
"k8s.io/gengo/v2"
|
||||
"k8s.io/gengo/v2/generator"
|
||||
"k8s.io/gengo/v2/namer"
|
||||
"k8s.io/gengo/v2/types"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// This is the comment tag that carries parameters for deep-copy generation.
|
||||
const (
|
||||
tagEnabledName = "k8s:deepcopy-gen"
|
||||
interfacesTagName = tagEnabledName + ":interfaces"
|
||||
interfacesNonPointerTagName = tagEnabledName + ":nonpointer-interfaces" // attach the DeepCopy<Interface> methods to the
|
||||
)
|
||||
|
||||
// Known values for the comment tag.
|
||||
const tagValuePackage = "package"
|
||||
|
||||
// enabledTagValue holds parameters from a tagName tag.
|
||||
type enabledTagValue struct {
|
||||
value string
|
||||
register bool
|
||||
}
|
||||
|
||||
func extractEnabledTypeTag(t *types.Type) *enabledTagValue {
|
||||
comments := append(append([]string{}, t.SecondClosestCommentLines...), t.CommentLines...)
|
||||
return extractEnabledTag(comments)
|
||||
}
|
||||
|
||||
func extractEnabledTag(comments []string) *enabledTagValue {
|
||||
tags, err := genutil.ExtractCommentTagsWithoutArguments("+", []string{tagEnabledName}, comments)
|
||||
if err != nil {
|
||||
klog.Fatalf("Error extracting %s tags: %v", tagEnabledName, err)
|
||||
}
|
||||
if tags[tagEnabledName] == nil {
|
||||
// No match for the tag.
|
||||
return nil
|
||||
}
|
||||
// If there are multiple values, abort.
|
||||
if len(tags[tagEnabledName]) > 1 {
|
||||
klog.Fatalf("Found %d %s tags: %q", len(tags[tagEnabledName]), tagEnabledName, tags[tagEnabledName])
|
||||
}
|
||||
|
||||
// If we got here we are returning something.
|
||||
tag := &enabledTagValue{}
|
||||
|
||||
// Get the primary value.
|
||||
parts := strings.Split(tags[tagEnabledName][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:
|
||||
klog.Fatalf("Unsupported %s param: %q", tagEnabledName, 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 GetTargets(context *generator.Context, args *args.Args) []generator.Target {
|
||||
boilerplate, err := gengo.GoBoilerplate(args.GoHeaderFile, gengo.StdBuildTag, gengo.StdGeneratedBy)
|
||||
if err != nil {
|
||||
klog.Fatalf("Failed loading boilerplate: %v", err)
|
||||
}
|
||||
|
||||
boundingDirs := []string{}
|
||||
if args.BoundingDirs == nil {
|
||||
args.BoundingDirs = context.Inputs
|
||||
}
|
||||
for i := range args.BoundingDirs {
|
||||
// Strip any trailing slashes - they are not exactly "correct" but
|
||||
// this is friendlier.
|
||||
boundingDirs = append(boundingDirs, strings.TrimRight(args.BoundingDirs[i], "/"))
|
||||
}
|
||||
|
||||
targets := []generator.Target{}
|
||||
|
||||
for _, i := range context.Inputs {
|
||||
klog.V(3).Infof("Considering pkg %q", i)
|
||||
|
||||
pkg := context.Universe[i]
|
||||
|
||||
ptag := extractEnabledTag(pkg.Comments)
|
||||
ptagValue := ""
|
||||
ptagRegister := false
|
||||
if ptag != nil {
|
||||
ptagValue = ptag.value
|
||||
if ptagValue != tagValuePackage {
|
||||
klog.Fatalf("Package %v: unsupported %s value: %q", i, tagEnabledName, ptagValue)
|
||||
}
|
||||
ptagRegister = ptag.register
|
||||
klog.V(3).Infof(" tag.value: %q, tag.register: %t", ptagValue, ptagRegister)
|
||||
} else {
|
||||
klog.V(3).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. Ensure all types that want generation
|
||||
// can be copied.
|
||||
var uncopyable []string
|
||||
for _, t := range pkg.Types {
|
||||
klog.V(3).Infof(" considering type %q", t.Name.String())
|
||||
ttag := extractEnabledTypeTag(t)
|
||||
if ttag != nil && ttag.value == "true" {
|
||||
klog.V(3).Infof(" tag=true")
|
||||
if !copyableType(t) {
|
||||
uncopyable = append(uncopyable, fmt.Sprintf("%v", t))
|
||||
} else {
|
||||
pkgNeedsGeneration = true
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(uncopyable) > 0 {
|
||||
klog.Fatalf("Types requested deepcopy generation but are not copyable: %s",
|
||||
strings.Join(uncopyable, ", "))
|
||||
}
|
||||
}
|
||||
|
||||
if pkgNeedsGeneration {
|
||||
klog.V(3).Infof("Package %q needs generation", i)
|
||||
targets = append(targets,
|
||||
&generator.SimpleTarget{
|
||||
PkgName: strings.Split(path.Base(pkg.Path), ".")[0],
|
||||
PkgPath: pkg.Path,
|
||||
PkgDir: pkg.Dir, // output pkg is the same as the input
|
||||
HeaderComment: boilerplate,
|
||||
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||
return t.Name.Package == pkg.Path
|
||||
},
|
||||
GeneratorsFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||
return []generator.Generator{
|
||||
NewGenDeepCopy(args.OutputFile, pkg.Path, boundingDirs, (ptagValue == tagValuePackage), ptagRegister),
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
return targets
|
||||
}
|
||||
|
||||
// genDeepCopy produces a file with autogenerated deep-copy functions.
|
||||
type genDeepCopy struct {
|
||||
generator.GoGenerator
|
||||
targetPackage string
|
||||
boundingDirs []string
|
||||
allTypes bool
|
||||
registerTypes bool
|
||||
imports namer.ImportTracker
|
||||
typesForInit []*types.Type
|
||||
}
|
||||
|
||||
func NewGenDeepCopy(outputFilename, targetPackage string, boundingDirs []string, allTypes, registerTypes bool) generator.Generator {
|
||||
return &genDeepCopy{
|
||||
GoGenerator: generator.GoGenerator{
|
||||
OutputFilename: outputFilename,
|
||||
},
|
||||
targetPackage: targetPackage,
|
||||
boundingDirs: boundingDirs,
|
||||
allTypes: allTypes,
|
||||
registerTypes: registerTypes,
|
||||
imports: generator.NewImportTrackerForPackage(targetPackage),
|
||||
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 := extractEnabledTypeTag(t)
|
||||
if ttag != nil && ttag.value == "true" {
|
||||
enabled = true
|
||||
}
|
||||
}
|
||||
if !enabled {
|
||||
return false
|
||||
}
|
||||
if !copyableType(t) {
|
||||
klog.V(3).Infof("Type %v is not copyable", t)
|
||||
return false
|
||||
}
|
||||
klog.V(3).Infof("Type %v is copyable", t)
|
||||
g.typesForInit = append(g.typesForInit, t)
|
||||
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].Type.Kind == types.Pointer && f.Signature.Results[0].Type.Elem.Name == t.Name
|
||||
nonPtrResult := f.Signature.Results[0].Type.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 klog.Fatalf
|
||||
// if the type does not match.
|
||||
func deepCopyMethodOrDie(t *types.Type) *types.Signature {
|
||||
ret, err := deepCopyMethod(t)
|
||||
if err != nil {
|
||||
klog.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].Type.Kind == types.Pointer && f.Signature.Parameters[0].Type.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 klog.Fatalf
|
||||
// if the type is wrong.
|
||||
func deepCopyIntoMethodOrDie(t *types.Type) *types.Signature {
|
||||
ret, err := deepCopyIntoMethod(t)
|
||||
if err != nil {
|
||||
klog.Fatal(err)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func copyableType(t *types.Type) bool {
|
||||
// If the type opts out of copy-generation, stop.
|
||||
ttag := extractEnabledTypeTag(t)
|
||||
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 := extractEnabledTypeTag(t)
|
||||
tv := ""
|
||||
if tag != nil {
|
||||
tv = tag.value
|
||||
if tv != "true" && tv != "false" {
|
||||
klog.Fatalf("Type %v: unsupported %s value: %q", t, tagEnabledName, tag.value)
|
||||
}
|
||||
}
|
||||
if g.allTypes && tv == "false" {
|
||||
// The whole package is being generated, but this type has opted out.
|
||||
klog.V(2).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.
|
||||
klog.V(2).Infof("Not generating for type %v because type did not opt in", t)
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func extractInterfacesTag(t *types.Type) []string {
|
||||
var result []string
|
||||
comments := append(append([]string{}, t.SecondClosestCommentLines...), t.CommentLines...)
|
||||
tags, err := genutil.ExtractCommentTagsWithoutArguments("+", []string{interfacesTagName}, comments)
|
||||
if err != nil {
|
||||
klog.Fatalf("Error extracting %s tags: %v", interfacesTagName, err)
|
||||
}
|
||||
for _, v := range tags[interfacesTagName] {
|
||||
if len(v) == 0 {
|
||||
continue
|
||||
}
|
||||
intfs := strings.Split(v, ",")
|
||||
for _, intf := range intfs {
|
||||
if intf == "" {
|
||||
continue
|
||||
}
|
||||
result = append(result, intf)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func extractNonPointerInterfaces(t *types.Type) (bool, error) {
|
||||
comments := append(append([]string{}, t.SecondClosestCommentLines...), t.CommentLines...)
|
||||
tags, err := genutil.ExtractCommentTagsWithoutArguments("+", []string{interfacesNonPointerTagName}, comments)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("failed to parse comments: %w", err)
|
||||
}
|
||||
|
||||
values := tags[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(t)
|
||||
|
||||
var ts []*types.Type
|
||||
for _, intf := range intfs {
|
||||
t := types.ParseFullyQualifiedName(intf)
|
||||
klog.V(3).Infof("Loading package for interface %v", intf)
|
||||
_, err := c.LoadPackages(t.Package)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
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(t)
|
||||
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
|
||||
}
|
||||
klog.V(2).Infof("Generating deepcopy functions 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
|
||||
klog.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
|
||||
klog.Fatalf("Hit an alias type %v. This should never happen.", t)
|
||||
default:
|
||||
klog.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() {
|
||||
klog.Fatalf("Hit an unsupported type %v for: %v", uet, t)
|
||||
}
|
||||
|
||||
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].Type.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:
|
||||
// Note: do not generate code that won't compile as `DeepCopyinterface{}()` is not a valid function
|
||||
if uet.Name.Name == "interface{}" {
|
||||
klog.Fatalf("DeepCopy of %q is unsupported. Instead, use named interfaces with DeepCopy<named-interface> as one of the methods.", uet.Name.Name)
|
||||
}
|
||||
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:
|
||||
klog.Fatalf("Hit an unsupported type %v for %v", uet, t)
|
||||
}
|
||||
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 {
|
||||
// Note: do not generate code that won't compile as `DeepCopyinterface{}()` is not a valid function
|
||||
if uet.Name.Name == "interface{}" {
|
||||
klog.Fatalf("DeepCopy of %q is unsupported. Instead, use named interfaces with DeepCopy<named-interface> as one of the methods.", uet.Name.Name)
|
||||
}
|
||||
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 {
|
||||
klog.Fatalf("Hit an unsupported type %v for %v", uet, t)
|
||||
}
|
||||
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].Type.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.Array:
|
||||
sw.Do("out.$.name$ = in.$.name$\n", args)
|
||||
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:
|
||||
// Note: do not generate code that won't compile as `DeepCopyinterface{}()` is not a valid function
|
||||
if uft.Name.Name == "interface{}" {
|
||||
klog.Fatalf("DeepCopy of %q is unsupported. Instead, use named interfaces with DeepCopy<named-interface> as one of the methods.", uft.Name.Name)
|
||||
}
|
||||
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:
|
||||
klog.Fatalf("Hit an unsupported type '%v' for '%v', from %v.%v", uft, ft, t, m.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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].Type.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:
|
||||
klog.Fatalf("Hit an unsupported type %v for %v", uet, t)
|
||||
}
|
||||
}
|
||||
110
vendor/k8s.io/code-generator/cmd/deepcopy-gen/main.go
generated
vendored
Normal file
110
vendor/k8s.io/code-generator/cmd/deepcopy-gen/main.go
generated
vendored
Normal file
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
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 methods already exist (are predefined by the developer), they are
|
||||
// used instead of generating new ones. Generated code will use standard value
|
||||
// assignment whenever possible. If that is not possible it will try to call
|
||||
// its own generated copy function for the type. Failing that, it will fall
|
||||
// back on `conversion.Cloner.DeepCopy(val)` to make the copy. The resulting
|
||||
// file will be stored in the same directory as the processed source package.
|
||||
//
|
||||
// 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
|
||||
// }
|
||||
//
|
||||
// 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 definition 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 specifying 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 (
|
||||
"flag"
|
||||
|
||||
"github.com/spf13/pflag"
|
||||
"k8s.io/code-generator/cmd/deepcopy-gen/args"
|
||||
"k8s.io/code-generator/cmd/deepcopy-gen/generators"
|
||||
"k8s.io/gengo/v2"
|
||||
"k8s.io/gengo/v2/generator"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
func main() {
|
||||
klog.InitFlags(nil)
|
||||
args := args.New()
|
||||
|
||||
args.AddFlags(pflag.CommandLine)
|
||||
flag.Set("logtostderr", "true")
|
||||
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
|
||||
pflag.Parse()
|
||||
|
||||
if err := args.Validate(); err != nil {
|
||||
klog.Fatalf("Error: %v", err)
|
||||
}
|
||||
|
||||
myTargets := func(context *generator.Context) []generator.Target {
|
||||
return generators.GetTargets(context, args)
|
||||
}
|
||||
|
||||
// Run it.
|
||||
if err := gengo.Execute(
|
||||
generators.NameSystems(),
|
||||
generators.DefaultNameSystem(),
|
||||
myTargets,
|
||||
gengo.StdBuildTag,
|
||||
pflag.Args(),
|
||||
); err != nil {
|
||||
klog.Fatalf("Error: %v", err)
|
||||
}
|
||||
klog.V(2).Info("Completed successfully.")
|
||||
}
|
||||
92
vendor/k8s.io/code-generator/pkg/util/comments.go
generated
vendored
Normal file
92
vendor/k8s.io/code-generator/pkg/util/comments.go
generated
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
Copyright 2025 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 util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"k8s.io/gengo/v2"
|
||||
)
|
||||
|
||||
// ExtractCommentTagsWithoutArguments parses comments for special metadata tags. The
|
||||
// marker argument should be unique enough to identify the tags needed, and
|
||||
// should not be a marker for tags you don't want, or else the caller takes
|
||||
// responsibility for making that distinction.
|
||||
//
|
||||
// The tagNames argument is a list of specific tags being extracted. If this is
|
||||
// nil or empty, all lines which match the marker are considered. If this is
|
||||
// specified, only lines with begin with marker + one of the tags will be
|
||||
// considered. This is useful when a common marker is used which may match
|
||||
// lines which fail this syntax (e.g. which predate this definition).
|
||||
//
|
||||
// This function looks for input lines of the following forms:
|
||||
// - 'marker' + "key=value"
|
||||
// - 'marker' + "key()=value"
|
||||
// - 'marker' + "key(arg)=value"
|
||||
//
|
||||
// The arg is forbidden. This function only consider tags with no arguments specified
|
||||
// (either as "key=value" or as // "key()=value"). Finding tags with an argument will
|
||||
// result in an error.
|
||||
//
|
||||
// The value is optional. If not specified, the resulting Tag will have "" as
|
||||
// the value.
|
||||
//
|
||||
// Tag comment-lines may have a trailing end-of-line comment.
|
||||
//
|
||||
// The map returned here is keyed by the Tag's name without args.
|
||||
//
|
||||
// A tag can be specified more than one time and all values are returned. If
|
||||
// the resulting map has an entry for a key, the value (a slice) is guaranteed
|
||||
// to have at least 1 element.
|
||||
//
|
||||
// Example: if you pass "+" for 'marker', and the following lines are in
|
||||
// the comments:
|
||||
//
|
||||
// +foo=val1 // foo
|
||||
// +bar
|
||||
// +foo=val2 // also foo
|
||||
// +foo()=val3 // still foo
|
||||
// +baz="qux"
|
||||
//
|
||||
// Then this function will return:
|
||||
//
|
||||
// map[string][]string{"foo":{"val1", "val2", "val3"}, "bar": {""}, "baz": {`"qux"`}}
|
||||
func ExtractCommentTagsWithoutArguments(marker string, tagNames []string, lines []string) (map[string][]string, error) {
|
||||
functionStyleTags, err := gengo.ExtractFunctionStyleCommentTags(marker, tagNames, lines)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
out := make(map[string][]string)
|
||||
for tagName, tags := range functionStyleTags {
|
||||
values := make([]string, 0)
|
||||
|
||||
for _, tag := range tags {
|
||||
if tag.Args == nil {
|
||||
values = append(values, tag.Value)
|
||||
} else {
|
||||
return nil, fmt.Errorf(`failed to parse tag %s: expected no arguments, found "%s"`, tag, tag.Args[0])
|
||||
}
|
||||
}
|
||||
|
||||
if len(values) > 0 {
|
||||
out[tagName] = values
|
||||
}
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
37
vendor/k8s.io/code-generator/pkg/util/plural_exceptions.go
generated
vendored
Normal file
37
vendor/k8s.io/code-generator/pkg/util/plural_exceptions.go
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
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 util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// PluralExceptionListToMapOrDie converts the list in "Type:PluralType" to map[string]string.
|
||||
// This is used for pluralizer.
|
||||
// If the format is wrong, this function will panic.
|
||||
func PluralExceptionListToMapOrDie(pluralExceptions []string) map[string]string {
|
||||
pluralExceptionMap := make(map[string]string, len(pluralExceptions))
|
||||
for i := range pluralExceptions {
|
||||
parts := strings.Split(pluralExceptions[i], ":")
|
||||
if len(parts) != 2 {
|
||||
panic(fmt.Sprintf("invalid plural exception definition: %s", pluralExceptions[i]))
|
||||
}
|
||||
pluralExceptionMap[parts[0]] = parts[1]
|
||||
}
|
||||
return pluralExceptionMap
|
||||
}
|
||||
202
vendor/k8s.io/gengo/v2/LICENSE
generated
vendored
Normal file
202
vendor/k8s.io/gengo/v2/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2014 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.
|
||||
14
vendor/k8s.io/gengo/v2/Makefile
generated
vendored
Normal file
14
vendor/k8s.io/gengo/v2/Makefile
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
all:
|
||||
go build ./...
|
||||
|
||||
test:
|
||||
GODEBUG=gotypesalias=0 go test -race ./... -count=1
|
||||
GODEBUG=gotypesalias=1 go test -race ./... -count=1
|
||||
|
||||
# We verify for the maximum version of the go directive as 1.20
|
||||
# here because the oldest go directive that exists on our supported
|
||||
# release branches in k/k is 1.20.
|
||||
verify:
|
||||
GODEBUG=gotypesalias=0 ./hack/verify-examples.sh
|
||||
GODEBUG=gotypesalias=1 ./hack/verify-examples.sh
|
||||
./hack/verify-go-directive.sh 1.20
|
||||
53
vendor/k8s.io/gengo/v2/README.md
generated
vendored
Normal file
53
vendor/k8s.io/gengo/v2/README.md
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
[![GoDoc Widget]][GoDoc] [![GoReport]][GoReportStatus]
|
||||
|
||||
[GoDoc]: https://godoc.org/k8s.io/gengo
|
||||
[GoDoc Widget]: https://godoc.org/k8s.io/gengo?status.svg
|
||||
[GoReport]: https://goreportcard.com/badge/github.com/kubernetes/gengo
|
||||
[GoReportStatus]: https://goreportcard.com/report/github.com/kubernetes/gengo
|
||||
|
||||
# Gengo: a framework for building simple code generators
|
||||
|
||||
This repo is used by Kubernetes to build some codegen tooling. It is not
|
||||
intended to be general-purpose and makes some assumptions that may not hold
|
||||
outside of Kubernetes.
|
||||
|
||||
In the past this repo was partially supported for external use (outside of the
|
||||
Kubernetes project overall), but that is no longer true. We may change the API
|
||||
in incompatible ways, without warning.
|
||||
|
||||
If you are not building something that is part of Kubernetes, DO NOT DEPEND ON
|
||||
THIS REPO.
|
||||
|
||||
## New usage within Kubernetes
|
||||
|
||||
Gengo is a very opinionated framework. It is primarily aimed at generating Go
|
||||
code derived from types defined in other Go code, but it is possible to use it
|
||||
for other things (e.g. proto files). Net new tools should consider using
|
||||
`golang.org/x/tools/go/packages` directly. Gengo can serve as an example of
|
||||
how to do that.
|
||||
|
||||
If you still decide you want to use gengo, see the
|
||||
[simple examples](./examples) in this repo or the more extensive tools in the
|
||||
Kubernetes [code-generator](https://github.com/kubernetes/code-generator/)
|
||||
repo.
|
||||
|
||||
## Overview
|
||||
|
||||
Gengo is used to build tools (generally a tool is a binary). Each tool
|
||||
describes some number of `Targets`. A target is a single output package, which
|
||||
may be the same as the inputs (if the tool generates code alongside the inputs)
|
||||
or different. Each `Target` describes some number of `Generators`. A
|
||||
generator is responsible for emitting a single file into the target directory.
|
||||
|
||||
Gengo helps the tool to load and process input packages, e.g. extracting type
|
||||
information and associating comments. Each target will be offered every known
|
||||
type, and can filter that down to the set of types it cares about. Each
|
||||
generator will be offered the result of the target's filtering, and can filter
|
||||
the set of types further. Finally, the generator will be called to emit code
|
||||
for all of the remaining types.
|
||||
|
||||
The `tracer` example in this repo can be used to examine all of the hooks.
|
||||
|
||||
## Contributing
|
||||
|
||||
Please see [CONTRIBUTING.md](../CONTRIBUTING.md) for instructions on how to contribute.
|
||||
85
vendor/k8s.io/gengo/v2/codetags/extractor.go
generated
vendored
Normal file
85
vendor/k8s.io/gengo/v2/codetags/extractor.go
generated
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
Copyright 2025 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 codetags
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
// Extract identifies and collects lines containing special metadata tags.
|
||||
// It processes only lines that begin with the prefix.
|
||||
//
|
||||
// The portion of a line immediately following the prefix is treated as
|
||||
// a potential tag name. To be considered valid, this tag name must
|
||||
// match the regular expression `[a-zA-Z_][a-zA-Z0-9_.-:]*`.
|
||||
//
|
||||
// Extract returns a map where each key is a valid tag name found in
|
||||
// lines that begin with the prefix.
|
||||
// The value for each key is a slice of strings. Each string in this slice
|
||||
// represents the contents of an original line after the prefix has been removed.
|
||||
//
|
||||
// Example: When called with prefix "+k8s:", lines:
|
||||
//
|
||||
// Comment line without marker
|
||||
// +k8s:noArgs # comment
|
||||
// +withValue=value1
|
||||
// +withValue=value2
|
||||
// +k8s:withArg(arg1)=value1
|
||||
// +k8s:withArg(arg2)=value2 # comment
|
||||
// +k8s:withNamedArgs(arg1=value1, arg2=value2)=value
|
||||
//
|
||||
// Then this function will return:
|
||||
//
|
||||
// map[string][]string{
|
||||
// "noArgs": {"noArgs # comment"},
|
||||
// "withArg": {"withArg(arg1)=value1", "withArg(arg2)=value2 # comment"},
|
||||
// "withNamedArgs": {"withNamedArgs(arg1=value1, arg2=value2)=value"},
|
||||
// }
|
||||
func Extract(prefix string, lines []string) map[string][]string {
|
||||
out := map[string][]string{}
|
||||
for _, line := range lines {
|
||||
line = strings.TrimLeft(line, " \t")
|
||||
if !strings.HasPrefix(line, prefix) {
|
||||
continue
|
||||
}
|
||||
line = line[len(prefix):]
|
||||
|
||||
// Find the end of the presumed tag name.
|
||||
nameEnd := findNameEnd(line)
|
||||
name := line[:nameEnd]
|
||||
out[name] = append(out[name], line)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// findNameEnd matches a tag in the same way as the parser.
|
||||
func findNameEnd(s string) int {
|
||||
if len(s) == 0 {
|
||||
return 0
|
||||
}
|
||||
if r, _ := utf8.DecodeRuneInString(s); !isIdentBegin(r) {
|
||||
return 0
|
||||
}
|
||||
idx := strings.IndexFunc(s, func(r rune) bool {
|
||||
return !(isTagNameInterior(r))
|
||||
})
|
||||
if idx == -1 {
|
||||
return len(s)
|
||||
}
|
||||
return idx
|
||||
}
|
||||
407
vendor/k8s.io/gengo/v2/codetags/parser.go
generated
vendored
Normal file
407
vendor/k8s.io/gengo/v2/codetags/parser.go
generated
vendored
Normal file
@@ -0,0 +1,407 @@
|
||||
/*
|
||||
Copyright 2025 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 codetags
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
// Parse parses a tag string into a Tag, or returns an error if the tag
|
||||
// string fails to parse.
|
||||
//
|
||||
// ParseOption may be provided to modify the behavior of the parser. The below
|
||||
// describes the default behavior.
|
||||
//
|
||||
// A tag consists of a name, optional arguments, and an optional scalar value or
|
||||
// tag value. For example,
|
||||
//
|
||||
// "name"
|
||||
// "name=50"
|
||||
// "name("featureX")=50"
|
||||
// "name(limit: 10, path: "/xyz")=text value"
|
||||
// "name(limit: 10, path: "/xyz")=+anotherTag(size: 100)"
|
||||
//
|
||||
// Arguments are optional and may be either:
|
||||
// - A single positional argument.
|
||||
// - One or more named arguments (in the format `name: value`).
|
||||
// - (Positional and named arguments cannot be mixed.)
|
||||
//
|
||||
// For example,
|
||||
//
|
||||
// "name()"
|
||||
// "name(arg)"
|
||||
// "name(namedArg1: argValue1)"
|
||||
// "name(namedArg1: argValue1, namedArg2: argValue2)"
|
||||
//
|
||||
// Argument values may be strings, ints, booleans, or identifiers.
|
||||
//
|
||||
// For example,
|
||||
//
|
||||
// "name("double-quoted")"
|
||||
// "name(`backtick-quoted`)"
|
||||
// "name(100)"
|
||||
// "name(true)"
|
||||
// "name(arg1: identifier)"
|
||||
// "name(arg1:`string value`)"
|
||||
// "name(arg1: 100)"
|
||||
// "name(arg1: true)"
|
||||
//
|
||||
// Note: When processing Go source code comments, the Extract function is
|
||||
// typically used first to find and isolate tag strings matching a specific
|
||||
// prefix. Those extracted strings can then be parsed using this function.
|
||||
//
|
||||
// The value part of the tag is optional and follows an equals sign "=". If a
|
||||
// value is present, it must be a string, int, boolean, identifier, or tag.
|
||||
//
|
||||
// For example,
|
||||
//
|
||||
// "name" # no value
|
||||
// "name=identifier"
|
||||
// "name="double-quoted value""
|
||||
// "name=`backtick-quoted value`"
|
||||
// "name(100)"
|
||||
// "name(true)"
|
||||
// "name=+anotherTag"
|
||||
// "name=+anotherTag(size: 100)"
|
||||
//
|
||||
// Trailing comments are ignored unless the RawValues option is enabled, in which
|
||||
// case they are treated as part of the value.
|
||||
//
|
||||
// For example,
|
||||
//
|
||||
// "key=value # This comment is ignored"
|
||||
//
|
||||
// Formal Grammar:
|
||||
//
|
||||
// <tag> ::= <tagName> [ "(" [ <args> ] ")" ] [ ( "=" <value> | "=+" <tag> ) ]
|
||||
// <args> ::= <value> | <namedArgs>
|
||||
// <namedArgs> ::= <argNameAndValue> [ "," <namedArgs> ]*
|
||||
// <argNameAndValue> ::= <identifier> ":" <value>
|
||||
// <value> ::= <identifier> | <string> | <int> | <bool>
|
||||
//
|
||||
// <tagName> ::= [a-zA-Z_][a-zA-Z0-9_-.:]*
|
||||
// <identifier> ::= [a-zA-Z_][a-zA-Z0-9_-.]*
|
||||
// <string> ::= /* Go-style double-quoted or backtick-quoted strings,
|
||||
// ... with standard Go escape sequences for double-quoted strings. */
|
||||
// <int> ::= /* Standard Go integer literals (decimal, 0x hex, 0o octal, 0b binary),
|
||||
// ... with an optional +/- prefix. */
|
||||
// <bool> ::= "true" | "false"
|
||||
func Parse(tag string, options ...ParseOption) (Tag, error) {
|
||||
opts := parseOpts{}
|
||||
for _, o := range options {
|
||||
o(&opts)
|
||||
}
|
||||
|
||||
tag = strings.TrimSpace(tag)
|
||||
return parseTag(tag, opts)
|
||||
}
|
||||
|
||||
// ParseAll calls Parse on each tag in the input slice.
|
||||
func ParseAll(tags []string, options ...ParseOption) ([]Tag, error) {
|
||||
var out []Tag
|
||||
for _, tag := range tags {
|
||||
parsed, err := Parse(tag, options...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out = append(out, parsed)
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
type parseOpts struct {
|
||||
rawValues bool
|
||||
}
|
||||
|
||||
// ParseOption provides a parser option.
|
||||
type ParseOption func(*parseOpts)
|
||||
|
||||
// RawValues skips parsing of the value part of the tag. If enabled, the Value
|
||||
// in the parse response will contain all text following the "=" sign, up to the last
|
||||
// non-whitespace character, and ValueType will be set to ValueTypeRaw.
|
||||
// Default: disabled
|
||||
func RawValues(enabled bool) ParseOption {
|
||||
return func(opts *parseOpts) {
|
||||
opts.rawValues = enabled
|
||||
}
|
||||
}
|
||||
|
||||
func parseTag(input string, opts parseOpts) (Tag, error) {
|
||||
const (
|
||||
stTag = "stTag"
|
||||
stMaybeArgs = "stMaybeArgs"
|
||||
stArg = "stArg"
|
||||
stArgEndOfToken = "stArgEndOfToken"
|
||||
stMaybeValue = "stMaybeValue"
|
||||
stValue = "stValue"
|
||||
stMaybeComment = "stMaybeComment"
|
||||
)
|
||||
var startTag, endTag *Tag // both ends of the chain when parsing chained tags
|
||||
|
||||
// accumulators
|
||||
var tagName string // current tag name
|
||||
var value string // current value
|
||||
var valueType ValueType // current value type
|
||||
cur := Arg{} // current argument
|
||||
var args []Arg // current arguments slice
|
||||
|
||||
s := scanner{buf: []rune(input)} // scanner for parsing the tag string
|
||||
var incomplete bool // tracks if a token is incomplete
|
||||
|
||||
// These are defined outside the loop to make errors easier.
|
||||
saveArg := func(v string, t ArgType) {
|
||||
cur.Value = v
|
||||
cur.Type = t
|
||||
args = append(args, cur)
|
||||
cur = Arg{}
|
||||
}
|
||||
saveInt := func(v string) { saveArg(v, ArgTypeInt) }
|
||||
saveString := func(v string) { saveArg(v, ArgTypeString) }
|
||||
saveBoolOrString := func(value string) {
|
||||
if value == "true" || value == "false" {
|
||||
saveArg(value, ArgTypeBool)
|
||||
} else {
|
||||
saveArg(value, ArgTypeString)
|
||||
}
|
||||
}
|
||||
saveName := func(value string) {
|
||||
cur.Name = value
|
||||
}
|
||||
saveTag := func() error {
|
||||
usingNamedArgs := false
|
||||
for i, arg := range args {
|
||||
if (usingNamedArgs && arg.Name == "") || (!usingNamedArgs && arg.Name != "" && i > 0) {
|
||||
return fmt.Errorf("can't mix named and positional arguments")
|
||||
}
|
||||
if arg.Name != "" {
|
||||
usingNamedArgs = true
|
||||
}
|
||||
}
|
||||
if !usingNamedArgs && len(args) > 1 {
|
||||
return fmt.Errorf("multiple arguments must use 'name: value' syntax")
|
||||
}
|
||||
newTag := &Tag{Name: tagName, Args: args}
|
||||
if startTag == nil {
|
||||
startTag = newTag
|
||||
endTag = newTag
|
||||
} else {
|
||||
endTag.ValueTag = newTag
|
||||
endTag.ValueType = ValueTypeTag
|
||||
endTag = newTag
|
||||
}
|
||||
args = nil // Reset to nil instead of empty slice
|
||||
return nil
|
||||
}
|
||||
saveValue := func() {
|
||||
endTag.Value = value
|
||||
endTag.ValueType = valueType
|
||||
}
|
||||
var err error
|
||||
st := stTag
|
||||
parseLoop:
|
||||
for r := s.peek(); r != EOF; r = s.peek() {
|
||||
switch st {
|
||||
case stTag: // Any leading whitespace is expected to be trimmed before parsing.
|
||||
switch {
|
||||
case isIdentBegin(r):
|
||||
tagName, err = s.nextIdent(isTagNameInterior)
|
||||
if err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
st = stMaybeArgs
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
case stMaybeArgs:
|
||||
switch {
|
||||
case r == '(':
|
||||
s.next() // consume (
|
||||
incomplete = true
|
||||
st = stArg
|
||||
case r == '=':
|
||||
s.next() // consume =
|
||||
if opts.rawValues {
|
||||
// only raw values support empty values following =
|
||||
valueType = ValueTypeRaw
|
||||
} else {
|
||||
incomplete = true
|
||||
}
|
||||
st = stValue
|
||||
default:
|
||||
st = stMaybeComment
|
||||
}
|
||||
case stArg:
|
||||
switch {
|
||||
case r == ')':
|
||||
s.next() // consume )
|
||||
incomplete = false
|
||||
st = stMaybeValue
|
||||
case r == '-' || r == '+' || unicode.IsDigit(r):
|
||||
number, err := s.nextNumber()
|
||||
if err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
saveInt(number)
|
||||
st = stArgEndOfToken
|
||||
case r == '"' || r == '`':
|
||||
str, err := s.nextString()
|
||||
if err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
saveString(str)
|
||||
st = stArgEndOfToken
|
||||
case isIdentBegin(r):
|
||||
identifier, err := s.nextIdent(isIdentInterior)
|
||||
if err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
r = s.peek() // reset r after nextIdent
|
||||
|
||||
switch {
|
||||
case r == ',' || r == ')': // positional arg
|
||||
if r == ',' {
|
||||
r = s.skipWhitespace() // allow whitespace after ,
|
||||
}
|
||||
saveBoolOrString(identifier)
|
||||
st = stArgEndOfToken
|
||||
case r == ':': // named arg
|
||||
s.next() // consume :
|
||||
r = s.skipWhitespace() // allow whitespace after :
|
||||
saveName(identifier)
|
||||
st = stArg
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
case stArgEndOfToken:
|
||||
switch {
|
||||
case r == ',':
|
||||
s.next() // consume ,
|
||||
r = s.skipWhitespace() // allow whitespace after ,
|
||||
st = stArg
|
||||
case r == ')':
|
||||
s.next() // consume )
|
||||
incomplete = false
|
||||
st = stMaybeValue
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
case stMaybeValue:
|
||||
switch {
|
||||
case r == '=':
|
||||
s.next() // consume =
|
||||
if opts.rawValues {
|
||||
// Empty values are allowed for raw.
|
||||
// Since = might be the last char in the input, we need
|
||||
// to record the valueType as raw immediately.
|
||||
valueType = ValueTypeRaw
|
||||
}
|
||||
st = stValue
|
||||
default:
|
||||
st = stMaybeComment
|
||||
}
|
||||
case stValue:
|
||||
switch {
|
||||
case opts.rawValues: // When enabled, consume all remaining chars
|
||||
incomplete = false
|
||||
value = s.remainder()
|
||||
break parseLoop
|
||||
case r == '+' && isIdentBegin(s.peekN(1)): // tag value
|
||||
incomplete = false
|
||||
s.next() // consume +
|
||||
if err := saveTag(); err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
st = stTag
|
||||
case r == '-' || r == '+' || unicode.IsDigit(r):
|
||||
incomplete = false
|
||||
number, err := s.nextNumber()
|
||||
valueType = ValueTypeInt
|
||||
if err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
value = number
|
||||
st = stMaybeComment
|
||||
case r == '"' || r == '`':
|
||||
incomplete = false
|
||||
str, err := s.nextString()
|
||||
if err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
value = str
|
||||
valueType = ValueTypeString
|
||||
st = stMaybeComment
|
||||
case isIdentBegin(r):
|
||||
incomplete = false
|
||||
str, err := s.nextIdent(isIdentInterior)
|
||||
if err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
value = str
|
||||
if str == "true" || str == "false" {
|
||||
valueType = ValueTypeBool
|
||||
} else {
|
||||
valueType = ValueTypeString
|
||||
}
|
||||
st = stMaybeComment
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
case stMaybeComment:
|
||||
switch {
|
||||
case s.nextIsTrailingComment():
|
||||
s.remainder()
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
default:
|
||||
return Tag{}, fmt.Errorf("unexpected internal parser error: unknown state: %s at position %d", st, s.pos)
|
||||
}
|
||||
}
|
||||
if s.peek() != EOF {
|
||||
return Tag{}, fmt.Errorf("unexpected character %q at position %d", s.next(), s.pos)
|
||||
}
|
||||
if incomplete {
|
||||
return Tag{}, fmt.Errorf("unexpected end of input")
|
||||
}
|
||||
if err := saveTag(); err != nil {
|
||||
return Tag{}, err
|
||||
}
|
||||
if len(valueType) > 0 {
|
||||
saveValue()
|
||||
}
|
||||
if startTag == nil {
|
||||
return Tag{}, fmt.Errorf("unexpected internal parser error: no tags parsed")
|
||||
}
|
||||
return *startTag, nil
|
||||
}
|
||||
|
||||
func isIdentBegin(r rune) bool {
|
||||
return unicode.IsLetter(r) || r == '_'
|
||||
}
|
||||
|
||||
func isIdentInterior(r rune) bool {
|
||||
return unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_' || r == '.' || r == '-'
|
||||
}
|
||||
|
||||
func isTagNameInterior(r rune) bool {
|
||||
return isIdentInterior(r) || r == ':'
|
||||
}
|
||||
228
vendor/k8s.io/gengo/v2/codetags/scanner.go
generated
vendored
Normal file
228
vendor/k8s.io/gengo/v2/codetags/scanner.go
generated
vendored
Normal file
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
Copyright 2025 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 codetags
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
type scanner struct {
|
||||
buf []rune
|
||||
pos int
|
||||
}
|
||||
|
||||
func (s *scanner) next() rune {
|
||||
if s.pos >= len(s.buf) {
|
||||
return EOF
|
||||
}
|
||||
r := s.buf[s.pos]
|
||||
s.pos++
|
||||
return r
|
||||
}
|
||||
|
||||
func (s *scanner) peek() rune {
|
||||
return s.peekN(0)
|
||||
}
|
||||
|
||||
func (s *scanner) peekN(n int) rune {
|
||||
if s.pos+n >= len(s.buf) {
|
||||
return EOF
|
||||
}
|
||||
return s.buf[s.pos+n]
|
||||
}
|
||||
|
||||
func (s *scanner) skipWhitespace() rune {
|
||||
for r := s.peek(); unicode.IsSpace(r); r = s.peek() {
|
||||
s.next()
|
||||
}
|
||||
return s.peek()
|
||||
}
|
||||
|
||||
func (s *scanner) remainder() string {
|
||||
result := string(s.buf[s.pos:])
|
||||
s.pos = len(s.buf)
|
||||
return result
|
||||
}
|
||||
|
||||
const (
|
||||
EOF = -1
|
||||
)
|
||||
|
||||
func (s *scanner) nextIsTrailingComment() bool {
|
||||
i := 0
|
||||
for ; unicode.IsSpace(s.peekN(i)); i++ {
|
||||
}
|
||||
return s.peekN(i) == '#'
|
||||
}
|
||||
|
||||
func (s *scanner) nextNumber() (string, error) {
|
||||
const (
|
||||
stBegin = "stBegin"
|
||||
stPrefix = "stPrefix"
|
||||
stPosNeg = "stPosNeg"
|
||||
stNumber = "stNumber"
|
||||
)
|
||||
var buf bytes.Buffer
|
||||
st := stBegin
|
||||
|
||||
parseLoop:
|
||||
for r := s.peek(); r != EOF; r = s.peek() {
|
||||
switch st {
|
||||
case stBegin:
|
||||
switch {
|
||||
case r == '0':
|
||||
buf.WriteRune(s.next())
|
||||
st = stPrefix
|
||||
case r == '+' || r == '-':
|
||||
buf.WriteRune(s.next())
|
||||
st = stPosNeg
|
||||
case unicode.IsDigit(r):
|
||||
buf.WriteRune(s.next())
|
||||
st = stNumber
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
case stPosNeg:
|
||||
switch {
|
||||
case r == '0':
|
||||
buf.WriteRune(s.next())
|
||||
st = stPrefix
|
||||
case unicode.IsDigit(r):
|
||||
buf.WriteRune(s.next())
|
||||
st = stNumber
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
case stPrefix:
|
||||
switch {
|
||||
case unicode.IsDigit(r):
|
||||
buf.WriteRune(s.next())
|
||||
st = stNumber
|
||||
case r == 'x' || r == 'o' || r == 'b':
|
||||
buf.WriteRune(s.next())
|
||||
st = stNumber
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
case stNumber:
|
||||
const hexits = "abcdefABCDEF"
|
||||
switch {
|
||||
case unicode.IsDigit(r) || strings.Contains(hexits, string(r)):
|
||||
buf.WriteRune(s.next())
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
default:
|
||||
return "", fmt.Errorf("unexpected internal parser error: unknown state: %s at position %d", st, s.pos)
|
||||
}
|
||||
}
|
||||
numStr := buf.String()
|
||||
if _, err := strconv.ParseInt(numStr, 0, 64); err != nil {
|
||||
return "", fmt.Errorf("invalid number %q at position %d", numStr, s.pos)
|
||||
}
|
||||
return numStr, nil
|
||||
}
|
||||
|
||||
func (s *scanner) nextString() (string, error) {
|
||||
const (
|
||||
stBegin = "stBegin"
|
||||
stQuotedString = "stQuotedString"
|
||||
stEscape = "stEscape"
|
||||
)
|
||||
var buf bytes.Buffer
|
||||
var quote rune
|
||||
var incomplete bool
|
||||
st := stBegin
|
||||
|
||||
parseLoop:
|
||||
for r := s.peek(); r != EOF; r = s.peek() {
|
||||
switch st {
|
||||
case stBegin:
|
||||
switch {
|
||||
case r == '"' || r == '`':
|
||||
incomplete = true
|
||||
quote = s.next() // consume quote
|
||||
st = stQuotedString
|
||||
default:
|
||||
return "", fmt.Errorf("expected string at position %d", s.pos)
|
||||
}
|
||||
case stQuotedString:
|
||||
switch {
|
||||
case r == '\\':
|
||||
s.next() // consume escape
|
||||
st = stEscape
|
||||
case r == quote:
|
||||
incomplete = false
|
||||
s.next()
|
||||
break parseLoop
|
||||
default:
|
||||
buf.WriteRune(s.next())
|
||||
}
|
||||
case stEscape:
|
||||
switch {
|
||||
case r == quote || r == '\\':
|
||||
buf.WriteRune(s.next())
|
||||
st = stQuotedString
|
||||
default:
|
||||
return "", fmt.Errorf("unhandled escaped character %q", r)
|
||||
}
|
||||
default:
|
||||
return "", fmt.Errorf("unexpected internal parser error: unknown state: %s at position %d", st, s.pos)
|
||||
}
|
||||
}
|
||||
if incomplete {
|
||||
return "", fmt.Errorf("unterminated string at position %d", s.pos)
|
||||
}
|
||||
return buf.String(), nil
|
||||
}
|
||||
|
||||
func (s *scanner) nextIdent(isInteriorChar func(r rune) bool) (string, error) {
|
||||
const (
|
||||
stBegin = "stBegin"
|
||||
stInterior = "stInterior"
|
||||
)
|
||||
var buf bytes.Buffer
|
||||
st := stBegin
|
||||
|
||||
parseLoop:
|
||||
for r := s.peek(); r != EOF; r = s.peek() {
|
||||
switch st {
|
||||
case stBegin:
|
||||
switch {
|
||||
case isIdentBegin(r):
|
||||
buf.WriteRune(s.next())
|
||||
st = stInterior
|
||||
default:
|
||||
return "", fmt.Errorf("expected identifier at position %d", s.pos)
|
||||
}
|
||||
case stInterior:
|
||||
switch {
|
||||
case isInteriorChar(r):
|
||||
buf.WriteRune(s.next())
|
||||
default:
|
||||
break parseLoop
|
||||
}
|
||||
default:
|
||||
return "", fmt.Errorf("unexpected internal parser error: unknown state: %s at position %d", st, s.pos)
|
||||
}
|
||||
}
|
||||
return buf.String(), nil
|
||||
}
|
||||
169
vendor/k8s.io/gengo/v2/codetags/types.go
generated
vendored
Normal file
169
vendor/k8s.io/gengo/v2/codetags/types.go
generated
vendored
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
Copyright 2025 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 codetags
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Tag represents a single comment tag with typed args.
|
||||
type Tag struct {
|
||||
// Name is the name of the tag with no arguments.
|
||||
Name string
|
||||
|
||||
// Args is a list of optional arguments to the tag.
|
||||
Args []Arg
|
||||
|
||||
// Value is the string representation of the tag value.
|
||||
// Provides the tag value when ValueType is ValueTypeString, ValueTypeBool, ValueTypeInt or ValueTypeRaw.
|
||||
Value string
|
||||
|
||||
// ValueTag is another tag parsed from the value of this tag.
|
||||
// Provides the tag value when ValueType is ValueTypeTag.
|
||||
ValueTag *Tag
|
||||
|
||||
// ValueType is the type of the value.
|
||||
ValueType ValueType
|
||||
}
|
||||
|
||||
// PositionalArg returns the positional argument. If there is no positional
|
||||
// argument, it returns false.
|
||||
func (t Tag) PositionalArg() (Arg, bool) {
|
||||
if len(t.Args) == 0 || len(t.Args[0].Name) > 0 {
|
||||
return Arg{}, false
|
||||
}
|
||||
return t.Args[0], true
|
||||
}
|
||||
|
||||
// NamedArg returns the named argument. If o named argument is found, it returns
|
||||
// false. Always returns false for empty name; use PositionalArg instead.
|
||||
func (t Tag) NamedArg(name string) (Arg, bool) {
|
||||
if len(name) == 0 {
|
||||
return Arg{}, false
|
||||
}
|
||||
for _, arg := range t.Args {
|
||||
if arg.Name == name {
|
||||
return arg, true
|
||||
}
|
||||
}
|
||||
return Arg{}, false
|
||||
}
|
||||
|
||||
// String returns the canonical string representation of the tag.
|
||||
// All strings are represented in double quotes. Spacing is normalized.
|
||||
func (t Tag) String() string {
|
||||
buf := strings.Builder{}
|
||||
buf.WriteString(t.Name)
|
||||
if len(t.Args) > 0 {
|
||||
buf.WriteString("(")
|
||||
for i, a := range t.Args {
|
||||
if i > 0 {
|
||||
buf.WriteString(", ")
|
||||
}
|
||||
buf.WriteString(a.String())
|
||||
}
|
||||
buf.WriteString(")")
|
||||
}
|
||||
if t.ValueType != ValueTypeNone {
|
||||
if t.ValueType == ValueTypeTag {
|
||||
buf.WriteString("=+")
|
||||
buf.WriteString(t.ValueTag.String())
|
||||
} else {
|
||||
buf.WriteString("=")
|
||||
if t.ValueType == ValueTypeString {
|
||||
buf.WriteString(strconv.Quote(t.Value))
|
||||
} else {
|
||||
buf.WriteString(t.Value)
|
||||
}
|
||||
}
|
||||
}
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
// Arg represents a argument.
|
||||
type Arg struct {
|
||||
// Name is the name of a named argument. This is zero-valued for positional arguments.
|
||||
Name string
|
||||
|
||||
// Value is the string value of an argument. It has been validated to match the Type.
|
||||
// See the ArgType const godoc for further details on how to parse the value for the
|
||||
// Type.
|
||||
Value string
|
||||
|
||||
// Type identifies the type of the argument.
|
||||
Type ArgType
|
||||
}
|
||||
|
||||
func (a Arg) String() string {
|
||||
buf := strings.Builder{}
|
||||
if len(a.Name) > 0 {
|
||||
buf.WriteString(a.Name)
|
||||
buf.WriteString(": ")
|
||||
}
|
||||
if a.Type == ArgTypeString {
|
||||
buf.WriteString(strconv.Quote(a.Value))
|
||||
} else {
|
||||
buf.WriteString(a.Value)
|
||||
}
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
// ArgType is an argument's type.
|
||||
type ArgType string
|
||||
|
||||
const (
|
||||
// ArgTypeString identifies string values.
|
||||
ArgTypeString ArgType = "string"
|
||||
|
||||
// ArgTypeInt identifies int values. Values of this type may be in decimal,
|
||||
// octal, hex or binary string representations. Consider using strconv.ParseInt
|
||||
// to parse, as it supports all these string representations.
|
||||
ArgTypeInt ArgType = "int"
|
||||
|
||||
// ArgTypeBool identifies bool values. Values of this type must either be the
|
||||
// string "true" or "false".
|
||||
ArgTypeBool ArgType = "bool"
|
||||
)
|
||||
|
||||
// ValueType is a tag's value type.
|
||||
type ValueType string
|
||||
|
||||
const (
|
||||
// ValueTypeNone indicates that the tag has no value.
|
||||
ValueTypeNone ValueType = ""
|
||||
|
||||
// ValueTypeString identifies string values.
|
||||
ValueTypeString ValueType = "string"
|
||||
|
||||
// ValueTypeInt identifies int values. Values of this type may be in decimal,
|
||||
// octal, hex or binary string representations. Consider using strconv.ParseInt
|
||||
// to parse, as it supports all these string representations.
|
||||
ValueTypeInt ValueType = "int"
|
||||
|
||||
// ValueTypeBool identifies bool values. Values of this type must either be the
|
||||
// string "true" or "false".
|
||||
ValueTypeBool ValueType = "bool"
|
||||
|
||||
// ValueTypeTag identifies that the value is another tag.
|
||||
ValueTypeTag ValueType = "tag"
|
||||
|
||||
// ValueTypeRaw identifies that the value is raw, untyped content and contains
|
||||
// all text from the tag declaration following the "=" sign, up to the last
|
||||
// non-whitespace character.
|
||||
ValueTypeRaw ValueType = "raw"
|
||||
)
|
||||
194
vendor/k8s.io/gengo/v2/comments.go
generated
vendored
Normal file
194
vendor/k8s.io/gengo/v2/comments.go
generated
vendored
Normal file
@@ -0,0 +1,194 @@
|
||||
/*
|
||||
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 gengo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"k8s.io/gengo/v2/codetags"
|
||||
)
|
||||
|
||||
// ExtractCommentTags parses comments for lines of the form:
|
||||
//
|
||||
// 'marker' + "key=value".
|
||||
//
|
||||
// Values are optional; "" is the default. A tag can be specified more than
|
||||
// one time and all values are returned. If the resulting map has an entry for
|
||||
// a key, the value (a slice) is guaranteed to have at least 1 element.
|
||||
//
|
||||
// Example: if you pass "+" for 'marker', and the following lines are in
|
||||
// the comments:
|
||||
//
|
||||
// +foo=value1
|
||||
// +bar
|
||||
// +foo=value2
|
||||
// +baz="qux"
|
||||
//
|
||||
// Then this function will return:
|
||||
//
|
||||
// map[string][]string{"foo":{"value1, "value2"}, "bar": {""}, "baz": {`"qux"`}}
|
||||
//
|
||||
// Deprecated: Prefer codetags.Extract and codetags.Parse.
|
||||
func ExtractCommentTags(marker string, lines []string) map[string][]string {
|
||||
out := map[string][]string{}
|
||||
for _, line := range lines {
|
||||
line = strings.Trim(line, " ")
|
||||
if len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
if !strings.HasPrefix(line, marker) {
|
||||
continue
|
||||
}
|
||||
kv := strings.SplitN(line[len(marker):], "=", 2)
|
||||
if len(kv) == 2 {
|
||||
out[kv[0]] = append(out[kv[0]], kv[1])
|
||||
} else if len(kv) == 1 {
|
||||
out[kv[0]] = append(out[kv[0]], "")
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// ExtractSingleBoolCommentTag parses comments for lines of the form:
|
||||
//
|
||||
// 'marker' + "key=value1"
|
||||
//
|
||||
// If the tag is not found, the default value is returned. Values are asserted
|
||||
// to be boolean ("true" or "false"), and any other value will cause an error
|
||||
// to be returned. If the key has multiple values, the first one will be used.
|
||||
//
|
||||
// This function is a wrapper around codetags.Extract and codetags.Parse, but only supports tags with
|
||||
// a single position arg of type string, and a value of type bool.
|
||||
func ExtractSingleBoolCommentTag(marker string, key string, defaultVal bool, lines []string) (bool, error) {
|
||||
tags, err := ExtractFunctionStyleCommentTags(marker, []string{key}, lines, ParseValues(true))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
values := tags[key]
|
||||
if values == nil {
|
||||
return defaultVal, nil
|
||||
}
|
||||
if values[0].Value == "true" {
|
||||
return true, nil
|
||||
}
|
||||
if values[0].Value == "false" {
|
||||
return false, nil
|
||||
}
|
||||
return false, fmt.Errorf("tag value for %q is not boolean: %q", key, values[0])
|
||||
}
|
||||
|
||||
// ExtractFunctionStyleCommentTags parses comments for special metadata tags.
|
||||
//
|
||||
// This function is a wrapper around codetags.Extract and codetags.Parse, but only supports tags with
|
||||
// a single position arg of type string.
|
||||
func ExtractFunctionStyleCommentTags(marker string, tagNames []string, lines []string, options ...TagOption) (map[string][]Tag, error) {
|
||||
opts := tagOpts{}
|
||||
for _, o := range options {
|
||||
o(&opts)
|
||||
}
|
||||
|
||||
out := map[string][]Tag{}
|
||||
|
||||
tags := codetags.Extract(marker, lines)
|
||||
for tagName, tagLines := range tags {
|
||||
if len(tagNames) > 0 && !slices.Contains(tagNames, tagName) {
|
||||
continue
|
||||
}
|
||||
for _, line := range tagLines {
|
||||
typedTag, err := codetags.Parse(line, codetags.RawValues(!opts.parseValues))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tag, err := toStringArgs(typedTag)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out[tagName] = append(out[tagName], tag)
|
||||
}
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// TagOption provides an option for extracting tags.
|
||||
type TagOption func(opts *tagOpts)
|
||||
|
||||
// ParseValues enables parsing of tag values. When enabled, tag values must
|
||||
// be valid quoted strings, ints, booleans, identifiers, or tags. Otherwise, a
|
||||
// parse error will be returned. Also, when enabled, trailing comments are
|
||||
// ignored.
|
||||
// Default: disabled
|
||||
func ParseValues(enabled bool) TagOption {
|
||||
return func(opts *tagOpts) {
|
||||
opts.parseValues = enabled
|
||||
}
|
||||
}
|
||||
|
||||
type tagOpts struct {
|
||||
parseValues bool
|
||||
}
|
||||
|
||||
func toStringArgs(tag codetags.Tag) (Tag, error) {
|
||||
var stringArgs []string
|
||||
if len(tag.Args) > 1 {
|
||||
return Tag{}, fmt.Errorf("expected one argument, got: %v", tag.Args)
|
||||
}
|
||||
for _, arg := range tag.Args {
|
||||
if len(arg.Name) > 0 {
|
||||
return Tag{}, fmt.Errorf("unexpected named argument: %q", arg.Name)
|
||||
}
|
||||
if arg.Type != codetags.ArgTypeString {
|
||||
return Tag{}, fmt.Errorf("unexpected argument type: %s", arg.Type)
|
||||
} else {
|
||||
stringArgs = append(stringArgs, arg.Value)
|
||||
}
|
||||
}
|
||||
return Tag{
|
||||
Name: tag.Name,
|
||||
Args: stringArgs,
|
||||
Value: tag.Value,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Tag represents a single comment tag.
|
||||
type Tag struct {
|
||||
// Name is the name of the tag with no arguments.
|
||||
Name string
|
||||
// Args is a list of optional arguments to the tag.
|
||||
Args []string
|
||||
// Value is the value of the tag.
|
||||
Value string
|
||||
}
|
||||
|
||||
func (t Tag) String() string {
|
||||
buf := bytes.Buffer{}
|
||||
buf.WriteString(t.Name)
|
||||
if len(t.Args) > 0 {
|
||||
buf.WriteString("(")
|
||||
for i, a := range t.Args {
|
||||
if i > 0 {
|
||||
buf.WriteString(", ")
|
||||
}
|
||||
buf.WriteString(a)
|
||||
}
|
||||
buf.WriteString(")")
|
||||
}
|
||||
return buf.String()
|
||||
}
|
||||
98
vendor/k8s.io/gengo/v2/execute.go
generated
vendored
Normal file
98
vendor/k8s.io/gengo/v2/execute.go
generated
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
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 gengo is a code-generation framework.
|
||||
package gengo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"k8s.io/gengo/v2/generator"
|
||||
"k8s.io/gengo/v2/namer"
|
||||
"k8s.io/gengo/v2/parser"
|
||||
)
|
||||
|
||||
// StdBuildTag is a suggested build-tag which tools can use both as an argument
|
||||
// to GoBoilerplate and to Execute.
|
||||
const StdBuildTag = "ignore_autogenerated"
|
||||
|
||||
// StdGeneratedBy is a suggested "generated by" line which tools can use as an
|
||||
// argument to GoBoilerplate.
|
||||
const StdGeneratedBy = "// Code generated by GENERATOR_NAME. DO NOT EDIT."
|
||||
|
||||
// GoBoilerplate returns the Go file header:
|
||||
// - an optional build tag (negative, set it to ignore generated code)
|
||||
// - an optional boilerplate file
|
||||
// - an optional "generated by" comment
|
||||
func GoBoilerplate(headerFile, buildTag, generatedBy string) ([]byte, error) {
|
||||
buf := bytes.Buffer{}
|
||||
|
||||
if buildTag != "" {
|
||||
buf.WriteString(
|
||||
fmt.Sprintf("//go:build !%s\n// +build !%s\n\n", buildTag, buildTag))
|
||||
}
|
||||
|
||||
if headerFile != "" {
|
||||
b, err := os.ReadFile(headerFile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
b = bytes.ReplaceAll(b, []byte("YEAR"), []byte(strconv.Itoa(time.Now().UTC().Year())))
|
||||
buf.Write(b)
|
||||
buf.WriteByte('\n')
|
||||
}
|
||||
|
||||
if generatedBy != "" {
|
||||
generatorName := filepath.Base(os.Args[0])
|
||||
// Strip the extension from the name to normalize output between *nix and Windows.
|
||||
generatorName = generatorName[:len(generatorName)-len(filepath.Ext(generatorName))]
|
||||
generatedByComment := strings.ReplaceAll(generatedBy, "GENERATOR_NAME", generatorName)
|
||||
buf.WriteString(fmt.Sprintf("%s\n\n", generatedByComment))
|
||||
}
|
||||
|
||||
return buf.Bytes(), nil
|
||||
}
|
||||
|
||||
// Execute implements most of a tool's main loop.
|
||||
func Execute(nameSystems namer.NameSystems, defaultSystem string, getTargets func(*generator.Context) []generator.Target, buildTag string, patterns []string) error {
|
||||
var buildTags []string
|
||||
if buildTag != "" {
|
||||
buildTags = append(buildTags, buildTag)
|
||||
}
|
||||
|
||||
p := parser.NewWithOptions(parser.Options{BuildTags: buildTags})
|
||||
if err := p.LoadPackages(patterns...); err != nil {
|
||||
return fmt.Errorf("failed making a parser: %v", err)
|
||||
}
|
||||
|
||||
c, err := generator.NewContext(p, nameSystems, defaultSystem)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed making a context: %v", err)
|
||||
}
|
||||
|
||||
targets := getTargets(c)
|
||||
if err := c.ExecuteTargets(targets); err != nil {
|
||||
return fmt.Errorf("failed executing generator: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
31
vendor/k8s.io/gengo/v2/generator/doc.go
generated
vendored
Normal file
31
vendor/k8s.io/gengo/v2/generator/doc.go
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
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 generator defines an interface for code generators to implement.
|
||||
//
|
||||
// To use this package, you'll implement the "Package" and "Generator"
|
||||
// interfaces; you'll call NewContext to load up the types you want to work
|
||||
// with, and then you'll call one or more of the Execute methods. See the
|
||||
// interface definitions for explanations. All output will have gofmt called on
|
||||
// it automatically, so you do not need to worry about generating correct
|
||||
// indentation.
|
||||
//
|
||||
// This package also exposes SnippetWriter. SnippetWriter reduces to a minimum
|
||||
// the boilerplate involved in setting up a template from go's text/template
|
||||
// package. Additionally, all naming systems in the Context will be added as
|
||||
// functions to the parsed template, so that they can be called directly from
|
||||
// your templates!
|
||||
package generator // import "k8s.io/gengo/v2/generator"
|
||||
50
vendor/k8s.io/gengo/v2/generator/error_tracker.go
generated
vendored
Normal file
50
vendor/k8s.io/gengo/v2/generator/error_tracker.go
generated
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
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 generator
|
||||
|
||||
import (
|
||||
"io"
|
||||
)
|
||||
|
||||
// ErrorTracker tracks errors to the underlying writer, so that you can ignore
|
||||
// them until you're ready to return.
|
||||
type ErrorTracker struct {
|
||||
io.Writer
|
||||
err error
|
||||
}
|
||||
|
||||
// NewErrorTracker makes a new error tracker; note that it implements io.Writer.
|
||||
func NewErrorTracker(w io.Writer) *ErrorTracker {
|
||||
return &ErrorTracker{Writer: w}
|
||||
}
|
||||
|
||||
// Write intercepts calls to Write.
|
||||
func (et *ErrorTracker) Write(p []byte) (n int, err error) {
|
||||
if et.err != nil {
|
||||
return 0, et.err
|
||||
}
|
||||
n, err = et.Writer.Write(p)
|
||||
if err != nil {
|
||||
et.err = err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Error returns nil if no error has occurred, otherwise it returns the error.
|
||||
func (et *ErrorTracker) Error() error {
|
||||
return et.err
|
||||
}
|
||||
273
vendor/k8s.io/gengo/v2/generator/execute.go
generated
vendored
Normal file
273
vendor/k8s.io/gengo/v2/generator/execute.go
generated
vendored
Normal file
@@ -0,0 +1,273 @@
|
||||
/*
|
||||
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 generator
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"golang.org/x/tools/imports"
|
||||
|
||||
"k8s.io/gengo/v2/namer"
|
||||
"k8s.io/gengo/v2/types"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// ExecuteTargets runs the generators for the provided targets.
|
||||
func (c *Context) ExecuteTargets(targets []Target) error {
|
||||
klog.V(5).Infof("ExecuteTargets: %d targets", len(targets))
|
||||
|
||||
var errs []error
|
||||
for _, tgt := range targets {
|
||||
if err := c.ExecuteTarget(tgt); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
if len(errs) > 0 {
|
||||
return fmt.Errorf("some targets had errors: %w", errors.Join(errs...))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type DefaultFileType struct {
|
||||
Format func([]byte) ([]byte, error)
|
||||
Assemble func(io.Writer, *File)
|
||||
}
|
||||
|
||||
func (ft DefaultFileType) AssembleFile(f *File, pathname string) error {
|
||||
klog.V(5).Infof("Assembling file %q", pathname)
|
||||
|
||||
destFile, err := os.Create(pathname)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer destFile.Close()
|
||||
|
||||
b := &bytes.Buffer{}
|
||||
et := NewErrorTracker(b)
|
||||
ft.Assemble(et, f)
|
||||
if et.Error() != nil {
|
||||
return et.Error()
|
||||
}
|
||||
if formatted, err := ft.Format(b.Bytes()); err != nil {
|
||||
err = fmt.Errorf("unable to format file %q (%v)", pathname, err)
|
||||
// Write the file anyway, so they can see what's going wrong and fix the generator.
|
||||
if _, err2 := destFile.Write(b.Bytes()); err2 != nil {
|
||||
return err2
|
||||
}
|
||||
return err
|
||||
} else {
|
||||
_, err = destFile.Write(formatted)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
func assembleGoFile(w io.Writer, f *File) {
|
||||
w.Write(f.Header)
|
||||
fmt.Fprintf(w, "package %v\n\n", f.PackageName)
|
||||
|
||||
if len(f.Imports) > 0 {
|
||||
fmt.Fprint(w, "import (\n")
|
||||
for i := range f.Imports {
|
||||
if strings.Contains(i, "\"") {
|
||||
// they included quotes, or are using the
|
||||
// `name "path/to/pkg"` format.
|
||||
fmt.Fprintf(w, "\t%s\n", i)
|
||||
} else {
|
||||
fmt.Fprintf(w, "\t%q\n", i)
|
||||
}
|
||||
}
|
||||
fmt.Fprint(w, ")\n\n")
|
||||
}
|
||||
|
||||
if f.Vars.Len() > 0 {
|
||||
fmt.Fprint(w, "var (\n")
|
||||
w.Write(f.Vars.Bytes())
|
||||
fmt.Fprint(w, ")\n\n")
|
||||
}
|
||||
|
||||
if f.Consts.Len() > 0 {
|
||||
fmt.Fprint(w, "const (\n")
|
||||
w.Write(f.Consts.Bytes())
|
||||
fmt.Fprint(w, ")\n\n")
|
||||
}
|
||||
|
||||
w.Write(f.Body.Bytes())
|
||||
}
|
||||
|
||||
func importsWrapper(src []byte) ([]byte, error) {
|
||||
opt := imports.Options{
|
||||
Comments: true,
|
||||
TabIndent: true,
|
||||
TabWidth: 8,
|
||||
FormatOnly: true, // Disable the insertion and deletion of imports
|
||||
}
|
||||
return imports.Process("", src, &opt)
|
||||
}
|
||||
|
||||
func NewGoFile() *DefaultFileType {
|
||||
return &DefaultFileType{
|
||||
Format: importsWrapper,
|
||||
Assemble: assembleGoFile,
|
||||
}
|
||||
}
|
||||
|
||||
// format should be one line only, and not end with \n.
|
||||
func addIndentHeaderComment(b *bytes.Buffer, format string, args ...interface{}) {
|
||||
if b.Len() > 0 {
|
||||
fmt.Fprintf(b, "\n// "+format+"\n", args...)
|
||||
} else {
|
||||
fmt.Fprintf(b, "// "+format+"\n", args...)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Context) filteredBy(f func(*Context, *types.Type) bool) *Context {
|
||||
c2 := *c
|
||||
c2.Order = []*types.Type{}
|
||||
for _, t := range c.Order {
|
||||
if f(c, t) {
|
||||
c2.Order = append(c2.Order, t)
|
||||
}
|
||||
}
|
||||
return &c2
|
||||
}
|
||||
|
||||
// make a new context; inheret c.Namers, but add on 'namers'. In case of a name
|
||||
// collision, the namer in 'namers' wins.
|
||||
func (c *Context) addNameSystems(namers namer.NameSystems) *Context {
|
||||
if namers == nil {
|
||||
return c
|
||||
}
|
||||
c2 := *c
|
||||
// Copy the existing name systems so we don't corrupt a parent context
|
||||
c2.Namers = namer.NameSystems{}
|
||||
for k, v := range c.Namers {
|
||||
c2.Namers[k] = v
|
||||
}
|
||||
|
||||
for name, namer := range namers {
|
||||
c2.Namers[name] = namer
|
||||
}
|
||||
return &c2
|
||||
}
|
||||
|
||||
// ExecuteTarget runs the generators for a single target.
|
||||
func (c *Context) ExecuteTarget(tgt Target) error {
|
||||
tgtDir := tgt.Dir()
|
||||
if tgtDir == "" {
|
||||
return fmt.Errorf("no directory for target %s", tgt.Path())
|
||||
}
|
||||
klog.V(5).Infof("Executing target %q (%q)", tgt.Name(), tgtDir)
|
||||
|
||||
// Filter out any types the *package* doesn't care about.
|
||||
packageContext := c.filteredBy(tgt.Filter)
|
||||
|
||||
if err := os.MkdirAll(tgtDir, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
files := map[string]*File{}
|
||||
for _, g := range tgt.Generators(packageContext) {
|
||||
// Filter out types the *generator* doesn't care about.
|
||||
genContext := packageContext.filteredBy(g.Filter)
|
||||
// Now add any extra name systems defined by this generator
|
||||
genContext = genContext.addNameSystems(g.Namers(genContext))
|
||||
|
||||
fileType := g.FileType()
|
||||
if len(fileType) == 0 {
|
||||
return fmt.Errorf("generator %q must specify a file type", g.Name())
|
||||
}
|
||||
f := files[g.Filename()]
|
||||
if f == nil {
|
||||
// This is the first generator to reference this file, so start it.
|
||||
f = &File{
|
||||
Name: g.Filename(),
|
||||
FileType: fileType,
|
||||
PackageName: tgt.Name(),
|
||||
PackagePath: tgt.Path(),
|
||||
PackageDir: tgt.Dir(),
|
||||
Header: tgt.Header(g.Filename()),
|
||||
Imports: map[string]struct{}{},
|
||||
}
|
||||
files[f.Name] = f
|
||||
} else if f.FileType != g.FileType() {
|
||||
return fmt.Errorf("file %q already has type %q, but generator %q wants to use type %q", f.Name, f.FileType, g.Name(), g.FileType())
|
||||
}
|
||||
|
||||
if vars := g.PackageVars(genContext); len(vars) > 0 {
|
||||
addIndentHeaderComment(&f.Vars, "Package-wide variables from generator %q.", g.Name())
|
||||
for _, v := range vars {
|
||||
if _, err := fmt.Fprintf(&f.Vars, "%s\n", v); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
if consts := g.PackageConsts(genContext); len(consts) > 0 {
|
||||
addIndentHeaderComment(&f.Consts, "Package-wide consts from generator %q.", g.Name())
|
||||
for _, v := range consts {
|
||||
if _, err := fmt.Fprintf(&f.Consts, "%s\n", v); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
if err := genContext.executeBody(&f.Body, g); err != nil {
|
||||
return err
|
||||
}
|
||||
if imports := g.Imports(genContext); len(imports) > 0 {
|
||||
for _, i := range imports {
|
||||
f.Imports[i] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var errs []error
|
||||
for _, f := range files {
|
||||
finalPath := filepath.Join(tgtDir, f.Name)
|
||||
assembler, ok := c.FileTypes[f.FileType]
|
||||
if !ok {
|
||||
return fmt.Errorf("the file type %q registered for file %q does not exist in the context", f.FileType, f.Name)
|
||||
}
|
||||
if err := assembler.AssembleFile(f, finalPath); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
if len(errs) > 0 {
|
||||
return fmt.Errorf("errors in target %q: %w", tgt.Path(), errors.Join(errs...))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Context) executeBody(w io.Writer, generator Generator) error {
|
||||
et := NewErrorTracker(w)
|
||||
if err := generator.Init(c, et); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, t := range c.Order {
|
||||
if err := generator.GenerateType(c, t, et); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := generator.Finalize(c, et); err != nil {
|
||||
return err
|
||||
}
|
||||
return et.Error()
|
||||
}
|
||||
214
vendor/k8s.io/gengo/v2/generator/generator.go
generated
vendored
Normal file
214
vendor/k8s.io/gengo/v2/generator/generator.go
generated
vendored
Normal file
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
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 generator
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
|
||||
"k8s.io/gengo/v2/namer"
|
||||
"k8s.io/gengo/v2/parser"
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
// Target describes a Go package into which code will be generated. A single
|
||||
// Target may have many Generators, each of which emits one file.
|
||||
type Target interface {
|
||||
// Name returns the package short name (as in `package foo`).
|
||||
Name() string
|
||||
// Path returns the package import path (as in `import "example.com/foo"`).
|
||||
Path() string
|
||||
// Dir returns the location of the resulting package on disk. This may be
|
||||
// the same directory as an input package (when generating code in-place)
|
||||
// or a different directory entirely.
|
||||
Dir() string
|
||||
|
||||
// Filter should return true if this package cares about this type.
|
||||
// Otherwise, this type will be omitted from the type ordering for
|
||||
// this package.
|
||||
Filter(*Context, *types.Type) bool
|
||||
|
||||
// Header should return a header for the file, including comment markers.
|
||||
// Useful for copyright notices and doc strings. Include an
|
||||
// autogeneration notice! Do not include the "package x" line.
|
||||
Header(filename string) []byte
|
||||
|
||||
// Generators returns the list of generators for this package. It is
|
||||
// allowed for more than one generator to write to the same file.
|
||||
// A Context is passed in case the list of generators depends on the
|
||||
// input types.
|
||||
Generators(*Context) []Generator
|
||||
}
|
||||
|
||||
type File struct {
|
||||
Name string
|
||||
FileType string
|
||||
PackageName string
|
||||
Header []byte
|
||||
PackagePath string
|
||||
PackageDir string
|
||||
Imports map[string]struct{}
|
||||
Vars bytes.Buffer
|
||||
Consts bytes.Buffer
|
||||
Body bytes.Buffer
|
||||
}
|
||||
|
||||
type FileType interface {
|
||||
AssembleFile(f *File, path string) error
|
||||
}
|
||||
|
||||
// Generator is the contract for anything that wants to do auto-generation.
|
||||
// It's expected that the io.Writers passed to the below functions will be
|
||||
// ErrorTrackers; this allows implementations to not check for io errors,
|
||||
// making more readable code.
|
||||
//
|
||||
// The call order for the functions that take a Context is:
|
||||
// 1. Filter() // Subsequent calls see only types that pass this.
|
||||
// 2. Namers() // Subsequent calls see the namers provided by this.
|
||||
// 3. PackageVars()
|
||||
// 4. PackageConsts()
|
||||
// 5. Init()
|
||||
// 6. GenerateType() // Called N times, once per type in the context's Order.
|
||||
// 7. Imports()
|
||||
//
|
||||
// You may have multiple generators for the same file.
|
||||
type Generator interface {
|
||||
// The name of this generator. Will be included in generated comments.
|
||||
Name() string
|
||||
|
||||
// Filter should return true if this generator cares about this type.
|
||||
// (otherwise, GenerateType will not be called.)
|
||||
//
|
||||
// Filter is called before any of the generator's other functions;
|
||||
// subsequent calls will get a context with only the types that passed
|
||||
// this filter.
|
||||
Filter(*Context, *types.Type) bool
|
||||
|
||||
// If this generator needs special namers, return them here. These will
|
||||
// override the original namers in the context if there is a collision.
|
||||
// You may return nil if you don't need special names. These names will
|
||||
// be available in the context passed to the rest of the generator's
|
||||
// functions.
|
||||
//
|
||||
// A use case for this is to return a namer that tracks imports.
|
||||
Namers(*Context) namer.NameSystems
|
||||
|
||||
// Init should write an init function, and any other content that's not
|
||||
// generated per-type. (It's not intended for generator specific
|
||||
// initialization! Do that when your Target constructs the
|
||||
// Generators.)
|
||||
Init(*Context, io.Writer) error
|
||||
|
||||
// Finalize should write finish up functions, and any other content that's not
|
||||
// generated per-type.
|
||||
Finalize(*Context, io.Writer) error
|
||||
|
||||
// PackageVars should emit an array of variable lines. They will be
|
||||
// placed in a var ( ... ) block. There's no need to include a leading
|
||||
// \t or trailing \n.
|
||||
PackageVars(*Context) []string
|
||||
|
||||
// PackageConsts should emit an array of constant lines. They will be
|
||||
// placed in a const ( ... ) block. There's no need to include a leading
|
||||
// \t or trailing \n.
|
||||
PackageConsts(*Context) []string
|
||||
|
||||
// GenerateType should emit the code for a particular type.
|
||||
GenerateType(*Context, *types.Type, io.Writer) error
|
||||
|
||||
// Imports should return a list of necessary imports. They will be
|
||||
// formatted correctly. You do not need to include quotation marks,
|
||||
// return only the package name; alternatively, you can also return
|
||||
// imports in the format `name "path/to/pkg"`. Imports will be called
|
||||
// after Init, PackageVars, PackageConsts, and GenerateType, to allow
|
||||
// you to keep track of what imports you actually need.
|
||||
Imports(*Context) []string
|
||||
|
||||
// Preferred file name of this generator, not including a path. It is
|
||||
// allowed for multiple generators to use the same filename, but it's
|
||||
// up to you to make sure they don't have colliding import names.
|
||||
// TODO: provide per-file import tracking, removing the requirement
|
||||
// that generators coordinate..
|
||||
Filename() string
|
||||
|
||||
// A registered file type in the context to generate this file with. If
|
||||
// the FileType is not found in the context, execution will stop.
|
||||
FileType() string
|
||||
}
|
||||
|
||||
// Context is global context for individual generators to consume.
|
||||
type Context struct {
|
||||
// A map from the naming system to the names for that system. E.g., you
|
||||
// might have public names and several private naming systems.
|
||||
Namers namer.NameSystems
|
||||
|
||||
// All the types, in case you want to look up something.
|
||||
Universe types.Universe
|
||||
|
||||
// All the user-specified packages. This is after recursive expansion.
|
||||
Inputs []string
|
||||
|
||||
// The canonical ordering of the types (will be filtered by both the
|
||||
// Target's and Generator's Filter methods).
|
||||
Order []*types.Type
|
||||
|
||||
// A set of types this context can process. If this is empty or nil,
|
||||
// the default "go" filetype will be provided.
|
||||
FileTypes map[string]FileType
|
||||
|
||||
// Allows generators to add packages at runtime.
|
||||
parser *parser.Parser
|
||||
}
|
||||
|
||||
// NewContext generates a context from the given parser, naming systems, and
|
||||
// the naming system you wish to construct the canonical ordering from.
|
||||
func NewContext(p *parser.Parser, nameSystems namer.NameSystems, canonicalOrderName string) (*Context, error) {
|
||||
universe, err := p.NewUniverse()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c := &Context{
|
||||
Namers: namer.NameSystems{},
|
||||
Universe: universe,
|
||||
Inputs: p.UserRequestedPackages(),
|
||||
FileTypes: map[string]FileType{
|
||||
GoFileType: NewGoFile(),
|
||||
},
|
||||
parser: p,
|
||||
}
|
||||
|
||||
for name, systemNamer := range nameSystems {
|
||||
c.Namers[name] = systemNamer
|
||||
if name == canonicalOrderName {
|
||||
orderer := namer.Orderer{Namer: systemNamer}
|
||||
c.Order = orderer.OrderUniverse(universe)
|
||||
}
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
// LoadPackages adds Go packages to the context.
|
||||
func (c *Context) LoadPackages(patterns ...string) ([]*types.Package, error) {
|
||||
return c.parser.LoadPackagesTo(&c.Universe, patterns...)
|
||||
}
|
||||
|
||||
// FindPackages expands Go package patterns into a list of package import
|
||||
// paths, akin to `go list -find`.
|
||||
func (c *Context) FindPackages(patterns ...string) ([]string, error) {
|
||||
return c.parser.FindPackages(patterns...)
|
||||
}
|
||||
61
vendor/k8s.io/gengo/v2/generator/go_generator.go
generated
vendored
Normal file
61
vendor/k8s.io/gengo/v2/generator/go_generator.go
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
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 generator
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"k8s.io/gengo/v2/namer"
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
const (
|
||||
GoFileType = "go"
|
||||
)
|
||||
|
||||
// GoGenerator implements a do-nothing Generator for Go files. It can be
|
||||
// used as a base for custom Generators, which embed it and then define the
|
||||
// methods they need to specialize.
|
||||
type GoGenerator struct {
|
||||
// OutputFilename is used as the Generator's name, and filename.
|
||||
OutputFilename string
|
||||
|
||||
// Body, if present, will be used as the return from the "Init" method.
|
||||
// This causes it to be static content for the entire file if no other
|
||||
// generator touches the file.
|
||||
OptionalBody []byte
|
||||
}
|
||||
|
||||
func (gg GoGenerator) Name() string { return gg.OutputFilename }
|
||||
func (gg GoGenerator) Filter(*Context, *types.Type) bool { return true }
|
||||
func (gg GoGenerator) Namers(*Context) namer.NameSystems { return nil }
|
||||
func (gg GoGenerator) Imports(*Context) []string { return []string{} }
|
||||
func (gg GoGenerator) PackageVars(*Context) []string { return []string{} }
|
||||
func (gg GoGenerator) PackageConsts(*Context) []string { return []string{} }
|
||||
func (gg GoGenerator) GenerateType(*Context, *types.Type, io.Writer) error { return nil }
|
||||
func (gg GoGenerator) Filename() string { return gg.OutputFilename }
|
||||
func (gg GoGenerator) FileType() string { return GoFileType }
|
||||
func (gg GoGenerator) Finalize(*Context, io.Writer) error { return nil }
|
||||
|
||||
func (gg GoGenerator) Init(c *Context, w io.Writer) error {
|
||||
_, err := w.Write(gg.OptionalBody)
|
||||
return err
|
||||
}
|
||||
|
||||
var (
|
||||
_ = Generator(GoGenerator{})
|
||||
)
|
||||
96
vendor/k8s.io/gengo/v2/generator/import_tracker.go
generated
vendored
Normal file
96
vendor/k8s.io/gengo/v2/generator/import_tracker.go
generated
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
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 generator
|
||||
|
||||
import (
|
||||
"go/token"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"k8s.io/klog/v2"
|
||||
|
||||
"k8s.io/gengo/v2/namer"
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
// NewImportTrackerForPackage creates a new import tracker which is aware
|
||||
// of a generator's output package. The tracker will not add import lines
|
||||
// when symbols or types are added from the same package, and LocalNameOf
|
||||
// will return empty string for the output package.
|
||||
//
|
||||
// e.g.:
|
||||
//
|
||||
// tracker := NewImportTrackerForPackage("bar.com/pkg/foo")
|
||||
// tracker.AddSymbol(types.Name{"bar.com/pkg/foo.MyType"})
|
||||
// tracker.AddSymbol(types.Name{"bar.com/pkg/baz.MyType"})
|
||||
// tracker.AddSymbol(types.Name{"bar.com/pkg/baz/baz.MyType"})
|
||||
//
|
||||
// tracker.LocalNameOf("bar.com/pkg/foo") -> ""
|
||||
// tracker.LocalNameOf("bar.com/pkg/baz") -> "baz"
|
||||
// tracker.LocalNameOf("bar.com/pkg/baz/baz") -> "bazbaz"
|
||||
// tracker.ImportLines() -> {`baz "bar.com/pkg/baz"`, `bazbaz "bar.com/pkg/baz/baz"`}
|
||||
func NewImportTrackerForPackage(local string, typesToAdd ...*types.Type) *namer.DefaultImportTracker {
|
||||
tracker := namer.NewDefaultImportTracker(types.Name{Package: local})
|
||||
tracker.IsInvalidType = func(*types.Type) bool { return false }
|
||||
tracker.LocalName = func(name types.Name) string { return goTrackerLocalName(&tracker, local, name) }
|
||||
tracker.PrintImport = func(path, name string) string { return name + " \"" + path + "\"" }
|
||||
|
||||
tracker.AddTypes(typesToAdd...)
|
||||
return &tracker
|
||||
}
|
||||
|
||||
func NewImportTracker(typesToAdd ...*types.Type) *namer.DefaultImportTracker {
|
||||
return NewImportTrackerForPackage("", typesToAdd...)
|
||||
}
|
||||
|
||||
func goTrackerLocalName(tracker namer.ImportTracker, localPkg string, t types.Name) string {
|
||||
path := t.Package
|
||||
|
||||
// Using backslashes in package names causes gengo to produce Go code which
|
||||
// will not compile with the gc compiler. See the comment on GoSeperator.
|
||||
if strings.ContainsRune(path, '\\') {
|
||||
klog.Warningf("Warning: backslash used in import path '%v', this is unsupported.\n", path)
|
||||
}
|
||||
localLeaf := filepath.Base(localPkg)
|
||||
|
||||
dirs := strings.Split(path, namer.GoSeperator)
|
||||
for n := len(dirs) - 1; n >= 0; n-- {
|
||||
// follow kube convention of not having anything between directory names
|
||||
name := strings.Join(dirs[n:], "")
|
||||
name = strings.ReplaceAll(name, "_", "")
|
||||
// These characters commonly appear in import paths for go
|
||||
// packages, but aren't legal go names. So we'll sanitize.
|
||||
name = strings.ReplaceAll(name, ".", "")
|
||||
name = strings.ReplaceAll(name, "-", "")
|
||||
if _, found := tracker.PathOf(name); found || name == localLeaf {
|
||||
// This name collides with some other package.
|
||||
// Or, this name is tne same name as the local package,
|
||||
// which we avoid because it can be confusing. For example,
|
||||
// if the local package is v1, we to avoid importing
|
||||
// another package using the v1 name, and instead import
|
||||
// it with a more qualified name, such as metav1.
|
||||
continue
|
||||
}
|
||||
|
||||
// If the import name is a Go keyword, prefix with an underscore.
|
||||
if token.Lookup(name).IsKeyword() {
|
||||
name = "_" + name
|
||||
}
|
||||
return name
|
||||
}
|
||||
panic("can't find import for " + path)
|
||||
}
|
||||
77
vendor/k8s.io/gengo/v2/generator/simple_target.go
generated
vendored
Normal file
77
vendor/k8s.io/gengo/v2/generator/simple_target.go
generated
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
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 generator
|
||||
|
||||
import (
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
// SimpleTarget is implements Target in terms of static configuration.
|
||||
// The package name, path, and dir are required to be non-empty.
|
||||
type SimpleTarget struct {
|
||||
// PkgName is the name of the resulting package (as in "package xxxx").
|
||||
// Required.
|
||||
PkgName string
|
||||
// PkgPath is the canonical Go import-path of the resulting package (as in
|
||||
// "import example.com/xxxx/yyyy"). Required.
|
||||
PkgPath string
|
||||
// PkgDir is the location of the resulting package on disk (which may not
|
||||
// exist yet). It may be absolute or relative to CWD. Required.
|
||||
PkgDir string
|
||||
|
||||
// HeaderComment is emitted at the top of every output file. Optional.
|
||||
HeaderComment []byte
|
||||
|
||||
// PkgDocComment is emitted after the header comment for a "doc.go" file.
|
||||
// Optional.
|
||||
PkgDocComment []byte
|
||||
|
||||
// FilterFunc will be called to implement Target.Filter. Optional.
|
||||
FilterFunc func(*Context, *types.Type) bool
|
||||
|
||||
// GeneratorsFunc will be called to implement Target.Generators. Optional.
|
||||
GeneratorsFunc func(*Context) []Generator
|
||||
}
|
||||
|
||||
func (st SimpleTarget) Name() string { return st.PkgName }
|
||||
func (st SimpleTarget) Path() string { return st.PkgPath }
|
||||
func (st SimpleTarget) Dir() string { return st.PkgDir }
|
||||
|
||||
func (st SimpleTarget) Filter(c *Context, t *types.Type) bool {
|
||||
if st.FilterFunc != nil {
|
||||
return st.FilterFunc(c, t)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (st SimpleTarget) Generators(c *Context) []Generator {
|
||||
if st.GeneratorsFunc != nil {
|
||||
return st.GeneratorsFunc(c)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (st SimpleTarget) Header(filename string) []byte {
|
||||
if filename == "doc.go" {
|
||||
return append(st.HeaderComment, st.PkgDocComment...)
|
||||
}
|
||||
return st.HeaderComment
|
||||
}
|
||||
|
||||
var (
|
||||
_ = Target(SimpleTarget{})
|
||||
)
|
||||
188
vendor/k8s.io/gengo/v2/generator/snippet_writer.go
generated
vendored
Normal file
188
vendor/k8s.io/gengo/v2/generator/snippet_writer.go
generated
vendored
Normal file
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
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 generator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"runtime"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
// SnippetWriter is an attempt to make the template library usable.
|
||||
// Methods are chainable, and you don't have to check Error() until you're all
|
||||
// done.
|
||||
type SnippetWriter struct {
|
||||
w io.Writer
|
||||
context *Context
|
||||
// Left & right delimiters. text/template defaults to "{{" and "}}"
|
||||
// which is totally unusable for go code based templates.
|
||||
left, right string
|
||||
funcMap template.FuncMap
|
||||
err error
|
||||
}
|
||||
|
||||
// w is the destination; left and right are the delimiters; @ and $ are both
|
||||
// reasonable choices.
|
||||
//
|
||||
// c is used to make a function for every naming system, to which you can pass
|
||||
// a type and get the corresponding name.
|
||||
func NewSnippetWriter(w io.Writer, c *Context, left, right string) *SnippetWriter {
|
||||
sw := &SnippetWriter{
|
||||
w: w,
|
||||
context: c,
|
||||
left: left,
|
||||
right: right,
|
||||
funcMap: template.FuncMap{},
|
||||
}
|
||||
for name, namer := range c.Namers {
|
||||
sw.funcMap[name] = namer.Name
|
||||
}
|
||||
return sw
|
||||
}
|
||||
|
||||
// Do parses format and runs args through it. You can have arbitrary logic in
|
||||
// the format (see the text/template documentation), but consider running many
|
||||
// short templates with ordinary go logic in between--this may be more
|
||||
// readable. Do is chainable. Any error causes every other call to do to be
|
||||
// ignored, and the error will be returned by Error(). So you can check it just
|
||||
// once, at the end of your function.
|
||||
//
|
||||
// 'args' can be quite literally anything; read the text/template documentation
|
||||
// for details. Maps and structs work particularly nicely. Conveniently, the
|
||||
// types package is designed to have structs that are easily referencable from
|
||||
// the template language.
|
||||
//
|
||||
// Example:
|
||||
//
|
||||
// sw := generator.NewSnippetWriter(outBuffer, context, "$", "$")
|
||||
// sw.Do(`The public type name is: $.type|public$`, map[string]interface{}{"type": t})
|
||||
// return sw.Error()
|
||||
//
|
||||
// Where:
|
||||
// - "$" starts a template directive
|
||||
// - "." references the entire thing passed as args
|
||||
// - "type" therefore sees a map and looks up the key "type"
|
||||
// - "|" means "pass the thing on the left to the thing on the right"
|
||||
// - "public" is the name of a naming system, so the SnippetWriter has given
|
||||
// the template a function called "public" that takes a *types.Type and
|
||||
// returns the naming system's name. E.g., if the type is "string" this might
|
||||
// return "String".
|
||||
// - the second "$" ends the template directive.
|
||||
//
|
||||
// The map is actually not necessary. The below does the same thing:
|
||||
//
|
||||
// sw.Do(`The public type name is: $.|public$`, t)
|
||||
//
|
||||
// You may or may not find it more readable to use the map with a descriptive
|
||||
// key, but if you want to pass more than one arg, the map or a custom struct
|
||||
// becomes a requirement. You can do arbitrary logic inside these templates,
|
||||
// but you should consider doing the logic in go and stitching them together
|
||||
// for the sake of your readers.
|
||||
//
|
||||
// TODO: Change Do() to optionally take a list of pairs of parameters (key, value)
|
||||
// and have it construct a combined map with that and args.
|
||||
func (s *SnippetWriter) Do(format string, args interface{}) *SnippetWriter {
|
||||
if s.err != nil {
|
||||
return s
|
||||
}
|
||||
// Name the template by source file:line so it can be found when
|
||||
// there's an error.
|
||||
_, file, line, _ := runtime.Caller(1)
|
||||
tmpl, err := template.
|
||||
New(fmt.Sprintf("%s:%d", file, line)).
|
||||
Delims(s.left, s.right).
|
||||
Funcs(s.funcMap).
|
||||
Parse(format)
|
||||
if err != nil {
|
||||
s.err = err
|
||||
return s
|
||||
}
|
||||
err = tmpl.Execute(s.w, args)
|
||||
if err != nil {
|
||||
s.err = err
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// Args exists to make it convenient to construct arguments for
|
||||
// SnippetWriter.Do.
|
||||
type Args map[interface{}]interface{}
|
||||
|
||||
// With makes a copy of a and adds the given key, value pair. If key overlaps,
|
||||
// the new value wins.
|
||||
func (a Args) With(key, value interface{}) Args {
|
||||
result := Args{}
|
||||
for k, v := range a {
|
||||
result[k] = v
|
||||
}
|
||||
result[key] = value
|
||||
return result
|
||||
}
|
||||
|
||||
// WithArgs makes a copy of a and adds the given arguments. If any keys
|
||||
// overlap, the values from rhs win.
|
||||
func (a Args) WithArgs(rhs Args) Args {
|
||||
result := Args{}
|
||||
for k, v := range a {
|
||||
result[k] = v
|
||||
}
|
||||
for k, v := range rhs {
|
||||
result[k] = v
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (s *SnippetWriter) Out() io.Writer {
|
||||
return s.w
|
||||
}
|
||||
|
||||
// Error returns any encountered error.
|
||||
func (s *SnippetWriter) Error() error {
|
||||
return s.err
|
||||
}
|
||||
|
||||
// Dup creates an exact duplicate SnippetWriter with a different io.Writer.
|
||||
func (s *SnippetWriter) Dup(w io.Writer) *SnippetWriter {
|
||||
ret := *s
|
||||
ret.w = w
|
||||
return &ret
|
||||
}
|
||||
|
||||
// Append adds the contents of the io.Reader to this SnippetWriter's buffer.
|
||||
func (s *SnippetWriter) Append(r io.Reader) error {
|
||||
// The behavior of Do() is to ignore all future calls if there's an error,
|
||||
// assuming the top-level caller will check Error(). This method is
|
||||
// effectively a fancy Do(), so keep the same semantic.
|
||||
if s.err != nil {
|
||||
return nil
|
||||
}
|
||||
_, err := io.Copy(s.w, r)
|
||||
return err
|
||||
}
|
||||
|
||||
// Merge adds the contents of the io.Reader to this SnippetWriter's buffer and
|
||||
// sets this SnippetWriter's error to the other's, if needed.
|
||||
func (s *SnippetWriter) Merge(r io.Reader, other *SnippetWriter) error {
|
||||
if s.err != nil {
|
||||
return nil
|
||||
}
|
||||
if other.err != nil {
|
||||
s.err = other.err
|
||||
}
|
||||
return s.Append(r)
|
||||
}
|
||||
31
vendor/k8s.io/gengo/v2/namer/doc.go
generated
vendored
Normal file
31
vendor/k8s.io/gengo/v2/namer/doc.go
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
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 namer has support for making different type naming systems.
|
||||
//
|
||||
// This is because sometimes you want to refer to the literal type, sometimes
|
||||
// you want to make a name for the thing you're generating, and you want to
|
||||
// make the name based on the type. For example, if you have `type foo string`,
|
||||
// you want to be able to generate something like `func FooPrinter(f *foo) {
|
||||
// Print(string(*f)) }`; that is, you want to refer to a public name, a literal
|
||||
// name, and the underlying literal name.
|
||||
//
|
||||
// This package supports the idea of a "Namer" and a set of "NameSystems" to
|
||||
// support these use cases.
|
||||
//
|
||||
// Additionally, a "RawNamer" can optionally keep track of what needs to be
|
||||
// imported.
|
||||
package namer // import "k8s.io/gengo/v2/namer"
|
||||
121
vendor/k8s.io/gengo/v2/namer/import_tracker.go
generated
vendored
Normal file
121
vendor/k8s.io/gengo/v2/namer/import_tracker.go
generated
vendored
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
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 namer
|
||||
|
||||
import (
|
||||
"sort"
|
||||
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
// ImportTracker may be passed to a namer.RawNamer, to track the imports needed
|
||||
// for the types it names.
|
||||
//
|
||||
// TODO: pay attention to the package name (instead of renaming every package).
|
||||
type DefaultImportTracker struct {
|
||||
pathToName map[string]string
|
||||
// forbidden names are in here. (e.g. "go" is a directory in which
|
||||
// there is code, but "go" is not a legal name for a package, so we put
|
||||
// it here to prevent us from naming any package "go")
|
||||
nameToPath map[string]string
|
||||
local types.Name
|
||||
|
||||
// Returns true if a given types is an invalid type and should be ignored.
|
||||
IsInvalidType func(*types.Type) bool
|
||||
// Returns the final local name for the given name
|
||||
LocalName func(types.Name) string
|
||||
// Returns the "import" line for a given (path, name).
|
||||
PrintImport func(string, string) string
|
||||
}
|
||||
|
||||
func NewDefaultImportTracker(local types.Name) DefaultImportTracker {
|
||||
return DefaultImportTracker{
|
||||
pathToName: map[string]string{},
|
||||
nameToPath: map[string]string{},
|
||||
local: local,
|
||||
}
|
||||
}
|
||||
|
||||
func (tracker *DefaultImportTracker) AddTypes(types ...*types.Type) {
|
||||
for _, t := range types {
|
||||
tracker.AddType(t)
|
||||
}
|
||||
}
|
||||
func (tracker *DefaultImportTracker) AddSymbol(symbol types.Name) {
|
||||
if tracker.local.Package == symbol.Package {
|
||||
return
|
||||
}
|
||||
|
||||
if len(symbol.Package) == 0 {
|
||||
return
|
||||
}
|
||||
path := symbol.Path
|
||||
if len(path) == 0 {
|
||||
path = symbol.Package
|
||||
}
|
||||
if _, ok := tracker.pathToName[path]; ok {
|
||||
return
|
||||
}
|
||||
|
||||
name := tracker.LocalName(symbol)
|
||||
tracker.nameToPath[name] = path
|
||||
tracker.pathToName[path] = name
|
||||
}
|
||||
|
||||
func (tracker *DefaultImportTracker) AddType(t *types.Type) {
|
||||
if tracker.local.Package == t.Name.Package {
|
||||
return
|
||||
}
|
||||
|
||||
if tracker.IsInvalidType(t) {
|
||||
if t.Kind == types.Builtin {
|
||||
return
|
||||
}
|
||||
if _, ok := tracker.nameToPath[t.Name.Package]; !ok {
|
||||
tracker.nameToPath[t.Name.Package] = ""
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
tracker.AddSymbol(t.Name)
|
||||
}
|
||||
|
||||
func (tracker *DefaultImportTracker) ImportLines() []string {
|
||||
importPaths := []string{}
|
||||
for path := range tracker.pathToName {
|
||||
importPaths = append(importPaths, path)
|
||||
}
|
||||
sort.Strings(importPaths)
|
||||
out := []string{}
|
||||
for _, path := range importPaths {
|
||||
out = append(out, tracker.PrintImport(path, tracker.pathToName[path]))
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// LocalNameOf returns the name you would use to refer to the package at the
|
||||
// specified path within the body of a file.
|
||||
func (tracker *DefaultImportTracker) LocalNameOf(path string) string {
|
||||
return tracker.pathToName[path]
|
||||
}
|
||||
|
||||
// PathOf returns the path that a given localName is referring to within the
|
||||
// body of a file.
|
||||
func (tracker *DefaultImportTracker) PathOf(localName string) (string, bool) {
|
||||
name, ok := tracker.nameToPath[localName]
|
||||
return name, ok
|
||||
}
|
||||
399
vendor/k8s.io/gengo/v2/namer/namer.go
generated
vendored
Normal file
399
vendor/k8s.io/gengo/v2/namer/namer.go
generated
vendored
Normal file
@@ -0,0 +1,399 @@
|
||||
/*
|
||||
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 namer
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
const (
|
||||
// GoSeperator is used to split go import paths.
|
||||
// Forward slash is used instead of filepath.Seperator because it is the
|
||||
// only universally-accepted path delimiter and the only delimiter not
|
||||
// potentially forbidden by Go compilers. (In particular gc does not allow
|
||||
// the use of backslashes in import paths.)
|
||||
// See https://golang.org/ref/spec#Import_declarations.
|
||||
// See also https://github.com/kubernetes/gengo/issues/83#issuecomment-367040772.
|
||||
GoSeperator = "/"
|
||||
)
|
||||
|
||||
// Returns whether a name is a private Go name.
|
||||
func IsPrivateGoName(name string) bool {
|
||||
return len(name) == 0 || strings.ToLower(name[:1]) == name[:1]
|
||||
}
|
||||
|
||||
// NewPublicNamer is a helper function that returns a namer that makes
|
||||
// CamelCase names. See the NameStrategy struct for an explanation of the
|
||||
// arguments to this constructor.
|
||||
func NewPublicNamer(prependPackageNames int, ignoreWords ...string) *NameStrategy {
|
||||
n := &NameStrategy{
|
||||
Join: Joiner(IC, IC),
|
||||
IgnoreWords: map[string]bool{},
|
||||
PrependPackageNames: prependPackageNames,
|
||||
}
|
||||
for _, w := range ignoreWords {
|
||||
n.IgnoreWords[w] = true
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
// NewPrivateNamer is a helper function that returns a namer that makes
|
||||
// camelCase names. See the NameStrategy struct for an explanation of the
|
||||
// arguments to this constructor.
|
||||
func NewPrivateNamer(prependPackageNames int, ignoreWords ...string) *NameStrategy {
|
||||
n := &NameStrategy{
|
||||
Join: Joiner(IL, IC),
|
||||
IgnoreWords: map[string]bool{},
|
||||
PrependPackageNames: prependPackageNames,
|
||||
}
|
||||
for _, w := range ignoreWords {
|
||||
n.IgnoreWords[w] = true
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
// NewRawNamer will return a Namer that makes a name by which you would
|
||||
// directly refer to a type, optionally keeping track of the import paths
|
||||
// necessary to reference the names it provides. Tracker may be nil.
|
||||
// The 'pkg' is the full package name, in which the Namer is used - all
|
||||
// types from that package will be referenced by just type name without
|
||||
// referencing the package.
|
||||
//
|
||||
// For example, if the type is map[string]int, a raw namer will literally
|
||||
// return "map[string]int".
|
||||
//
|
||||
// Or if the type, in package foo, is "type Bar struct { ... }", then the raw
|
||||
// namer will return "foo.Bar" as the name of the type, and if 'tracker' was
|
||||
// not nil, will record that package foo needs to be imported.
|
||||
func NewRawNamer(pkg string, tracker ImportTracker) *rawNamer {
|
||||
return &rawNamer{pkg: pkg, tracker: tracker}
|
||||
}
|
||||
|
||||
// Names is a map from Type to name, as defined by some Namer.
|
||||
type Names map[*types.Type]string
|
||||
|
||||
// Namer takes a type, and assigns a name.
|
||||
//
|
||||
// The purpose of this complexity is so that you can assign coherent
|
||||
// side-by-side systems of names for the types. For example, you might want a
|
||||
// public interface, a private implementation struct, and also to reference
|
||||
// literally the type name.
|
||||
//
|
||||
// Note that it is safe to call your own Name() function recursively to find
|
||||
// the names of keys, elements, etc. This is because anonymous types can't have
|
||||
// cycles in their names, and named types don't require the sort of recursion
|
||||
// that would be problematic.
|
||||
type Namer interface {
|
||||
Name(*types.Type) string
|
||||
}
|
||||
|
||||
// NameSystems is a map of a system name to a namer for that system.
|
||||
type NameSystems map[string]Namer
|
||||
|
||||
// NameStrategy is a general Namer. The easiest way to use it is to copy the
|
||||
// Public/PrivateNamer variables, and modify the members you wish to change.
|
||||
//
|
||||
// The Name method produces a name for the given type, of the forms:
|
||||
// Anonymous types: <Prefix><Type description><Suffix>
|
||||
// Named types: <Prefix><Optional Prepended Package name(s)><Original name><Suffix>
|
||||
//
|
||||
// In all cases, every part of the name is run through the capitalization
|
||||
// functions.
|
||||
//
|
||||
// The IgnoreWords map can be set if you have directory names that are
|
||||
// semantically meaningless for naming purposes, e.g. "proto".
|
||||
//
|
||||
// Prefix and Suffix can be used to disambiguate parallel systems of type
|
||||
// names. For example, if you want to generate an interface and an
|
||||
// implementation, you might want to suffix one with "Interface" and the other
|
||||
// with "Implementation". Another common use-- if you want to generate private
|
||||
// types, and one of your source types could be "string", you can't use the
|
||||
// default lowercase private namer. You'll have to add a suffix or prefix.
|
||||
type NameStrategy struct {
|
||||
Prefix, Suffix string
|
||||
Join func(pre string, parts []string, post string) string
|
||||
|
||||
// Add non-meaningful package directory names here (e.g. "proto") and
|
||||
// they will be ignored.
|
||||
IgnoreWords map[string]bool
|
||||
|
||||
// If > 0, prepend exactly that many package directory names (or as
|
||||
// many as there are). Package names listed in "IgnoreWords" will be
|
||||
// ignored.
|
||||
//
|
||||
// For example, if Ignore words lists "proto" and type Foo is in
|
||||
// pkg/server/frobbing/proto, then a value of 1 will give a type name
|
||||
// of FrobbingFoo, 2 gives ServerFrobbingFoo, etc.
|
||||
PrependPackageNames int
|
||||
|
||||
// A cache of names thus far assigned by this namer.
|
||||
Names
|
||||
}
|
||||
|
||||
// IC ensures the first character is uppercase.
|
||||
func IC(in string) string {
|
||||
if in == "" {
|
||||
return in
|
||||
}
|
||||
return strings.ToUpper(in[:1]) + in[1:]
|
||||
}
|
||||
|
||||
// IL ensures the first character is lowercase.
|
||||
func IL(in string) string {
|
||||
if in == "" {
|
||||
return in
|
||||
}
|
||||
return strings.ToLower(in[:1]) + in[1:]
|
||||
}
|
||||
|
||||
// Joiner lets you specify functions that preprocess the various components of
|
||||
// a name before joining them. You can construct e.g. camelCase or CamelCase or
|
||||
// any other way of joining words. (See the IC and IL convenience functions.)
|
||||
func Joiner(first, others func(string) string) func(pre string, in []string, post string) string {
|
||||
return func(pre string, in []string, post string) string {
|
||||
tmp := []string{others(pre)}
|
||||
for i := range in {
|
||||
tmp = append(tmp, others(in[i]))
|
||||
}
|
||||
tmp = append(tmp, others(post))
|
||||
return first(strings.Join(tmp, ""))
|
||||
}
|
||||
}
|
||||
|
||||
func (ns *NameStrategy) removePrefixAndSuffix(s string) string {
|
||||
// The join function may have changed capitalization.
|
||||
lowerIn := strings.ToLower(s)
|
||||
lowerP := strings.ToLower(ns.Prefix)
|
||||
lowerS := strings.ToLower(ns.Suffix)
|
||||
b, e := 0, len(s)
|
||||
if strings.HasPrefix(lowerIn, lowerP) {
|
||||
b = len(ns.Prefix)
|
||||
}
|
||||
if strings.HasSuffix(lowerIn, lowerS) {
|
||||
e -= len(ns.Suffix)
|
||||
}
|
||||
return s[b:e]
|
||||
}
|
||||
|
||||
var (
|
||||
importPathNameSanitizer = strings.NewReplacer("-", "_", ".", "")
|
||||
)
|
||||
|
||||
// filters out unwanted directory names and sanitizes remaining names.
|
||||
func (ns *NameStrategy) filterDirs(path string) []string {
|
||||
allDirs := strings.Split(path, GoSeperator)
|
||||
dirs := make([]string, 0, len(allDirs))
|
||||
for _, p := range allDirs {
|
||||
if ns.IgnoreWords == nil || !ns.IgnoreWords[p] {
|
||||
dirs = append(dirs, importPathNameSanitizer.Replace(p))
|
||||
}
|
||||
}
|
||||
return dirs
|
||||
}
|
||||
|
||||
// See the comment on NameStrategy.
|
||||
func (ns *NameStrategy) Name(t *types.Type) string {
|
||||
if ns.Names == nil {
|
||||
ns.Names = Names{}
|
||||
}
|
||||
if s, ok := ns.Names[t]; ok {
|
||||
return s
|
||||
}
|
||||
|
||||
if t.Name.Package != "" {
|
||||
dirs := append(ns.filterDirs(t.Name.Package), t.Name.Name)
|
||||
i := ns.PrependPackageNames + 1
|
||||
dn := len(dirs)
|
||||
if i > dn {
|
||||
i = dn
|
||||
}
|
||||
name := ns.Join(ns.Prefix, dirs[dn-i:], ns.Suffix)
|
||||
ns.Names[t] = name
|
||||
return name
|
||||
}
|
||||
|
||||
// Only anonymous types remain.
|
||||
var name string
|
||||
switch t.Kind {
|
||||
case types.Builtin:
|
||||
name = ns.Join(ns.Prefix, []string{t.Name.Name}, ns.Suffix)
|
||||
case types.Map:
|
||||
name = ns.Join(ns.Prefix, []string{
|
||||
"Map",
|
||||
ns.removePrefixAndSuffix(ns.Name(t.Key)),
|
||||
"To",
|
||||
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
|
||||
}, ns.Suffix)
|
||||
case types.Slice:
|
||||
name = ns.Join(ns.Prefix, []string{
|
||||
"Slice",
|
||||
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
|
||||
}, ns.Suffix)
|
||||
case types.Array:
|
||||
name = ns.Join(ns.Prefix, []string{
|
||||
"Array",
|
||||
ns.removePrefixAndSuffix(fmt.Sprintf("%d", t.Len)),
|
||||
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
|
||||
}, ns.Suffix)
|
||||
case types.Pointer:
|
||||
name = ns.Join(ns.Prefix, []string{
|
||||
"Pointer",
|
||||
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
|
||||
}, ns.Suffix)
|
||||
case types.Struct:
|
||||
names := []string{"Struct"}
|
||||
for _, m := range t.Members {
|
||||
names = append(names, ns.removePrefixAndSuffix(ns.Name(m.Type)))
|
||||
}
|
||||
name = ns.Join(ns.Prefix, names, ns.Suffix)
|
||||
case types.Chan:
|
||||
name = ns.Join(ns.Prefix, []string{
|
||||
"Chan",
|
||||
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
|
||||
}, ns.Suffix)
|
||||
case types.Interface:
|
||||
// TODO: add to name test
|
||||
names := []string{"Interface"}
|
||||
for _, m := range t.Methods {
|
||||
// TODO: include function signature
|
||||
names = append(names, m.Name.Name)
|
||||
}
|
||||
name = ns.Join(ns.Prefix, names, ns.Suffix)
|
||||
case types.Func:
|
||||
// TODO: add to name test
|
||||
parts := []string{"Func"}
|
||||
for _, param := range t.Signature.Parameters {
|
||||
parts = append(parts, ns.removePrefixAndSuffix(ns.Name(param.Type)))
|
||||
}
|
||||
parts = append(parts, "Returns")
|
||||
for _, result := range t.Signature.Results {
|
||||
parts = append(parts, ns.removePrefixAndSuffix(ns.Name(result.Type)))
|
||||
}
|
||||
name = ns.Join(ns.Prefix, parts, ns.Suffix)
|
||||
default:
|
||||
name = "unnameable_" + string(t.Kind)
|
||||
}
|
||||
ns.Names[t] = name
|
||||
return name
|
||||
}
|
||||
|
||||
// ImportTracker allows a raw namer to keep track of the packages needed for
|
||||
// import. You can implement yourself or use the one in the generation package.
|
||||
type ImportTracker interface {
|
||||
AddType(*types.Type)
|
||||
AddSymbol(types.Name)
|
||||
LocalNameOf(packagePath string) string
|
||||
PathOf(localName string) (string, bool)
|
||||
ImportLines() []string
|
||||
}
|
||||
|
||||
type rawNamer struct {
|
||||
pkg string
|
||||
tracker ImportTracker
|
||||
Names
|
||||
}
|
||||
|
||||
// Name makes a name the way you'd write it to literally refer to type t,
|
||||
// making ordinary assumptions about how you've imported t's package (or using
|
||||
// r.tracker to specifically track the package imports).
|
||||
func (r *rawNamer) Name(t *types.Type) string {
|
||||
if r.Names == nil {
|
||||
r.Names = Names{}
|
||||
}
|
||||
if name, ok := r.Names[t]; ok {
|
||||
return name
|
||||
}
|
||||
if t.Name.Package != "" {
|
||||
var name string
|
||||
if r.tracker != nil {
|
||||
r.tracker.AddType(t)
|
||||
if t.Name.Package == r.pkg {
|
||||
name = t.Name.Name
|
||||
} else {
|
||||
name = r.tracker.LocalNameOf(t.Name.Package) + "." + t.Name.Name
|
||||
}
|
||||
} else {
|
||||
if t.Name.Package == r.pkg {
|
||||
name = t.Name.Name
|
||||
} else {
|
||||
name = filepath.Base(t.Name.Package) + "." + t.Name.Name
|
||||
}
|
||||
}
|
||||
r.Names[t] = name
|
||||
return name
|
||||
}
|
||||
var name string
|
||||
switch t.Kind {
|
||||
case types.Builtin:
|
||||
name = t.Name.Name
|
||||
case types.Map:
|
||||
name = "map[" + r.Name(t.Key) + "]" + r.Name(t.Elem)
|
||||
case types.Slice:
|
||||
name = "[]" + r.Name(t.Elem)
|
||||
case types.Array:
|
||||
l := strconv.Itoa(int(t.Len))
|
||||
name = "[" + l + "]" + r.Name(t.Elem)
|
||||
case types.Pointer:
|
||||
name = "*" + r.Name(t.Elem)
|
||||
case types.Struct:
|
||||
elems := []string{}
|
||||
for _, m := range t.Members {
|
||||
elems = append(elems, m.Name+" "+r.Name(m.Type))
|
||||
}
|
||||
name = "struct{" + strings.Join(elems, "; ") + "}"
|
||||
case types.Chan:
|
||||
// TODO: include directionality
|
||||
name = "chan " + r.Name(t.Elem)
|
||||
case types.Interface:
|
||||
// TODO: add to name test
|
||||
elems := []string{}
|
||||
for _, m := range t.Methods {
|
||||
// TODO: include function signature
|
||||
elems = append(elems, m.Name.Name)
|
||||
}
|
||||
if len(elems) == 0 {
|
||||
name = "any"
|
||||
} else {
|
||||
name = "interface{" + strings.Join(elems, "; ") + "}"
|
||||
}
|
||||
case types.Func:
|
||||
// TODO: add to name test
|
||||
params := []string{}
|
||||
for _, param := range t.Signature.Parameters {
|
||||
params = append(params, r.Name(param.Type))
|
||||
}
|
||||
results := []string{}
|
||||
for _, result := range t.Signature.Results {
|
||||
results = append(results, r.Name(result.Type))
|
||||
}
|
||||
name = "func(" + strings.Join(params, ",") + ")"
|
||||
if len(results) == 1 {
|
||||
name += " " + results[0]
|
||||
} else if len(results) > 1 {
|
||||
name += " (" + strings.Join(results, ",") + ")"
|
||||
}
|
||||
default:
|
||||
name = "unnameable_" + string(t.Kind)
|
||||
}
|
||||
r.Names[t] = name
|
||||
return name
|
||||
}
|
||||
72
vendor/k8s.io/gengo/v2/namer/order.go
generated
vendored
Normal file
72
vendor/k8s.io/gengo/v2/namer/order.go
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
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 namer
|
||||
|
||||
import (
|
||||
"sort"
|
||||
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
// Orderer produces an ordering of types given a Namer.
|
||||
type Orderer struct {
|
||||
Namer
|
||||
}
|
||||
|
||||
// OrderUniverse assigns a name to every type in the Universe, including Types,
|
||||
// Functions and Variables, and returns a list sorted by those names.
|
||||
func (o *Orderer) OrderUniverse(u types.Universe) []*types.Type {
|
||||
list := tList{
|
||||
namer: o.Namer,
|
||||
}
|
||||
for _, p := range u {
|
||||
for _, t := range p.Types {
|
||||
list.types = append(list.types, t)
|
||||
}
|
||||
for _, f := range p.Functions {
|
||||
list.types = append(list.types, f)
|
||||
}
|
||||
for _, v := range p.Variables {
|
||||
list.types = append(list.types, v)
|
||||
}
|
||||
for _, v := range p.Constants {
|
||||
list.types = append(list.types, v)
|
||||
}
|
||||
}
|
||||
sort.Sort(list)
|
||||
return list.types
|
||||
}
|
||||
|
||||
// OrderTypes assigns a name to every type, and returns a list sorted by those
|
||||
// names.
|
||||
func (o *Orderer) OrderTypes(typeList []*types.Type) []*types.Type {
|
||||
list := tList{
|
||||
namer: o.Namer,
|
||||
types: typeList,
|
||||
}
|
||||
sort.Sort(list)
|
||||
return list.types
|
||||
}
|
||||
|
||||
type tList struct {
|
||||
namer Namer
|
||||
types []*types.Type
|
||||
}
|
||||
|
||||
func (t tList) Len() int { return len(t.types) }
|
||||
func (t tList) Less(i, j int) bool { return t.namer.Name(t.types[i]) < t.namer.Name(t.types[j]) }
|
||||
func (t tList) Swap(i, j int) { t.types[i], t.types[j] = t.types[j], t.types[i] }
|
||||
120
vendor/k8s.io/gengo/v2/namer/plural_namer.go
generated
vendored
Normal file
120
vendor/k8s.io/gengo/v2/namer/plural_namer.go
generated
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
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 namer
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
var consonants = "bcdfghjklmnpqrstvwxyz"
|
||||
|
||||
type pluralNamer struct {
|
||||
// key is the case-sensitive type name, value is the case-insensitive
|
||||
// intended output.
|
||||
exceptions map[string]string
|
||||
finalize func(string) string
|
||||
}
|
||||
|
||||
// NewPublicPluralNamer returns a namer that returns the plural form of the input
|
||||
// type's name, starting with a uppercase letter.
|
||||
func NewPublicPluralNamer(exceptions map[string]string) *pluralNamer {
|
||||
return &pluralNamer{exceptions, IC}
|
||||
}
|
||||
|
||||
// NewPrivatePluralNamer returns a namer that returns the plural form of the input
|
||||
// type's name, starting with a lowercase letter.
|
||||
func NewPrivatePluralNamer(exceptions map[string]string) *pluralNamer {
|
||||
return &pluralNamer{exceptions, IL}
|
||||
}
|
||||
|
||||
// NewAllLowercasePluralNamer returns a namer that returns the plural form of the input
|
||||
// type's name, with all letters in lowercase.
|
||||
func NewAllLowercasePluralNamer(exceptions map[string]string) *pluralNamer {
|
||||
return &pluralNamer{exceptions, strings.ToLower}
|
||||
}
|
||||
|
||||
// Name returns the plural form of the type's name. If the type's name is found
|
||||
// in the exceptions map, the map value is returned.
|
||||
func (r *pluralNamer) Name(t *types.Type) string {
|
||||
singular := t.Name.Name
|
||||
var plural string
|
||||
var ok bool
|
||||
if plural, ok = r.exceptions[singular]; ok {
|
||||
return r.finalize(plural)
|
||||
}
|
||||
if len(singular) < 2 {
|
||||
return r.finalize(singular)
|
||||
}
|
||||
|
||||
switch rune(singular[len(singular)-1]) {
|
||||
case 's', 'x', 'z':
|
||||
plural = esPlural(singular)
|
||||
case 'y':
|
||||
sl := rune(singular[len(singular)-2])
|
||||
if isConsonant(sl) {
|
||||
plural = iesPlural(singular)
|
||||
} else {
|
||||
plural = sPlural(singular)
|
||||
}
|
||||
case 'h':
|
||||
sl := rune(singular[len(singular)-2])
|
||||
if sl == 'c' || sl == 's' {
|
||||
plural = esPlural(singular)
|
||||
} else {
|
||||
plural = sPlural(singular)
|
||||
}
|
||||
case 'e':
|
||||
sl := rune(singular[len(singular)-2])
|
||||
if sl == 'f' {
|
||||
plural = vesPlural(singular[:len(singular)-1])
|
||||
} else {
|
||||
plural = sPlural(singular)
|
||||
}
|
||||
case 'f':
|
||||
plural = vesPlural(singular)
|
||||
default:
|
||||
plural = sPlural(singular)
|
||||
}
|
||||
return r.finalize(plural)
|
||||
}
|
||||
|
||||
func iesPlural(singular string) string {
|
||||
return singular[:len(singular)-1] + "ies"
|
||||
}
|
||||
|
||||
func vesPlural(singular string) string {
|
||||
return singular[:len(singular)-1] + "ves"
|
||||
}
|
||||
|
||||
func esPlural(singular string) string {
|
||||
return singular + "es"
|
||||
}
|
||||
|
||||
func sPlural(singular string) string {
|
||||
return singular + "s"
|
||||
}
|
||||
|
||||
func isConsonant(char rune) bool {
|
||||
for _, c := range consonants {
|
||||
if char == c {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
19
vendor/k8s.io/gengo/v2/parser/doc.go
generated
vendored
Normal file
19
vendor/k8s.io/gengo/v2/parser/doc.go
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
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 parser provides code to parse go files, type-check them, extract the
|
||||
// types.
|
||||
package parser // import "k8s.io/gengo/v2/parser"
|
||||
888
vendor/k8s.io/gengo/v2/parser/parse.go
generated
vendored
Normal file
888
vendor/k8s.io/gengo/v2/parser/parse.go
generated
vendored
Normal file
@@ -0,0 +1,888 @@
|
||||
/*
|
||||
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 parser
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/constant"
|
||||
"go/token"
|
||||
gotypes "go/types"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"golang.org/x/tools/go/packages"
|
||||
|
||||
"k8s.io/gengo/v2/types"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// Parser lets you add all the go files in all the packages that you care
|
||||
// about, then constructs the type source data.
|
||||
type Parser struct {
|
||||
// Map of package paths to definitions. These keys should be canonical
|
||||
// Go import paths (example.com/foo/bar) and not local paths (./foo/bar).
|
||||
goPkgs map[string]*packages.Package
|
||||
|
||||
// Keep track of which packages were directly requested (as opposed to
|
||||
// those which are transitively loaded).
|
||||
userRequested map[string]bool
|
||||
|
||||
// Keep track of which packages have already been scanned for types.
|
||||
fullyProcessed map[string]bool
|
||||
|
||||
// Build tags to set when loading packages.
|
||||
buildTags []string
|
||||
|
||||
// Tracks accumulated parsed files, so we can do position lookups later.
|
||||
fset *token.FileSet
|
||||
|
||||
// All comments from everywhere in every parsed file. This map is keyed by
|
||||
// the file-line on which the comment block ends, which makes it easy to
|
||||
// look up comments which immediately precede a given obect (e.g. a type or
|
||||
// function definition), which is what we almost always want. We need this
|
||||
// because Go's own ast package does a very poor job of handling comments.
|
||||
endLineToCommentGroup map[fileLine]*ast.CommentGroup
|
||||
}
|
||||
|
||||
// key type for finding comments.
|
||||
type fileLine struct {
|
||||
file string
|
||||
line int
|
||||
}
|
||||
|
||||
// New constructs a new Parser.
|
||||
func New() *Parser {
|
||||
return NewWithOptions(Options{})
|
||||
}
|
||||
|
||||
func NewWithOptions(opts Options) *Parser {
|
||||
return &Parser{
|
||||
goPkgs: map[string]*packages.Package{},
|
||||
userRequested: map[string]bool{},
|
||||
fullyProcessed: map[string]bool{},
|
||||
fset: token.NewFileSet(),
|
||||
endLineToCommentGroup: map[fileLine]*ast.CommentGroup{},
|
||||
buildTags: opts.BuildTags,
|
||||
}
|
||||
}
|
||||
|
||||
// Options holds optional settings for the Parser.
|
||||
type Options struct {
|
||||
// BuildTags is a list of optional tags to be specified when loading
|
||||
// packages.
|
||||
BuildTags []string
|
||||
}
|
||||
|
||||
// FindPackages expands the provided patterns into a list of Go import-paths,
|
||||
// much like `go list -find`.
|
||||
func (p *Parser) FindPackages(patterns ...string) ([]string, error) {
|
||||
return p.findPackages(nil, patterns...)
|
||||
}
|
||||
|
||||
// baseCfg is an optional (may be nil) config which might be injected by tests.
|
||||
func (p *Parser) findPackages(baseCfg *packages.Config, patterns ...string) ([]string, error) {
|
||||
toFind := make([]string, 0, len(patterns))
|
||||
results := make([]string, 0, len(patterns))
|
||||
for _, pat := range patterns {
|
||||
if pkg := p.goPkgs[pat]; pkg != nil {
|
||||
results = append(results, pkg.PkgPath)
|
||||
} else {
|
||||
toFind = append(toFind, pat)
|
||||
}
|
||||
}
|
||||
if len(toFind) == 0 {
|
||||
return results, nil
|
||||
}
|
||||
|
||||
cfg := packages.Config{
|
||||
Mode: packages.NeedName | packages.NeedFiles,
|
||||
BuildFlags: []string{"-tags", strings.Join(p.buildTags, ",")},
|
||||
Tests: false,
|
||||
}
|
||||
if baseCfg != nil {
|
||||
// This is to support tests, e.g. to inject a fake GOPATH or CWD.
|
||||
cfg.Dir = baseCfg.Dir
|
||||
cfg.Env = baseCfg.Env
|
||||
}
|
||||
|
||||
pkgs, err := packages.Load(&cfg, toFind...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error loading packages: %w", err)
|
||||
}
|
||||
var allErrs []error
|
||||
for _, pkg := range pkgs {
|
||||
results = append(results, pkg.PkgPath)
|
||||
|
||||
// pkg.Errors is not a slice of `error`, but concrete types. We have
|
||||
// to iteratively convert each one into `error`.
|
||||
var errs []error
|
||||
for _, e := range pkg.Errors {
|
||||
errs = append(errs, e)
|
||||
}
|
||||
if len(errs) > 0 {
|
||||
allErrs = append(allErrs, fmt.Errorf("error(s) in %q:\n%w", pkg.PkgPath, errors.Join(errs...)))
|
||||
}
|
||||
}
|
||||
if len(allErrs) != 0 {
|
||||
return nil, errors.Join(allErrs...)
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
// LoadPackages loads and parses the specified Go packages. Specifically
|
||||
// named packages (without a trailing "/...") which do not exist or have no Go
|
||||
// files are an error.
|
||||
func (p *Parser) LoadPackages(patterns ...string) error {
|
||||
_, err := p.loadPackages(patterns...)
|
||||
return err
|
||||
}
|
||||
|
||||
// LoadPackagesWithConfigForTesting loads and parses the specified Go packages with the
|
||||
// specified packages.Config as a starting point. This is for testing, and
|
||||
// only the .Dir and .Env fields of the Config will be considered.
|
||||
func (p *Parser) LoadPackagesWithConfigForTesting(cfg *packages.Config, patterns ...string) error {
|
||||
_, err := p.loadPackagesWithConfig(cfg, patterns...)
|
||||
return err
|
||||
}
|
||||
|
||||
// LoadPackagesTo loads and parses the specified Go packages, and inserts them
|
||||
// into the specified Universe. It returns the packages which match the
|
||||
// patterns, but loads all packages and their imports, recursively, into the
|
||||
// universe. See NewUniverse for more.
|
||||
func (p *Parser) LoadPackagesTo(u *types.Universe, patterns ...string) ([]*types.Package, error) {
|
||||
// Load Packages.
|
||||
pkgs, err := p.loadPackages(patterns...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Load types in all packages (it will internally filter).
|
||||
if err := p.addPkgsToUniverse(pkgs, u); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Return the results as gengo types.Packages.
|
||||
ret := make([]*types.Package, 0, len(pkgs))
|
||||
for _, pkg := range pkgs {
|
||||
ret = append(ret, u.Package(pkg.PkgPath))
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func (p *Parser) loadPackages(patterns ...string) ([]*packages.Package, error) {
|
||||
return p.loadPackagesWithConfig(nil, patterns...)
|
||||
}
|
||||
|
||||
// baseCfg is an optional (may be nil) config which might be injected by tests.
|
||||
func (p *Parser) loadPackagesWithConfig(baseCfg *packages.Config, patterns ...string) ([]*packages.Package, error) {
|
||||
klog.V(5).Infof("loadPackages %q", patterns)
|
||||
|
||||
// Loading packages is slow - only do ones we know we have not already done
|
||||
// (e.g. if a tool calls LoadPackages itself).
|
||||
existingPkgs, netNewPkgs, err := p.alreadyLoaded(baseCfg, patterns...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if vlog := klog.V(5); vlog.Enabled() {
|
||||
if len(existingPkgs) > 0 {
|
||||
keys := make([]string, 0, len(existingPkgs))
|
||||
for _, p := range existingPkgs {
|
||||
keys = append(keys, p.PkgPath)
|
||||
}
|
||||
vlog.Infof(" already have: %q", keys)
|
||||
}
|
||||
if len(netNewPkgs) > 0 {
|
||||
vlog.Infof(" to be loaded: %q", netNewPkgs)
|
||||
}
|
||||
}
|
||||
|
||||
// If these were not user-requested before, they are now.
|
||||
for _, pkg := range existingPkgs {
|
||||
if !p.userRequested[pkg.PkgPath] {
|
||||
p.userRequested[pkg.PkgPath] = true
|
||||
}
|
||||
}
|
||||
for _, pkg := range netNewPkgs {
|
||||
if !p.userRequested[pkg] {
|
||||
p.userRequested[pkg] = true
|
||||
}
|
||||
}
|
||||
|
||||
if len(netNewPkgs) == 0 {
|
||||
return existingPkgs, nil
|
||||
}
|
||||
|
||||
cfg := packages.Config{
|
||||
Mode: packages.NeedName |
|
||||
packages.NeedFiles | packages.NeedImports | packages.NeedDeps |
|
||||
packages.NeedModule | packages.NeedTypes | packages.NeedSyntax,
|
||||
BuildFlags: []string{"-tags", strings.Join(p.buildTags, ",")},
|
||||
Fset: p.fset,
|
||||
Tests: false,
|
||||
}
|
||||
if baseCfg != nil {
|
||||
// This is to support tests, e.g. to inject a fake GOPATH or CWD.
|
||||
cfg.Dir = baseCfg.Dir
|
||||
cfg.Env = baseCfg.Env
|
||||
}
|
||||
|
||||
tBefore := time.Now()
|
||||
pkgs, err := packages.Load(&cfg, netNewPkgs...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error loading packages: %w", err)
|
||||
}
|
||||
klog.V(5).Infof(" loaded %d pkg(s) in %v", len(pkgs), time.Since(tBefore))
|
||||
|
||||
// Handle any errors.
|
||||
collectErrors := func(pkg *packages.Package) error {
|
||||
var errs []error
|
||||
for _, e := range pkg.Errors {
|
||||
if e.Kind == packages.ListError || e.Kind == packages.ParseError {
|
||||
errs = append(errs, e)
|
||||
}
|
||||
}
|
||||
if len(errs) > 0 {
|
||||
return fmt.Errorf("error(s) in %q:\n%w", pkg.PkgPath, errors.Join(errs...))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if err := forEachPackageRecursive(pkgs, collectErrors); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Finish integrating packages into our state.
|
||||
absorbPkg := func(pkg *packages.Package) error {
|
||||
p.goPkgs[pkg.PkgPath] = pkg
|
||||
|
||||
for _, f := range pkg.Syntax {
|
||||
for _, c := range f.Comments {
|
||||
// We need to do this on _every_ pkg, not just user-requested
|
||||
// ones, because some generators look at tags in other
|
||||
// packages.
|
||||
//
|
||||
// TODO: It would be nice if we only did this on user-requested
|
||||
// packages. The problem is that we don't always know which
|
||||
// other packages will need this information, and even when we
|
||||
// do we may have already loaded the package (as a transitive
|
||||
// dep) and might have stored pointers into it. Doing a
|
||||
// thorough "reload" without invalidating all those pointers is
|
||||
// a problem for another day.
|
||||
position := p.fset.Position(c.End()) // Fset is synchronized
|
||||
p.endLineToCommentGroup[fileLine{position.Filename, position.Line}] = c
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
if err := forEachPackageRecursive(pkgs, absorbPkg); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return append(existingPkgs, pkgs...), nil
|
||||
}
|
||||
|
||||
// alreadyLoaded figures out which of the specified patterns have already been loaded
|
||||
// and which have not, and returns those respectively.
|
||||
// baseCfg is an optional (may be nil) config which might be injected by tests.
|
||||
func (p *Parser) alreadyLoaded(baseCfg *packages.Config, patterns ...string) ([]*packages.Package, []string, error) {
|
||||
existingPkgs := make([]*packages.Package, 0, len(patterns))
|
||||
netNewPkgs := make([]string, 0, len(patterns))
|
||||
|
||||
// Expand and canonicalize the requested patterns. This should be fast.
|
||||
if pkgPaths, err := p.findPackages(baseCfg, patterns...); err != nil {
|
||||
return nil, nil, err
|
||||
} else {
|
||||
for _, pkgPath := range pkgPaths {
|
||||
if pkg := p.goPkgs[pkgPath]; pkg != nil {
|
||||
existingPkgs = append(existingPkgs, pkg)
|
||||
} else {
|
||||
netNewPkgs = append(netNewPkgs, pkgPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
return existingPkgs, netNewPkgs, nil
|
||||
}
|
||||
|
||||
// forEachPackageRecursive will run the provided function on all of the specified
|
||||
// packages, and on their imports recursively. Errors are accumulated and
|
||||
// returned as via errors.Join.
|
||||
func forEachPackageRecursive(pkgs []*packages.Package, fn func(pkg *packages.Package) error) error {
|
||||
seen := map[string]bool{} // PkgPaths we have already visited
|
||||
var errs []error
|
||||
for _, pkg := range pkgs {
|
||||
errs = append(errs, recursePackage(pkg, fn, seen)...)
|
||||
}
|
||||
if len(errs) > 0 {
|
||||
return errors.Join(errs...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func recursePackage(pkg *packages.Package, fn func(pkg *packages.Package) error, seen map[string]bool) []error {
|
||||
if seen[pkg.PkgPath] {
|
||||
return nil
|
||||
}
|
||||
var errs []error
|
||||
seen[pkg.PkgPath] = true
|
||||
if err := fn(pkg); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
for _, imp := range pkg.Imports {
|
||||
errs = append(errs, recursePackage(imp, fn, seen)...)
|
||||
}
|
||||
return errs
|
||||
}
|
||||
|
||||
// UserRequestedPackages fetches a list of the user-imported packages.
|
||||
func (p *Parser) UserRequestedPackages() []string {
|
||||
// Iterate packages in a predictable order.
|
||||
pkgPaths := make([]string, 0, len(p.userRequested))
|
||||
for k := range p.userRequested {
|
||||
pkgPaths = append(pkgPaths, string(k))
|
||||
}
|
||||
sort.Strings(pkgPaths)
|
||||
return pkgPaths
|
||||
}
|
||||
|
||||
// NewUniverse finalizes the loaded packages, searches through them for types
|
||||
// and produces a new Universe. The returned Universe has one types.Package
|
||||
// entry for each Go package that has been loaded, including all of their
|
||||
// dependencies, recursively. It also has one entry, whose key is "", which
|
||||
// represents "builtin" types.
|
||||
func (p *Parser) NewUniverse() (types.Universe, error) {
|
||||
u := types.Universe{}
|
||||
|
||||
pkgs := []*packages.Package{}
|
||||
for _, path := range p.UserRequestedPackages() {
|
||||
pkgs = append(pkgs, p.goPkgs[path])
|
||||
}
|
||||
if err := p.addPkgsToUniverse(pkgs, &u); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return u, nil
|
||||
}
|
||||
|
||||
// addCommentsToType takes any accumulated comment lines prior to obj and
|
||||
// attaches them to the type t.
|
||||
func (p *Parser) addCommentsToType(obj gotypes.Object, t *types.Type) {
|
||||
t.CommentLines = p.docComment(obj.Pos())
|
||||
t.SecondClosestCommentLines = p.priorDetachedComment(obj.Pos())
|
||||
}
|
||||
|
||||
// packageDir tries to figure out the directory of the specified package.
|
||||
func packageDir(pkg *packages.Package) (string, error) {
|
||||
// Sometimes Module is present but has no Dir, e.g. when it is vendored.
|
||||
if pkg.Module != nil && pkg.Module.Dir != "" {
|
||||
// NOTE: this will not work if tests are loaded, because Go mutates the
|
||||
// Package.PkgPath.
|
||||
subdir := strings.TrimPrefix(pkg.PkgPath, pkg.Module.Path)
|
||||
return filepath.Join(pkg.Module.Dir, subdir), nil
|
||||
}
|
||||
if len(pkg.GoFiles) > 0 {
|
||||
return filepath.Dir(pkg.GoFiles[0]), nil
|
||||
}
|
||||
if len(pkg.IgnoredFiles) > 0 {
|
||||
return filepath.Dir(pkg.IgnoredFiles[0]), nil
|
||||
}
|
||||
return "", fmt.Errorf("can't find package dir for %q - no module info and no Go files", pkg.PkgPath)
|
||||
}
|
||||
|
||||
// addPkgsToUniverse adds the packages, and all of their deps, recursively, to
|
||||
// the universe and (if needed) searches through them for types.
|
||||
func (p *Parser) addPkgsToUniverse(pkgs []*packages.Package, u *types.Universe) error {
|
||||
addOne := func(pkg *packages.Package) error {
|
||||
if err := p.addPkgToUniverse(pkg, u); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if err := forEachPackageRecursive(pkgs, addOne); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// addPkgToUniverse adds one package to the universe and (if needed) searches
|
||||
// through it for types.
|
||||
func (p *Parser) addPkgToUniverse(pkg *packages.Package, u *types.Universe) error {
|
||||
pkgPath := pkg.PkgPath
|
||||
if p.fullyProcessed[pkgPath] {
|
||||
return nil
|
||||
}
|
||||
|
||||
// This will get-or-create the Package.
|
||||
gengoPkg := u.Package(pkgPath)
|
||||
|
||||
if gengoPkg.Dir == "" {
|
||||
// We're keeping this package, though we might not fully process it.
|
||||
if vlog := klog.V(5); vlog.Enabled() {
|
||||
why := "user-requested"
|
||||
if !p.userRequested[pkgPath] {
|
||||
why = "dependency"
|
||||
}
|
||||
vlog.Infof("addPkgToUniverse %q (%s)", pkgPath, why)
|
||||
}
|
||||
|
||||
absPath := ""
|
||||
if dir, err := packageDir(pkg); err != nil {
|
||||
return err
|
||||
} else {
|
||||
absPath = dir
|
||||
}
|
||||
|
||||
gengoPkg.Path = pkg.PkgPath
|
||||
gengoPkg.Dir = absPath
|
||||
}
|
||||
|
||||
// If the package was not user-requested, we can stop here.
|
||||
if !p.userRequested[pkgPath] {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Mark it as done, so we don't ever re-process it.
|
||||
p.fullyProcessed[pkgPath] = true
|
||||
gengoPkg.Name = pkg.Name
|
||||
|
||||
// For historical reasons we treat files named "doc.go" specially.
|
||||
// TODO: It would be nice to not do this and instead treat package
|
||||
// doc-comments as the "global" config place. This would require changing
|
||||
// most generators and input files.
|
||||
for _, f := range pkg.Syntax {
|
||||
// This gets the filename for the ast.File. Iterating pkg.GoFiles is
|
||||
// documented as unreliable.
|
||||
pos := p.fset.Position(f.FileStart)
|
||||
if filepath.Base(pos.Filename) == "doc.go" {
|
||||
gengoPkg.Comments = []string{}
|
||||
for i := range f.Comments {
|
||||
gengoPkg.Comments = append(gengoPkg.Comments, splitLines(f.Comments[i].Text())...)
|
||||
}
|
||||
if f.Doc != nil {
|
||||
gengoPkg.DocComments = splitLines(f.Doc.Text())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Walk all the types, recursively and save them for later access.
|
||||
s := pkg.Types.Scope()
|
||||
for _, n := range s.Names() {
|
||||
switch obj := s.Lookup(n).(type) {
|
||||
case *gotypes.TypeName:
|
||||
t := p.walkType(*u, nil, obj.Type())
|
||||
p.addCommentsToType(obj, t)
|
||||
case *gotypes.Func:
|
||||
// We only care about functions, not concrete/abstract methods.
|
||||
if obj.Type() != nil && obj.Type().(*gotypes.Signature).Recv() == nil {
|
||||
t := p.addFunction(*u, nil, obj)
|
||||
p.addCommentsToType(obj, t)
|
||||
}
|
||||
case *gotypes.Var:
|
||||
if !obj.IsField() {
|
||||
t := p.addVariable(*u, nil, obj)
|
||||
p.addCommentsToType(obj, t)
|
||||
}
|
||||
case *gotypes.Const:
|
||||
t := p.addConstant(*u, nil, obj)
|
||||
p.addCommentsToType(obj, t)
|
||||
default:
|
||||
klog.Infof("addPkgToUniverse %q: unhandled object of type %T: %v", pkgPath, obj, obj)
|
||||
}
|
||||
}
|
||||
|
||||
// Add all of this package's imports.
|
||||
importedPkgs := []string{}
|
||||
for _, imp := range pkg.Imports {
|
||||
if err := p.addPkgToUniverse(imp, u); err != nil {
|
||||
return err
|
||||
}
|
||||
importedPkgs = append(importedPkgs, imp.PkgPath)
|
||||
}
|
||||
sort.Strings(importedPkgs)
|
||||
u.AddImports(pkg.PkgPath, importedPkgs...)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// If the specified position has a "doc comment", return that.
|
||||
func (p *Parser) docComment(pos token.Pos) []string {
|
||||
// An object's doc comment always ends on the line before the object's own
|
||||
// declaration.
|
||||
c1 := p.priorCommentLines(pos, 1)
|
||||
return splitLines(c1.Text()) // safe even if c1 is nil
|
||||
}
|
||||
|
||||
// If there is a detached (not immediately before a declaration) comment,
|
||||
// return that.
|
||||
func (p *Parser) priorDetachedComment(pos token.Pos) []string {
|
||||
// An object's doc comment always ends on the line before the object's own
|
||||
// declaration.
|
||||
c1 := p.priorCommentLines(pos, 1)
|
||||
|
||||
// Using a literal "2" here is brittle in theory (it means literally 2
|
||||
// lines), but in practice Go code is gofmt'ed (which elides repeated blank
|
||||
// lines), so it works.
|
||||
var c2 *ast.CommentGroup
|
||||
if c1 == nil {
|
||||
c2 = p.priorCommentLines(pos, 2)
|
||||
} else {
|
||||
c2 = p.priorCommentLines(c1.List[0].Slash, 2)
|
||||
}
|
||||
return splitLines(c2.Text()) // safe even if c1 is nil
|
||||
}
|
||||
|
||||
// If there's a comment block which ends nlines before pos, return it.
|
||||
func (p *Parser) priorCommentLines(pos token.Pos, lines int) *ast.CommentGroup {
|
||||
position := p.fset.Position(pos)
|
||||
key := fileLine{position.Filename, position.Line - lines}
|
||||
return p.endLineToCommentGroup[key]
|
||||
}
|
||||
|
||||
func splitLines(str string) []string {
|
||||
return strings.Split(strings.TrimRight(str, "\n"), "\n")
|
||||
}
|
||||
|
||||
func goFuncNameToName(in string) types.Name {
|
||||
name := strings.TrimPrefix(in, "func ")
|
||||
nameParts := strings.Split(name, "(")
|
||||
return goNameToName(nameParts[0])
|
||||
}
|
||||
|
||||
func goVarNameToName(in string) types.Name {
|
||||
nameParts := strings.Split(in, " ")
|
||||
// nameParts[0] is "var".
|
||||
// nameParts[2:] is the type of the variable, we ignore it for now.
|
||||
return goNameToName(nameParts[1])
|
||||
}
|
||||
|
||||
// goNameToName converts a go name string to a gengo types.Name.
|
||||
// It operates solely on the string on a best effort basis. The name may be updated
|
||||
// in walkType for generics.
|
||||
func goNameToName(in string) types.Name {
|
||||
// Detect anonymous type names. (These may have '.' characters because
|
||||
// embedded types may have packages, so we detect them specially.)
|
||||
if strings.HasPrefix(in, "struct{") ||
|
||||
strings.HasPrefix(in, "<-chan") ||
|
||||
strings.HasPrefix(in, "chan<-") ||
|
||||
strings.HasPrefix(in, "chan ") ||
|
||||
strings.HasPrefix(in, "func(") ||
|
||||
strings.HasPrefix(in, "func (") ||
|
||||
strings.HasPrefix(in, "*") ||
|
||||
strings.HasPrefix(in, "map[") ||
|
||||
strings.HasPrefix(in, "[") {
|
||||
return types.Name{Name: in}
|
||||
}
|
||||
|
||||
// There may be '.' characters within a generic. Temporarily remove
|
||||
// the generic.
|
||||
genericIndex := strings.IndexRune(in, '[')
|
||||
if genericIndex == -1 {
|
||||
genericIndex = len(in)
|
||||
}
|
||||
|
||||
// Otherwise, if there are '.' characters present, the name has a
|
||||
// package path in front.
|
||||
nameParts := strings.Split(in[:genericIndex], ".")
|
||||
name := types.Name{Name: in}
|
||||
if n := len(nameParts); n >= 2 {
|
||||
// The final "." is the name of the type--previous ones must
|
||||
// have been in the package path.
|
||||
name.Package, name.Name = strings.Join(nameParts[:n-1], "."), nameParts[n-1]
|
||||
// Add back the generic component now that the package and type name have been separated.
|
||||
if genericIndex != len(in) {
|
||||
name.Name = name.Name + in[genericIndex:]
|
||||
}
|
||||
}
|
||||
return name
|
||||
}
|
||||
|
||||
func (p *Parser) convertSignature(u types.Universe, t *gotypes.Signature) *types.Signature {
|
||||
signature := &types.Signature{}
|
||||
for i := 0; i < t.Params().Len(); i++ {
|
||||
signature.Parameters = append(signature.Parameters, &types.ParamResult{
|
||||
Name: t.Params().At(i).Name(),
|
||||
Type: p.walkType(u, nil, t.Params().At(i).Type()),
|
||||
})
|
||||
}
|
||||
for i := 0; i < t.Results().Len(); i++ {
|
||||
signature.Results = append(signature.Results, &types.ParamResult{
|
||||
Name: t.Results().At(i).Name(),
|
||||
Type: p.walkType(u, nil, t.Results().At(i).Type()),
|
||||
})
|
||||
}
|
||||
if r := t.Recv(); r != nil {
|
||||
signature.Receiver = p.walkType(u, nil, r.Type())
|
||||
}
|
||||
signature.Variadic = t.Variadic()
|
||||
return signature
|
||||
}
|
||||
|
||||
// walkType adds the type, and any necessary child types.
|
||||
func (p *Parser) walkType(u types.Universe, useName *types.Name, in gotypes.Type) *types.Type {
|
||||
// Most of the cases are underlying types of the named type.
|
||||
name := goNameToName(in.String())
|
||||
if useName != nil {
|
||||
name = *useName
|
||||
}
|
||||
|
||||
// Handle alias types conditionally on go1.22+.
|
||||
// Inline this once the minimum supported version is go1.22
|
||||
if out := p.walkAliasType(u, in); out != nil {
|
||||
return out
|
||||
}
|
||||
|
||||
switch t := in.(type) {
|
||||
case *gotypes.Struct:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Struct
|
||||
for i := 0; i < t.NumFields(); i++ {
|
||||
f := t.Field(i)
|
||||
m := types.Member{
|
||||
Name: f.Name(),
|
||||
Embedded: f.Anonymous(),
|
||||
Tags: t.Tag(i),
|
||||
Type: p.walkType(u, nil, f.Type()),
|
||||
CommentLines: p.docComment(f.Pos()),
|
||||
}
|
||||
out.Members = append(out.Members, m)
|
||||
}
|
||||
return out
|
||||
case *gotypes.Map:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Map
|
||||
out.Elem = p.walkType(u, nil, t.Elem())
|
||||
out.Key = p.walkType(u, nil, t.Key())
|
||||
return out
|
||||
case *gotypes.Pointer:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Pointer
|
||||
out.Elem = p.walkType(u, nil, t.Elem())
|
||||
return out
|
||||
case *gotypes.Slice:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Slice
|
||||
out.Elem = p.walkType(u, nil, t.Elem())
|
||||
return out
|
||||
case *gotypes.Array:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Array
|
||||
out.Elem = p.walkType(u, nil, t.Elem())
|
||||
out.Len = in.(*gotypes.Array).Len()
|
||||
return out
|
||||
case *gotypes.Chan:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Chan
|
||||
out.Elem = p.walkType(u, nil, t.Elem())
|
||||
// TODO: need to store direction, otherwise raw type name
|
||||
// cannot be properly written.
|
||||
return out
|
||||
case *gotypes.Basic:
|
||||
out := u.Type(types.Name{
|
||||
Package: "", // This is a magic package name in the Universe.
|
||||
Name: t.Name(),
|
||||
})
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Unsupported
|
||||
return out
|
||||
case *gotypes.Signature:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Func
|
||||
out.Signature = p.convertSignature(u, t)
|
||||
return out
|
||||
case *gotypes.Interface:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Interface
|
||||
t.Complete()
|
||||
for i := 0; i < t.NumMethods(); i++ {
|
||||
if out.Methods == nil {
|
||||
out.Methods = map[string]*types.Type{}
|
||||
}
|
||||
method := t.Method(i)
|
||||
name := goNameToName(method.String())
|
||||
mt := p.walkType(u, &name, method.Type())
|
||||
mt.CommentLines = p.docComment(method.Pos())
|
||||
out.Methods[method.Name()] = mt
|
||||
}
|
||||
return out
|
||||
case *gotypes.Named:
|
||||
var out *types.Type
|
||||
switch t.Underlying().(type) {
|
||||
case *gotypes.Named, *gotypes.Basic, *gotypes.Map, *gotypes.Slice:
|
||||
name := goNameToName(t.String())
|
||||
out = u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Alias
|
||||
out.Underlying = p.walkType(u, nil, t.Underlying())
|
||||
case *gotypes.Struct, *gotypes.Interface:
|
||||
name := goNameToName(t.String())
|
||||
tpMap := map[string]*types.Type{}
|
||||
if t.TypeParams().Len() != 0 {
|
||||
// Remove generics, then readd them without the encoded
|
||||
// type, e.g. Foo[T any] => Foo[T]
|
||||
var tpNames []string
|
||||
for i := 0; i < t.TypeParams().Len(); i++ {
|
||||
tp := t.TypeParams().At(i)
|
||||
tpName := tp.Obj().Name()
|
||||
tpNames = append(tpNames, tpName)
|
||||
tpMap[tpName] = p.walkType(u, nil, tp.Constraint())
|
||||
}
|
||||
name.Name = fmt.Sprintf("%s[%s]", strings.SplitN(name.Name, "[", 2)[0], strings.Join(tpNames, ","))
|
||||
}
|
||||
|
||||
if out := u.Type(name); out.Kind != types.Unknown {
|
||||
out.GoType = in
|
||||
return out // short circuit if we've already made this.
|
||||
}
|
||||
out = p.walkType(u, &name, t.Underlying())
|
||||
out.TypeParams = tpMap
|
||||
default:
|
||||
// gotypes package makes everything "named" with an
|
||||
// underlying anonymous type--we remove that annoying
|
||||
// "feature" for users. This flattens those types
|
||||
// together.
|
||||
name := goNameToName(t.String())
|
||||
if out := u.Type(name); out.Kind != types.Unknown {
|
||||
return out // short circuit if we've already made this.
|
||||
}
|
||||
out = p.walkType(u, &name, t.Underlying())
|
||||
}
|
||||
// If the underlying type didn't already add methods, add them.
|
||||
// (Interface types will have already added methods.)
|
||||
if len(out.Methods) == 0 {
|
||||
for i := 0; i < t.NumMethods(); i++ {
|
||||
if out.Methods == nil {
|
||||
out.Methods = map[string]*types.Type{}
|
||||
}
|
||||
method := t.Method(i)
|
||||
name := goNameToName(method.String())
|
||||
mt := p.walkType(u, &name, method.Type())
|
||||
mt.CommentLines = p.docComment(method.Pos())
|
||||
out.Methods[method.Name()] = mt
|
||||
}
|
||||
}
|
||||
return out
|
||||
case *gotypes.TypeParam:
|
||||
// DO NOT retrieve the type from the universe. The default type-param name is only the
|
||||
// generic variable name. Ideally, it would be namespaced by package and struct but it is
|
||||
// not. Thus, if we try to use the universe, we would start polluting it.
|
||||
// e.g. if Foo[T] and Bar[T] exists, we'd mistakenly use the same type T for both.
|
||||
return &types.Type{
|
||||
Name: name,
|
||||
Kind: types.TypeParam,
|
||||
}
|
||||
default:
|
||||
out := u.Type(name)
|
||||
out.GoType = in
|
||||
if out.Kind != types.Unknown {
|
||||
return out
|
||||
}
|
||||
out.Kind = types.Unsupported
|
||||
klog.Warningf("Making unsupported type entry %q for: %#v\n", out, t)
|
||||
return out
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Parser) addFunction(u types.Universe, useName *types.Name, in *gotypes.Func) *types.Type {
|
||||
name := goFuncNameToName(in.String())
|
||||
if useName != nil {
|
||||
name = *useName
|
||||
}
|
||||
out := u.Function(name)
|
||||
out.Kind = types.DeclarationOf
|
||||
out.Underlying = p.walkType(u, nil, in.Type())
|
||||
return out
|
||||
}
|
||||
|
||||
func (p *Parser) addVariable(u types.Universe, useName *types.Name, in *gotypes.Var) *types.Type {
|
||||
name := goVarNameToName(in.String())
|
||||
if useName != nil {
|
||||
name = *useName
|
||||
}
|
||||
out := u.Variable(name)
|
||||
out.Kind = types.DeclarationOf
|
||||
out.Underlying = p.walkType(u, nil, in.Type())
|
||||
return out
|
||||
}
|
||||
|
||||
func (p *Parser) addConstant(u types.Universe, useName *types.Name, in *gotypes.Const) *types.Type {
|
||||
name := goVarNameToName(in.String())
|
||||
if useName != nil {
|
||||
name = *useName
|
||||
}
|
||||
out := u.Constant(name)
|
||||
out.Kind = types.DeclarationOf
|
||||
out.Underlying = p.walkType(u, nil, in.Type())
|
||||
|
||||
var constval string
|
||||
|
||||
// For strings, we use `StringVal()` to get the un-truncated,
|
||||
// un-quoted string. For other values, `.String()` is preferable to
|
||||
// get something relatively human readable (especially since for
|
||||
// floating point types, `ExactString()` will generate numeric
|
||||
// expressions using `big.(*Float).Text()`.
|
||||
switch in.Val().Kind() {
|
||||
case constant.String:
|
||||
constval = constant.StringVal(in.Val())
|
||||
default:
|
||||
constval = in.Val().String()
|
||||
}
|
||||
|
||||
out.ConstValue = &constval
|
||||
return out
|
||||
}
|
||||
33
vendor/k8s.io/gengo/v2/parser/parse_122.go
generated
vendored
Normal file
33
vendor/k8s.io/gengo/v2/parser/parse_122.go
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
//go:build go1.22
|
||||
// +build go1.22
|
||||
|
||||
/*
|
||||
Copyright 2024 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 parser
|
||||
|
||||
import (
|
||||
gotypes "go/types"
|
||||
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
func (p *Parser) walkAliasType(u types.Universe, in gotypes.Type) *types.Type {
|
||||
if t, isAlias := in.(*gotypes.Alias); isAlias {
|
||||
return p.walkType(u, nil, gotypes.Unalias(t))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
30
vendor/k8s.io/gengo/v2/parser/parse_pre_122.go
generated
vendored
Normal file
30
vendor/k8s.io/gengo/v2/parser/parse_pre_122.go
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
//go:build !go1.22
|
||||
// +build !go1.22
|
||||
|
||||
/*
|
||||
Copyright 2024 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 parser
|
||||
|
||||
import (
|
||||
gotypes "go/types"
|
||||
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
func (p *Parser) walkAliasType(u types.Universe, in gotypes.Type) *types.Type {
|
||||
return nil
|
||||
}
|
||||
19
vendor/k8s.io/gengo/v2/types/doc.go
generated
vendored
Normal file
19
vendor/k8s.io/gengo/v2/types/doc.go
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
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 types contains go type information, packaged in a way that makes
|
||||
// auto-generation convenient, whether by template or straight go functions.
|
||||
package types // import "k8s.io/gengo/v2/types"
|
||||
575
vendor/k8s.io/gengo/v2/types/types.go
generated
vendored
Normal file
575
vendor/k8s.io/gengo/v2/types/types.go
generated
vendored
Normal file
@@ -0,0 +1,575 @@
|
||||
/*
|
||||
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 types
|
||||
|
||||
import (
|
||||
gotypes "go/types"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Ref makes a reference to the given type. It can only be used for e.g.
|
||||
// passing to namers.
|
||||
func Ref(packageName, typeName string) *Type {
|
||||
return &Type{Name: Name{
|
||||
Name: typeName,
|
||||
Package: packageName,
|
||||
}}
|
||||
}
|
||||
|
||||
// A type name may have a package qualifier.
|
||||
type Name struct {
|
||||
// Empty if embedded or builtin. This is the package path unless Path is specified.
|
||||
Package string
|
||||
// The type name.
|
||||
Name string
|
||||
// An optional location of the type definition for languages that can have disjoint
|
||||
// packages and paths.
|
||||
Path string
|
||||
}
|
||||
|
||||
// String returns the name formatted as a string.
|
||||
func (n Name) String() string {
|
||||
if n.Package == "" {
|
||||
return n.Name
|
||||
}
|
||||
return n.Package + "." + n.Name
|
||||
}
|
||||
|
||||
// ParseFullyQualifiedName parses a name like k8s.io/kubernetes/pkg/api.Pod into a Name.
|
||||
func ParseFullyQualifiedName(fqn string) Name {
|
||||
cs := strings.Split(fqn, ".")
|
||||
pkg := ""
|
||||
if len(cs) > 1 {
|
||||
pkg = strings.Join(cs[0:len(cs)-1], ".")
|
||||
}
|
||||
return Name{
|
||||
Name: cs[len(cs)-1],
|
||||
Package: pkg,
|
||||
}
|
||||
}
|
||||
|
||||
// The possible classes of types.
|
||||
type Kind string
|
||||
|
||||
const (
|
||||
// Builtin is a primitive, like bool, string, int.
|
||||
Builtin Kind = "Builtin"
|
||||
Struct Kind = "Struct"
|
||||
Map Kind = "Map"
|
||||
Slice Kind = "Slice"
|
||||
Pointer Kind = "Pointer"
|
||||
|
||||
// Alias is an alias of another type, e.g. in:
|
||||
// type Foo string
|
||||
// type Bar Foo
|
||||
// Bar is an alias of Foo.
|
||||
//
|
||||
// In the real go type system, Foo is a "Named" string; but to simplify
|
||||
// generation, this type system will just say that Foo *is* a builtin.
|
||||
// We then need "Alias" as a way for us to say that Bar *is* a Foo.
|
||||
Alias Kind = "Alias"
|
||||
|
||||
// Interface is any type that could have differing types at run time.
|
||||
Interface Kind = "Interface"
|
||||
|
||||
// Array is just like slice, but has a fixed length.
|
||||
Array Kind = "Array"
|
||||
|
||||
// The remaining types are included for completeness, but are not well
|
||||
// supported.
|
||||
Chan Kind = "Chan"
|
||||
Func Kind = "Func"
|
||||
|
||||
// DeclarationOf is different from other Kinds; it indicates that instead of
|
||||
// representing an actual Type, the type is a declaration of an instance of
|
||||
// a type. E.g., a top-level function, variable, or constant. See the
|
||||
// comment for Type.Name for more detail.
|
||||
DeclarationOf Kind = "DeclarationOf"
|
||||
Unknown Kind = ""
|
||||
Unsupported Kind = "Unsupported"
|
||||
TypeParam Kind = "TypeParam"
|
||||
|
||||
// Protobuf is protobuf type.
|
||||
Protobuf Kind = "Protobuf"
|
||||
)
|
||||
|
||||
// Package holds package-level information.
|
||||
// Fields are public, as everything in this package, to enable consumption by
|
||||
// templates (for example). But it is strongly encouraged for code to build by
|
||||
// using the provided functions.
|
||||
type Package struct {
|
||||
// Canonical import-path of this package.
|
||||
Path string
|
||||
|
||||
// The location (on disk) of this package.
|
||||
Dir string
|
||||
|
||||
// Short name of this package, as in the 'package x' line.
|
||||
Name string
|
||||
|
||||
// The comment right above the package declaration in doc.go, if any.
|
||||
DocComments []string
|
||||
|
||||
// All comments from doc.go, if any.
|
||||
// TODO: remove Comments and use DocComments everywhere.
|
||||
Comments []string
|
||||
|
||||
// Types within this package, indexed by their name (*not* including
|
||||
// package name).
|
||||
Types map[string]*Type
|
||||
|
||||
// Functions within this package, indexed by their name (*not* including
|
||||
// package name).
|
||||
Functions map[string]*Type
|
||||
|
||||
// Global variables within this package, indexed by their name (*not* including
|
||||
// package name).
|
||||
Variables map[string]*Type
|
||||
|
||||
// Global constants within this package, indexed by their name (*not* including
|
||||
// package name).
|
||||
Constants map[string]*Type
|
||||
|
||||
// Packages imported by this package, indexed by (canonicalized)
|
||||
// package path.
|
||||
Imports map[string]*Package
|
||||
}
|
||||
|
||||
// Has returns true if the given name references a type known to this package.
|
||||
func (p *Package) Has(name string) bool {
|
||||
_, has := p.Types[name]
|
||||
return has
|
||||
}
|
||||
|
||||
// Type gets the given Type in this Package. If the Type is not already
|
||||
// defined, this will add it and return the new Type value. The caller is
|
||||
// expected to finish initialization.
|
||||
func (p *Package) Type(typeName string) *Type {
|
||||
if t, ok := p.Types[typeName]; ok {
|
||||
return t
|
||||
}
|
||||
if p.Path == "" {
|
||||
// Import the standard builtin types!
|
||||
if t, ok := builtins.Types[typeName]; ok {
|
||||
p.Types[typeName] = t
|
||||
return t
|
||||
}
|
||||
}
|
||||
t := &Type{Name: Name{Package: p.Path, Name: typeName}}
|
||||
p.Types[typeName] = t
|
||||
return t
|
||||
}
|
||||
|
||||
// Function gets the given function Type in this Package. If the function is
|
||||
// not already defined, this will add it. If a function is added, it's the
|
||||
// caller's responsibility to finish construction of the function by setting
|
||||
// Underlying to the correct type.
|
||||
func (p *Package) Function(funcName string) *Type {
|
||||
if t, ok := p.Functions[funcName]; ok {
|
||||
return t
|
||||
}
|
||||
t := &Type{Name: Name{Package: p.Path, Name: funcName}}
|
||||
t.Kind = DeclarationOf
|
||||
p.Functions[funcName] = t
|
||||
return t
|
||||
}
|
||||
|
||||
// Variable gets the given variable Type in this Package. If the variable is
|
||||
// not already defined, this will add it. If a variable is added, it's the caller's
|
||||
// responsibility to finish construction of the variable by setting Underlying
|
||||
// to the correct type.
|
||||
func (p *Package) Variable(varName string) *Type {
|
||||
if t, ok := p.Variables[varName]; ok {
|
||||
return t
|
||||
}
|
||||
t := &Type{Name: Name{Package: p.Path, Name: varName}}
|
||||
t.Kind = DeclarationOf
|
||||
p.Variables[varName] = t
|
||||
return t
|
||||
}
|
||||
|
||||
// Constant gets the given constant Type in this Package. If the constant is
|
||||
// not already defined, this will add it. If a constant is added, it's the caller's
|
||||
// responsibility to finish construction of the constant by setting Underlying
|
||||
// to the correct type.
|
||||
func (p *Package) Constant(constName string) *Type {
|
||||
if t, ok := p.Constants[constName]; ok {
|
||||
return t
|
||||
}
|
||||
t := &Type{Name: Name{Package: p.Path, Name: constName}}
|
||||
t.Kind = DeclarationOf
|
||||
p.Constants[constName] = t
|
||||
return t
|
||||
}
|
||||
|
||||
// HasImport returns true if p imports packageName. Package names include the
|
||||
// package directory.
|
||||
func (p *Package) HasImport(packageName string) bool {
|
||||
_, has := p.Imports[packageName]
|
||||
return has
|
||||
}
|
||||
|
||||
// Universe is a map of all packages. The key is the package name, but you
|
||||
// should use Package(), Type(), Function(), or Variable() instead of direct
|
||||
// access.
|
||||
type Universe map[string]*Package
|
||||
|
||||
// Type returns the canonical type for the given fully-qualified name. Builtin
|
||||
// types will always be found, even if they haven't been explicitly added to
|
||||
// the map. If a non-existing type is requested, this will create (a marker for)
|
||||
// it.
|
||||
func (u Universe) Type(n Name) *Type {
|
||||
return u.Package(n.Package).Type(n.Name)
|
||||
}
|
||||
|
||||
// Function returns the canonical function for the given fully-qualified name.
|
||||
// If a non-existing function is requested, this will create (a marker for) it.
|
||||
// If a marker is created, it's the caller's responsibility to finish
|
||||
// construction of the function by setting Underlying to the correct type.
|
||||
func (u Universe) Function(n Name) *Type {
|
||||
return u.Package(n.Package).Function(n.Name)
|
||||
}
|
||||
|
||||
// Variable returns the canonical variable for the given fully-qualified name.
|
||||
// If a non-existing variable is requested, this will create (a marker for) it.
|
||||
// If a marker is created, it's the caller's responsibility to finish
|
||||
// construction of the variable by setting Underlying to the correct type.
|
||||
func (u Universe) Variable(n Name) *Type {
|
||||
return u.Package(n.Package).Variable(n.Name)
|
||||
}
|
||||
|
||||
// Constant returns the canonical constant for the given fully-qualified name.
|
||||
// If a non-existing constant is requested, this will create (a marker for) it.
|
||||
// If a marker is created, it's the caller's responsibility to finish
|
||||
// construction of the constant by setting Underlying to the correct type.
|
||||
func (u Universe) Constant(n Name) *Type {
|
||||
return u.Package(n.Package).Constant(n.Name)
|
||||
}
|
||||
|
||||
// AddImports registers import lines for packageName. May be called multiple times.
|
||||
// You are responsible for canonicalizing all package paths.
|
||||
func (u Universe) AddImports(packagePath string, importPaths ...string) {
|
||||
p := u.Package(packagePath)
|
||||
for _, i := range importPaths {
|
||||
p.Imports[i] = u.Package(i)
|
||||
}
|
||||
}
|
||||
|
||||
// Package returns the Package for the given path.
|
||||
// If a non-existing package is requested, this will create (a marker for) it.
|
||||
// If a marker is created, it's the caller's responsibility to finish
|
||||
// construction of the package.
|
||||
func (u Universe) Package(packagePath string) *Package {
|
||||
if p, ok := u[packagePath]; ok {
|
||||
return p
|
||||
}
|
||||
p := &Package{
|
||||
Path: packagePath,
|
||||
Types: map[string]*Type{},
|
||||
Functions: map[string]*Type{},
|
||||
Variables: map[string]*Type{},
|
||||
Constants: map[string]*Type{},
|
||||
Imports: map[string]*Package{},
|
||||
}
|
||||
u[packagePath] = p
|
||||
return p
|
||||
}
|
||||
|
||||
// Type represents a subset of possible go types.
|
||||
type Type struct {
|
||||
// There are two general categories of types, those explicitly named
|
||||
// and those anonymous. Named ones will have a non-empty package in the
|
||||
// name field.
|
||||
//
|
||||
// An exception: If Kind == DeclarationOf, then this name is the name of a
|
||||
// top-level function, variable, or const, and the type can be found in Underlying.
|
||||
// We do this to allow the naming system to work against these objects, even
|
||||
// though they aren't strictly speaking types.
|
||||
Name Name
|
||||
|
||||
// The general kind of this type.
|
||||
Kind Kind
|
||||
|
||||
// If there are comment lines immediately before the type definition,
|
||||
// they will be recorded here.
|
||||
CommentLines []string
|
||||
|
||||
// If there are comment lines preceding the `CommentLines`, they will be
|
||||
// recorded here. There are two cases:
|
||||
// ---
|
||||
// SecondClosestCommentLines
|
||||
// a blank line
|
||||
// CommentLines
|
||||
// type definition
|
||||
// ---
|
||||
//
|
||||
// or
|
||||
// ---
|
||||
// SecondClosestCommentLines
|
||||
// a blank line
|
||||
// type definition
|
||||
// ---
|
||||
SecondClosestCommentLines []string
|
||||
|
||||
// If Kind == Struct
|
||||
Members []Member
|
||||
|
||||
// If Kind == Struct
|
||||
TypeParams map[string]*Type
|
||||
|
||||
// If Kind == Map, Slice, Pointer, or Chan
|
||||
Elem *Type
|
||||
|
||||
// If Kind == Map, this is the map's key type.
|
||||
Key *Type
|
||||
|
||||
// If Kind == Alias, this is the underlying type.
|
||||
// If Kind == DeclarationOf, this is the type of the declaration.
|
||||
Underlying *Type
|
||||
|
||||
// If Kind == Interface, this is the set of all required functions.
|
||||
// Otherwise, if this is a named type, this is the list of methods that
|
||||
// type has. (All elements will have Kind=="Func")
|
||||
Methods map[string]*Type
|
||||
|
||||
// If Kind == func, this is the signature of the function.
|
||||
Signature *Signature
|
||||
|
||||
// ConstValue contains a stringified constant value if
|
||||
// Kind == DeclarationOf and this is a constant value
|
||||
// declaration. For string constants, this field contains
|
||||
// the entire, un-quoted value. For other types, it contains
|
||||
// a human-readable literal.
|
||||
ConstValue *string
|
||||
|
||||
// TODO: Add:
|
||||
// * channel direction
|
||||
|
||||
// If Kind == Array
|
||||
Len int64
|
||||
|
||||
// The underlying Go type.
|
||||
GoType gotypes.Type
|
||||
}
|
||||
|
||||
// String returns the name of the type.
|
||||
func (t *Type) String() string {
|
||||
if t == nil {
|
||||
return "" // makes tests easier
|
||||
}
|
||||
return t.Name.String()
|
||||
}
|
||||
|
||||
// IsPrimitive returns whether the type is a built-in type or is an alias to a
|
||||
// built-in type. For example: strings and aliases of strings are primitives,
|
||||
// structs are not.
|
||||
func (t *Type) IsPrimitive() bool {
|
||||
if t.Kind == Builtin || (t.Kind == Alias && t.Underlying.Kind == Builtin) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IsAssignable returns whether the type is deep-assignable. For example,
|
||||
// slices and maps and pointers are shallow copies, but ints and strings are
|
||||
// complete.
|
||||
func (t *Type) IsAssignable() bool {
|
||||
if t.IsPrimitive() {
|
||||
return true
|
||||
}
|
||||
if t.Kind == Struct {
|
||||
for _, m := range t.Members {
|
||||
if !m.Type.IsAssignable() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IsAnonymousStruct returns true if the type is an anonymous struct or an alias
|
||||
// to an anonymous struct.
|
||||
func (t *Type) IsAnonymousStruct() bool {
|
||||
return (t.Kind == Struct && t.Name.Name == "struct{}") || (t.Kind == Alias && t.Underlying.IsAnonymousStruct())
|
||||
}
|
||||
|
||||
// IsComparable returns whether the type is comparable.
|
||||
func (t *Type) IsComparable() bool {
|
||||
return gotypes.Comparable(t.GoType)
|
||||
}
|
||||
|
||||
// A single struct member
|
||||
type Member struct {
|
||||
// The name of the member.
|
||||
Name string
|
||||
|
||||
// If the member is embedded (anonymous) this will be true, and the
|
||||
// Name will be the type name.
|
||||
Embedded bool
|
||||
|
||||
// If there are comment lines immediately before the member in the type
|
||||
// definition, they will be recorded here.
|
||||
CommentLines []string
|
||||
|
||||
// If there are tags along with this member, they will be saved here.
|
||||
Tags string
|
||||
|
||||
// The type of this member.
|
||||
Type *Type
|
||||
}
|
||||
|
||||
// String returns the name and type of the member.
|
||||
func (m Member) String() string {
|
||||
return m.Name + " " + m.Type.String()
|
||||
}
|
||||
|
||||
// ParamResult represents a parameter or a result of a method's signature.
|
||||
type ParamResult struct {
|
||||
// The name of the parameter or result.
|
||||
Name string
|
||||
// The type of this parameter or result.
|
||||
Type *Type
|
||||
}
|
||||
|
||||
// Signature is a function's signature.
|
||||
type Signature struct {
|
||||
// If a method of some type, this is the type it's a member of.
|
||||
Receiver *Type
|
||||
Parameters []*ParamResult
|
||||
Results []*ParamResult
|
||||
|
||||
// True if the last in parameter is of the form ...T.
|
||||
Variadic bool
|
||||
|
||||
// If there are comment lines immediately before this
|
||||
// signature/method/function declaration, they will be recorded here.
|
||||
CommentLines []string
|
||||
}
|
||||
|
||||
// Built in types.
|
||||
var (
|
||||
Any = &Type{
|
||||
Name: Name{Name: "any"},
|
||||
Kind: Interface,
|
||||
}
|
||||
String = &Type{
|
||||
Name: Name{Name: "string"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Int64 = &Type{
|
||||
Name: Name{Name: "int64"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Int32 = &Type{
|
||||
Name: Name{Name: "int32"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Int16 = &Type{
|
||||
Name: Name{Name: "int16"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Int = &Type{
|
||||
Name: Name{Name: "int"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Uint64 = &Type{
|
||||
Name: Name{Name: "uint64"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Uint32 = &Type{
|
||||
Name: Name{Name: "uint32"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Uint16 = &Type{
|
||||
Name: Name{Name: "uint16"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Uint = &Type{
|
||||
Name: Name{Name: "uint"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Uintptr = &Type{
|
||||
Name: Name{Name: "uintptr"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Float64 = &Type{
|
||||
Name: Name{Name: "float64"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Float32 = &Type{
|
||||
Name: Name{Name: "float32"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Float = &Type{
|
||||
Name: Name{Name: "float"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Bool = &Type{
|
||||
Name: Name{Name: "bool"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
Byte = &Type{
|
||||
Name: Name{Name: "byte"},
|
||||
Kind: Builtin,
|
||||
}
|
||||
|
||||
builtins = &Package{
|
||||
Types: map[string]*Type{
|
||||
"any": Any,
|
||||
"bool": Bool,
|
||||
"string": String,
|
||||
"int": Int,
|
||||
"int64": Int64,
|
||||
"int32": Int32,
|
||||
"int16": Int16,
|
||||
"int8": Byte,
|
||||
"uint": Uint,
|
||||
"uint64": Uint64,
|
||||
"uint32": Uint32,
|
||||
"uint16": Uint16,
|
||||
"uint8": Byte,
|
||||
"uintptr": Uintptr,
|
||||
"byte": Byte,
|
||||
"float": Float,
|
||||
"float64": Float64,
|
||||
"float32": Float32,
|
||||
},
|
||||
Imports: map[string]*Package{},
|
||||
Path: "",
|
||||
Name: "",
|
||||
}
|
||||
)
|
||||
|
||||
func PointerTo(t *Type) *Type {
|
||||
return &Type{
|
||||
Name: Name{
|
||||
Name: "*" + t.Name.String(),
|
||||
},
|
||||
Kind: Pointer,
|
||||
Elem: t,
|
||||
}
|
||||
}
|
||||
|
||||
func IsInteger(t *Type) bool {
|
||||
switch t {
|
||||
case Int, Int64, Int32, Int16, Uint, Uint64, Uint32, Uint16, Byte:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
14
vendor/modules.txt
vendored
14
vendor/modules.txt
vendored
@@ -2730,6 +2730,12 @@ k8s.io/cloud-provider-vsphere/pkg/common/config
|
||||
## explicit; go 1.24.0
|
||||
k8s.io/cluster-bootstrap/token/api
|
||||
k8s.io/cluster-bootstrap/token/util
|
||||
# k8s.io/code-generator v0.34.1
|
||||
## explicit; go 1.24.0
|
||||
k8s.io/code-generator/cmd/deepcopy-gen
|
||||
k8s.io/code-generator/cmd/deepcopy-gen/args
|
||||
k8s.io/code-generator/cmd/deepcopy-gen/generators
|
||||
k8s.io/code-generator/pkg/util
|
||||
# k8s.io/component-base v0.34.1
|
||||
## explicit; go 1.24.0
|
||||
k8s.io/component-base/featuregate
|
||||
@@ -2738,6 +2744,14 @@ k8s.io/component-base/metrics/legacyregistry
|
||||
k8s.io/component-base/metrics/prometheus/feature
|
||||
k8s.io/component-base/metrics/prometheusextension
|
||||
k8s.io/component-base/version
|
||||
# k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f
|
||||
## explicit; go 1.20
|
||||
k8s.io/gengo/v2
|
||||
k8s.io/gengo/v2/codetags
|
||||
k8s.io/gengo/v2/generator
|
||||
k8s.io/gengo/v2/namer
|
||||
k8s.io/gengo/v2/parser
|
||||
k8s.io/gengo/v2/types
|
||||
# k8s.io/klog v1.0.0
|
||||
## explicit; go 1.12
|
||||
k8s.io/klog
|
||||
|
||||
Reference in New Issue
Block a user