mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Remove old gengo detritus
This commit is contained in:
		
							
								
								
									
										206
									
								
								LICENSES/vendor/k8s.io/gengo/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										206
									
								
								LICENSES/vendor/k8s.io/gengo/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,206 +0,0 @@
 | 
			
		||||
= vendor/k8s.io/gengo licensed under: =
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                 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.
 | 
			
		||||
 | 
			
		||||
= vendor/k8s.io/gengo/LICENSE ad09685d909e7a9f763d2bb62d4bd6fb
 | 
			
		||||
							
								
								
									
										2
									
								
								LICENSES/vendor/k8s.io/gengo/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								LICENSES/vendor/k8s.io/gengo/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -203,4 +203,4 @@
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
 | 
			
		||||
= vendor/k8s.io/gengo/LICENSE ad09685d909e7a9f763d2bb62d4bd6fb
 | 
			
		||||
= vendor/k8s.io/gengo/v2/LICENSE ad09685d909e7a9f763d2bb62d4bd6fb
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							@@ -104,7 +104,6 @@ require (
 | 
			
		||||
	k8s.io/csi-translation-lib v0.0.0
 | 
			
		||||
	k8s.io/dynamic-resource-allocation v0.0.0
 | 
			
		||||
	k8s.io/endpointslice v0.0.0
 | 
			
		||||
	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01
 | 
			
		||||
	k8s.io/klog/v2 v2.120.1
 | 
			
		||||
	k8s.io/kms v0.0.0
 | 
			
		||||
	k8s.io/kube-aggregator v0.0.0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								go.sum
									
									
									
									
									
								
							@@ -352,7 +352,6 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
 | 
			
		||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 | 
			
		||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 | 
			
		||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 | 
			
		||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 | 
			
		||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
			
		||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
@@ -450,7 +449,6 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 | 
			
		||||
@@ -558,7 +556,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
			
		||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
			
		||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
@@ -1064,7 +1061,6 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs
 | 
			
		||||
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
@@ -1243,7 +1239,6 @@ google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
 | 
			
		||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
			
		||||
@@ -1278,12 +1273,9 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
 | 
			
		||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 | 
			
		||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
			
		||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 | 
			
		||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
 | 
			
		||||
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
 | 
			
		||||
@@ -1310,6 +1302,5 @@ sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,4 @@ require (
 | 
			
		||||
	sigs.k8s.io/yaml v1.3.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
)
 | 
			
		||||
replace k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
 
 | 
			
		||||
@@ -121,7 +121,6 @@ require (
 | 
			
		||||
	gopkg.in/inf.v0 v0.9.1 // indirect
 | 
			
		||||
	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect
 | 
			
		||||
	k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
 | 
			
		||||
	k8s.io/kms v0.0.0 // indirect
 | 
			
		||||
	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect
 | 
			
		||||
@@ -129,7 +128,6 @@ require (
 | 
			
		||||
 | 
			
		||||
replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apiextensions-apiserver => ../apiextensions-apiserver
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/apiserver => ../apiserver
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
 
 | 
			
		||||
@@ -184,7 +184,6 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
 | 
			
		||||
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 | 
			
		||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 | 
			
		||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 | 
			
		||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
			
		||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
@@ -232,7 +231,6 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
 | 
			
		||||
@@ -268,7 +266,6 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
			
		||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
@@ -471,7 +468,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
 | 
			
		||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
 | 
			
		||||
@@ -508,7 +504,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 | 
			
		||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
 | 
			
		||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 | 
			
		||||
@@ -526,8 +521,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
 | 
			
		||||
@@ -542,6 +535,5 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 | 
			
		||||
 
 | 
			
		||||
@@ -56,5 +56,3 @@ require (
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
 
 | 
			
		||||
@@ -127,7 +127,6 @@ require (
 | 
			
		||||
replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/apiserver => ../apiserver
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/kms => ../kms
 | 
			
		||||
 
 | 
			
		||||
@@ -73,6 +73,5 @@ require (
 | 
			
		||||
replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/cli-runtime => ../cli-runtime
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -63,5 +63,4 @@ require (
 | 
			
		||||
replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -114,7 +114,6 @@ replace (
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/apiserver => ../apiserver
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/cloud-provider => ../cloud-provider
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/component-helpers => ../component-helpers
 | 
			
		||||
	k8s.io/controller-manager => ../controller-manager
 | 
			
		||||
 
 | 
			
		||||
@@ -35,5 +35,4 @@ require (
 | 
			
		||||
replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/cluster-bootstrap => ../cluster-bootstrap
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,11 +5,13 @@ module k8s.io/code-generator
 | 
			
		||||
go 1.22.0
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/davecgh/go-spew v1.1.1
 | 
			
		||||
	github.com/gogo/protobuf v1.3.2
 | 
			
		||||
	github.com/google/gnostic-models v0.6.8
 | 
			
		||||
	github.com/google/go-cmp v0.6.0
 | 
			
		||||
	github.com/google/gofuzz v1.2.0
 | 
			
		||||
	github.com/spf13/pflag v1.0.5
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0
 | 
			
		||||
	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01
 | 
			
		||||
	k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70
 | 
			
		||||
	k8s.io/klog/v2 v2.120.1
 | 
			
		||||
	k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340
 | 
			
		||||
@@ -22,9 +24,6 @@ require (
 | 
			
		||||
	github.com/go-openapi/jsonreference v0.20.2 // indirect
 | 
			
		||||
	github.com/go-openapi/swag v0.22.3 // indirect
 | 
			
		||||
	github.com/golang/protobuf v1.5.3 // indirect
 | 
			
		||||
	github.com/google/go-cmp v0.6.0 // indirect
 | 
			
		||||
	github.com/google/gofuzz v1.2.0 // indirect
 | 
			
		||||
	github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
 | 
			
		||||
	github.com/josharian/intern v1.0.0 // indirect
 | 
			
		||||
	github.com/json-iterator/go v1.1.12 // indirect
 | 
			
		||||
	github.com/kr/pretty v0.3.1 // indirect
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								staging/src/k8s.io/code-generator/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										53
									
								
								staging/src/k8s.io/code-generator/go.sum
									
									
									
										generated
									
									
									
								
							@@ -9,7 +9,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
 | 
			
		||||
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
 | 
			
		||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 | 
			
		||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
			
		||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
 | 
			
		||||
@@ -27,13 +26,11 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg
 | 
			
		||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
 | 
			
		||||
@@ -46,7 +43,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 | 
			
		||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 | 
			
		||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
@@ -89,12 +85,6 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
||||||| parent of 58d43dc74bf (Re-vendor latest kube-openapi and gengo/v2)
 | 
			
		||||
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
 | 
			
		||||
=======
 | 
			
		||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
 | 
			
		||||
>>>>>>> 58d43dc74bf (Re-vendor latest kube-openapi and gengo/v2)
 | 
			
		||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
 | 
			
		||||
@@ -103,20 +93,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
 | 
			
		||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
 | 
			
		||||
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
 | 
			
		||||
||||||| parent of 58d43dc74bf (Re-vendor latest kube-openapi and gengo/v2)
 | 
			
		||||
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
 | 
			
		||||
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
 | 
			
		||||
golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
 | 
			
		||||
golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
 | 
			
		||||
=======
 | 
			
		||||
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
 | 
			
		||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 | 
			
		||||
golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
 | 
			
		||||
golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
 | 
			
		||||
>>>>>>> 58d43dc74bf (Re-vendor latest kube-openapi and gengo/v2)
 | 
			
		||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
@@ -128,22 +104,12 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
 | 
			
		||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
||||||| parent of 58d43dc74bf (Re-vendor latest kube-openapi and gengo/v2)
 | 
			
		||||
golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
 | 
			
		||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
 | 
			
		||||
=======
 | 
			
		||||
golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ=
 | 
			
		||||
golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
 | 
			
		||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
 | 
			
		||||
>>>>>>> 58d43dc74bf (Re-vendor latest kube-openapi and gengo/v2)
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 | 
			
		||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
 | 
			
		||||
@@ -158,7 +124,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 | 
			
		||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
 | 
			
		||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
@@ -167,31 +132,13 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20231113174909-778a5567bc1e h1:snPmy96t93RredGRjKfMFt+gvxuVAncqSAyBveJtr4Q=
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20231113174909-778a5567bc1e/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
 | 
			
		||||
k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
			
		||||
||||||| parent of 58d43dc74bf (Re-vendor latest kube-openapi and gengo/v2)
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20231113174909-778a5567bc1e h1:snPmy96t93RredGRjKfMFt+gvxuVAncqSAyBveJtr4Q=
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20231113174909-778a5567bc1e/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
 | 
			
		||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
 | 
			
		||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 | 
			
		||||
=======
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
 | 
			
		||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
 | 
			
		||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 | 
			
		||||
>>>>>>> 58d43dc74bf (Re-vendor latest kube-openapi and gengo/v2)
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 | 
			
		||||
 
 | 
			
		||||
@@ -86,5 +86,4 @@ replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -56,5 +56,4 @@ replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-helpers => ../component-helpers
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -108,6 +108,5 @@ replace (
 | 
			
		||||
	k8s.io/apiserver => ../apiserver
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/controller-manager => ../controller-manager
 | 
			
		||||
	k8s.io/kms => ../kms
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -25,5 +25,3 @@ require (
 | 
			
		||||
	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace k8s.io/cri-api => ../cri-api
 | 
			
		||||
 
 | 
			
		||||
@@ -34,5 +34,4 @@ require (
 | 
			
		||||
replace (
 | 
			
		||||
	k8s.io/api => ../api
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/csi-translation-lib => ../csi-translation-lib
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,5 @@ replace (
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/cri-api => ../cri-api
 | 
			
		||||
	k8s.io/dynamic-resource-allocation => ../dynamic-resource-allocation
 | 
			
		||||
	k8s.io/kubelet => ../kubelet
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -68,5 +68,4 @@ replace (
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/endpointslice => ../endpointslice
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -18,5 +18,3 @@ require (
 | 
			
		||||
	google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
 | 
			
		||||
	google.golang.org/protobuf v1.31.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace k8s.io/kms => ../kms
 | 
			
		||||
 
 | 
			
		||||
@@ -104,7 +104,6 @@ require (
 | 
			
		||||
	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect
 | 
			
		||||
	k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
 | 
			
		||||
	k8s.io/kms v0.0.0 // indirect
 | 
			
		||||
	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect
 | 
			
		||||
@@ -120,5 +119,4 @@ replace (
 | 
			
		||||
	k8s.io/code-generator => ../code-generator
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/kms => ../kms
 | 
			
		||||
	k8s.io/kube-aggregator => ../kube-aggregator
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								staging/src/k8s.io/kube-aggregator/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								staging/src/k8s.io/kube-aggregator/go.sum
									
									
									
										generated
									
									
									
								
							@@ -168,7 +168,6 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 | 
			
		||||
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 | 
			
		||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 | 
			
		||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 | 
			
		||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
			
		||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
@@ -204,13 +203,11 @@ github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto=
 | 
			
		||||
github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
 | 
			
		||||
@@ -243,7 +240,6 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
 | 
			
		||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 | 
			
		||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
@@ -403,7 +399,6 @@ golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 | 
			
		||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
 | 
			
		||||
@@ -428,7 +423,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 | 
			
		||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
 | 
			
		||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 | 
			
		||||
@@ -443,8 +437,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
 | 
			
		||||
@@ -459,6 +451,5 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 | 
			
		||||
 
 | 
			
		||||
@@ -40,5 +40,4 @@ replace (
 | 
			
		||||
	k8s.io/component-helpers => ../component-helpers
 | 
			
		||||
	k8s.io/controller-manager => ../controller-manager
 | 
			
		||||
	k8s.io/kms => ../kms
 | 
			
		||||
	k8s.io/kube-controller-manager => ../kube-controller-manager
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -48,5 +48,4 @@ replace (
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/kube-proxy => ../kube-proxy
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -34,5 +34,4 @@ replace (
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/kube-scheduler => ../kube-scheduler
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -103,6 +103,5 @@ replace (
 | 
			
		||||
	k8s.io/code-generator => ../code-generator
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/component-helpers => ../component-helpers
 | 
			
		||||
	k8s.io/kubectl => ../kubectl
 | 
			
		||||
	k8s.io/metrics => ../metrics
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/kubectl/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/kubectl/go.sum
									
									
									
										generated
									
									
									
								
							@@ -319,7 +319,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 | 
			
		||||
 
 | 
			
		||||
@@ -68,5 +68,4 @@ replace (
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/cri-api => ../cri-api
 | 
			
		||||
	k8s.io/kms => ../kms
 | 
			
		||||
	k8s.io/kubelet => ../kubelet
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -87,5 +87,4 @@ replace (
 | 
			
		||||
	k8s.io/component-helpers => ../component-helpers
 | 
			
		||||
	k8s.io/controller-manager => ../controller-manager
 | 
			
		||||
	k8s.io/kms => ../kms
 | 
			
		||||
	k8s.io/legacy-cloud-providers => ../legacy-cloud-providers
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,6 @@ require (
 | 
			
		||||
	gopkg.in/inf.v0 v0.9.1 // indirect
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect
 | 
			
		||||
	k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
 | 
			
		||||
	k8s.io/klog/v2 v2.120.1 // indirect
 | 
			
		||||
	k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
 | 
			
		||||
@@ -63,5 +62,4 @@ replace (
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/code-generator => ../code-generator
 | 
			
		||||
	k8s.io/metrics => ../metrics
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								staging/src/k8s.io/metrics/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								staging/src/k8s.io/metrics/go.sum
									
									
									
										generated
									
									
									
								
							@@ -12,7 +12,6 @@ github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr
 | 
			
		||||
github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
 | 
			
		||||
github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 | 
			
		||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 | 
			
		||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
			
		||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
 | 
			
		||||
@@ -33,13 +32,11 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
 | 
			
		||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
 | 
			
		||||
@@ -55,7 +52,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 | 
			
		||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 | 
			
		||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
@@ -139,7 +135,6 @@ golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 | 
			
		||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
 | 
			
		||||
@@ -156,7 +151,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 | 
			
		||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
 | 
			
		||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 | 
			
		||||
@@ -167,8 +161,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
 | 
			
		||||
@@ -181,6 +173,5 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 | 
			
		||||
 
 | 
			
		||||
@@ -21,5 +21,3 @@ require (
 | 
			
		||||
	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace k8s.io/mount-utils => ../mount-utils
 | 
			
		||||
 
 | 
			
		||||
@@ -112,5 +112,4 @@ replace (
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/kms => ../kms
 | 
			
		||||
	k8s.io/pod-security-admission => ../pod-security-admission
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -98,7 +98,6 @@ require (
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
	k8s.io/api v0.0.0 // indirect
 | 
			
		||||
	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect
 | 
			
		||||
	k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
 | 
			
		||||
	k8s.io/klog/v2 v2.120.1 // indirect
 | 
			
		||||
	k8s.io/kms v0.0.0 // indirect
 | 
			
		||||
@@ -115,5 +114,4 @@ replace (
 | 
			
		||||
	k8s.io/code-generator => ../code-generator
 | 
			
		||||
	k8s.io/component-base => ../component-base
 | 
			
		||||
	k8s.io/kms => ../kms
 | 
			
		||||
	k8s.io/sample-apiserver => ../sample-apiserver
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								staging/src/k8s.io/sample-apiserver/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								staging/src/k8s.io/sample-apiserver/go.sum
									
									
									
										generated
									
									
									
								
							@@ -167,7 +167,6 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 | 
			
		||||
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 | 
			
		||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 | 
			
		||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 | 
			
		||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
			
		||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
@@ -203,13 +202,11 @@ github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto=
 | 
			
		||||
github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
 | 
			
		||||
@@ -241,7 +238,6 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
 | 
			
		||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 | 
			
		||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
@@ -399,7 +395,6 @@ golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 | 
			
		||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
 | 
			
		||||
@@ -424,7 +419,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 | 
			
		||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
 | 
			
		||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 | 
			
		||||
@@ -439,8 +433,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
 | 
			
		||||
@@ -455,6 +447,5 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 | 
			
		||||
 
 | 
			
		||||
@@ -73,5 +73,4 @@ replace (
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/cli-runtime => ../cli-runtime
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/sample-cli-plugin => ../sample-cli-plugin
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,6 @@ require (
 | 
			
		||||
	gopkg.in/inf.v0 v0.9.1 // indirect
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect
 | 
			
		||||
	k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
 | 
			
		||||
	k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
 | 
			
		||||
	k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
 | 
			
		||||
@@ -63,5 +62,4 @@ replace (
 | 
			
		||||
	k8s.io/apimachinery => ../apimachinery
 | 
			
		||||
	k8s.io/client-go => ../client-go
 | 
			
		||||
	k8s.io/code-generator => ../code-generator
 | 
			
		||||
	k8s.io/sample-controller => ../sample-controller
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								staging/src/k8s.io/sample-controller/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								staging/src/k8s.io/sample-controller/go.sum
									
									
									
										generated
									
									
									
								
							@@ -12,7 +12,6 @@ github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr
 | 
			
		||||
github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
 | 
			
		||||
github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 | 
			
		||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 | 
			
		||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
			
		||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
 | 
			
		||||
@@ -34,13 +33,11 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
 | 
			
		||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
 | 
			
		||||
@@ -57,7 +54,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 | 
			
		||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 | 
			
		||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
@@ -141,7 +137,6 @@ golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 | 
			
		||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
 | 
			
		||||
@@ -158,7 +153,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 | 
			
		||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
 | 
			
		||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 | 
			
		||||
@@ -169,8 +163,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks=
 | 
			
		||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo=
 | 
			
		||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 | 
			
		||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
 | 
			
		||||
@@ -183,6 +175,5 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 | 
			
		||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										202
									
								
								vendor/k8s.io/gengo/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										202
									
								
								vendor/k8s.io/gengo/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,202 +0,0 @@
 | 
			
		||||
 | 
			
		||||
                                 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.
 | 
			
		||||
							
								
								
									
										199
									
								
								vendor/k8s.io/gengo/args/args.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										199
									
								
								vendor/k8s.io/gengo/args/args.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,199 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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 args has common command-line flags for generation programs.
 | 
			
		||||
package args
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	goflag "flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/gengo/generator"
 | 
			
		||||
	"k8s.io/gengo/namer"
 | 
			
		||||
	"k8s.io/gengo/parser"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/pflag"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Default returns a defaulted GeneratorArgs. You may change the defaults
 | 
			
		||||
// before calling AddFlags.
 | 
			
		||||
func Default() *GeneratorArgs {
 | 
			
		||||
	return &GeneratorArgs{
 | 
			
		||||
		OutputBase:                 DefaultSourceTree(),
 | 
			
		||||
		GoHeaderFilePath:           filepath.Join(DefaultSourceTree(), "k8s.io/gengo/boilerplate/boilerplate.go.txt"),
 | 
			
		||||
		GeneratedBuildTag:          "ignore_autogenerated",
 | 
			
		||||
		GeneratedByCommentTemplate: "// Code generated by GENERATOR_NAME. DO NOT EDIT.",
 | 
			
		||||
		defaultCommandLineFlags:    true,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GeneratorArgs has arguments that are passed to generators.
 | 
			
		||||
type GeneratorArgs struct {
 | 
			
		||||
	// Which directories to parse.
 | 
			
		||||
	InputDirs []string
 | 
			
		||||
 | 
			
		||||
	// Source tree to write results to.
 | 
			
		||||
	OutputBase string
 | 
			
		||||
 | 
			
		||||
	// Package path within the source tree.
 | 
			
		||||
	OutputPackagePath string
 | 
			
		||||
 | 
			
		||||
	// Output file name.
 | 
			
		||||
	OutputFileBaseName string
 | 
			
		||||
 | 
			
		||||
	// Where to get copyright header text.
 | 
			
		||||
	GoHeaderFilePath string
 | 
			
		||||
 | 
			
		||||
	// If GeneratedByCommentTemplate is set, generate a "Code generated by" comment
 | 
			
		||||
	// below the bloilerplate, of the format defined by this string.
 | 
			
		||||
	// Any instances of "GENERATOR_NAME" will be replaced with the name of the code generator.
 | 
			
		||||
	GeneratedByCommentTemplate string
 | 
			
		||||
 | 
			
		||||
	// If true, only verify, don't write anything.
 | 
			
		||||
	VerifyOnly bool
 | 
			
		||||
 | 
			
		||||
	// If true, include *_test.go files
 | 
			
		||||
	IncludeTestFiles bool
 | 
			
		||||
 | 
			
		||||
	// GeneratedBuildTag is the tag used to identify code generated by execution
 | 
			
		||||
	// of this type. Each generator should use a different tag, and different
 | 
			
		||||
	// groups of generators (external API that depends on Kube generations) should
 | 
			
		||||
	// keep tags distinct as well.
 | 
			
		||||
	GeneratedBuildTag string
 | 
			
		||||
 | 
			
		||||
	// Any custom arguments go here
 | 
			
		||||
	CustomArgs interface{}
 | 
			
		||||
 | 
			
		||||
	// If specified, trim the prefix from OutputPackagePath before writing files.
 | 
			
		||||
	TrimPathPrefix string
 | 
			
		||||
 | 
			
		||||
	// Whether to use default command line flags
 | 
			
		||||
	defaultCommandLineFlags bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithoutDefaultFlagParsing disables implicit addition of command line flags and parsing.
 | 
			
		||||
func (g *GeneratorArgs) WithoutDefaultFlagParsing() *GeneratorArgs {
 | 
			
		||||
	g.defaultCommandLineFlags = false
 | 
			
		||||
	return g
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *GeneratorArgs) AddFlags(fs *pflag.FlagSet) {
 | 
			
		||||
	fs.StringSliceVarP(&g.InputDirs, "input-dirs", "i", g.InputDirs, "Comma-separated list of import paths to get input types from.")
 | 
			
		||||
	fs.StringVarP(&g.OutputBase, "output-base", "o", g.OutputBase, "Output base; defaults to $GOPATH/src/ or ./ if $GOPATH is not set.")
 | 
			
		||||
	fs.StringVarP(&g.OutputPackagePath, "output-package", "p", g.OutputPackagePath, "Base package path.")
 | 
			
		||||
	fs.StringVarP(&g.OutputFileBaseName, "output-file-base", "O", g.OutputFileBaseName, "Base name (without .go suffix) for output files.")
 | 
			
		||||
	fs.StringVarP(&g.GoHeaderFilePath, "go-header-file", "h", g.GoHeaderFilePath, "File containing boilerplate header text. The string YEAR will be replaced with the current 4-digit year.")
 | 
			
		||||
	fs.BoolVar(&g.VerifyOnly, "verify-only", g.VerifyOnly, "If true, only verify existing output, do not write anything.")
 | 
			
		||||
	fs.StringVar(&g.GeneratedBuildTag, "build-tag", g.GeneratedBuildTag, "A Go build tag to use to identify files generated by this command. Should be unique.")
 | 
			
		||||
	fs.StringVar(&g.TrimPathPrefix, "trim-path-prefix", g.TrimPathPrefix, "If set, trim the specified prefix from --output-package when generating files.")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadGoBoilerplate loads the boilerplate file passed to --go-header-file.
 | 
			
		||||
func (g *GeneratorArgs) LoadGoBoilerplate() ([]byte, error) {
 | 
			
		||||
	b, err := ioutil.ReadFile(g.GoHeaderFilePath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	b = bytes.Replace(b, []byte("YEAR"), []byte(strconv.Itoa(time.Now().UTC().Year())), -1)
 | 
			
		||||
 | 
			
		||||
	if g.GeneratedByCommentTemplate != "" {
 | 
			
		||||
		if len(b) != 0 {
 | 
			
		||||
			b = append(b, byte('\n'))
 | 
			
		||||
		}
 | 
			
		||||
		generatorName := path.Base(os.Args[0])
 | 
			
		||||
		generatedByComment := strings.Replace(g.GeneratedByCommentTemplate, "GENERATOR_NAME", generatorName, -1)
 | 
			
		||||
		s := fmt.Sprintf("%s\n\n", generatedByComment)
 | 
			
		||||
		b = append(b, []byte(s)...)
 | 
			
		||||
	}
 | 
			
		||||
	return b, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewBuilder makes a new parser.Builder and populates it with the input
 | 
			
		||||
// directories.
 | 
			
		||||
func (g *GeneratorArgs) NewBuilder() (*parser.Builder, error) {
 | 
			
		||||
	b := parser.New()
 | 
			
		||||
 | 
			
		||||
	// flag for including *_test.go
 | 
			
		||||
	b.IncludeTestFiles = g.IncludeTestFiles
 | 
			
		||||
 | 
			
		||||
	// Ignore all auto-generated files.
 | 
			
		||||
	b.AddBuildTags(g.GeneratedBuildTag)
 | 
			
		||||
 | 
			
		||||
	for _, d := range g.InputDirs {
 | 
			
		||||
		var err error
 | 
			
		||||
		if strings.HasSuffix(d, "/...") {
 | 
			
		||||
			err = b.AddDirRecursive(strings.TrimSuffix(d, "/..."))
 | 
			
		||||
		} else {
 | 
			
		||||
			err = b.AddDir(d)
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, fmt.Errorf("unable to add directory %q: %v", d, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return b, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DefaultSourceTree returns the /src directory of the first entry in $GOPATH.
 | 
			
		||||
// If $GOPATH is empty, it returns "./". Useful as a default output location.
 | 
			
		||||
func DefaultSourceTree() string {
 | 
			
		||||
	paths := strings.Split(os.Getenv("GOPATH"), string(filepath.ListSeparator))
 | 
			
		||||
	if len(paths) > 0 && len(paths[0]) > 0 {
 | 
			
		||||
		return filepath.Join(paths[0], "src")
 | 
			
		||||
	}
 | 
			
		||||
	return "./"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Execute implements main().
 | 
			
		||||
// If you don't need any non-default behavior, use as:
 | 
			
		||||
// args.Default().Execute(...)
 | 
			
		||||
func (g *GeneratorArgs) Execute(nameSystems namer.NameSystems, defaultSystem string, pkgs func(*generator.Context, *GeneratorArgs) generator.Packages) error {
 | 
			
		||||
	if g.defaultCommandLineFlags {
 | 
			
		||||
		g.AddFlags(pflag.CommandLine)
 | 
			
		||||
		pflag.CommandLine.AddGoFlagSet(goflag.CommandLine)
 | 
			
		||||
		pflag.Parse()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	b, err := g.NewBuilder()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("Failed making a parser: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// pass through the flag on whether to include *_test.go files
 | 
			
		||||
	b.IncludeTestFiles = g.IncludeTestFiles
 | 
			
		||||
 | 
			
		||||
	c, err := generator.NewContext(b, nameSystems, defaultSystem)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("Failed making a context: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.TrimPathPrefix = g.TrimPathPrefix
 | 
			
		||||
 | 
			
		||||
	c.Verify = g.VerifyOnly
 | 
			
		||||
	packages := pkgs(c, g)
 | 
			
		||||
	if err := c.ExecutePackages(g.OutputBase, packages); err != nil {
 | 
			
		||||
		return fmt.Errorf("Failed executing generator: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										935
									
								
								vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										935
									
								
								vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,935 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2015 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package generators
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/gengo/args"
 | 
			
		||||
	"k8s.io/gengo/examples/set-gen/sets"
 | 
			
		||||
	"k8s.io/gengo/generator"
 | 
			
		||||
	"k8s.io/gengo/namer"
 | 
			
		||||
	"k8s.io/gengo/types"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CustomArgs is used tby the go2idl framework to pass args specific to this
 | 
			
		||||
// generator.
 | 
			
		||||
type CustomArgs struct {
 | 
			
		||||
	BoundingDirs []string // Only deal with types rooted under these dirs.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This is the comment tag that carries parameters for deep-copy generation.
 | 
			
		||||
const (
 | 
			
		||||
	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 {
 | 
			
		||||
	tagVals := types.ExtractCommentTags("+", comments)[tagEnabledName]
 | 
			
		||||
	if tagVals == nil {
 | 
			
		||||
		// No match for the tag.
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	// If there are multiple values, abort.
 | 
			
		||||
	if len(tagVals) > 1 {
 | 
			
		||||
		klog.Fatalf("Found %d %s tags: %q", len(tagVals), tagEnabledName, tagVals)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If we got here we are returning something.
 | 
			
		||||
	tag := &enabledTagValue{}
 | 
			
		||||
 | 
			
		||||
	// Get the primary value.
 | 
			
		||||
	parts := strings.Split(tagVals[0], ",")
 | 
			
		||||
	if len(parts) >= 1 {
 | 
			
		||||
		tag.value = parts[0]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Parse extra arguments.
 | 
			
		||||
	parts = parts[1:]
 | 
			
		||||
	for i := range parts {
 | 
			
		||||
		kv := strings.SplitN(parts[i], "=", 2)
 | 
			
		||||
		k := kv[0]
 | 
			
		||||
		v := ""
 | 
			
		||||
		if len(kv) == 2 {
 | 
			
		||||
			v = kv[1]
 | 
			
		||||
		}
 | 
			
		||||
		switch k {
 | 
			
		||||
		case "register":
 | 
			
		||||
			if v != "false" {
 | 
			
		||||
				tag.register = true
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			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 Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
 | 
			
		||||
	boilerplate, err := arguments.LoadGoBoilerplate()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		klog.Fatalf("Failed loading boilerplate: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inputs := sets.NewString(context.Inputs...)
 | 
			
		||||
	packages := generator.Packages{}
 | 
			
		||||
	header := append([]byte(fmt.Sprintf("//go:build !%s\n// +build !%s\n\n", arguments.GeneratedBuildTag, arguments.GeneratedBuildTag)), boilerplate...)
 | 
			
		||||
 | 
			
		||||
	boundingDirs := []string{}
 | 
			
		||||
	if customArgs, ok := arguments.CustomArgs.(*CustomArgs); ok {
 | 
			
		||||
		if customArgs.BoundingDirs == nil {
 | 
			
		||||
			customArgs.BoundingDirs = context.Inputs
 | 
			
		||||
		}
 | 
			
		||||
		for i := range customArgs.BoundingDirs {
 | 
			
		||||
			// Strip any trailing slashes - they are not exactly "correct" but
 | 
			
		||||
			// this is friendlier.
 | 
			
		||||
			boundingDirs = append(boundingDirs, strings.TrimRight(customArgs.BoundingDirs[i], "/"))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := range inputs {
 | 
			
		||||
		klog.V(5).Infof("Considering pkg %q", i)
 | 
			
		||||
		pkg := context.Universe[i]
 | 
			
		||||
		if pkg == nil {
 | 
			
		||||
			// If the input had no Go files, for example.
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ptag := 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(5).Infof("  tag.value: %q, tag.register: %t", ptagValue, ptagRegister)
 | 
			
		||||
		} else {
 | 
			
		||||
			klog.V(5).Infof("  no tag")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// If the pkg-scoped tag says to generate, we can skip scanning types.
 | 
			
		||||
		pkgNeedsGeneration := (ptagValue == tagValuePackage)
 | 
			
		||||
		if !pkgNeedsGeneration {
 | 
			
		||||
			// If the pkg-scoped tag did not exist, scan all types for one that
 | 
			
		||||
			// explicitly wants generation. Ensure all types that want generation
 | 
			
		||||
			// can be copied.
 | 
			
		||||
			var uncopyable []string
 | 
			
		||||
			for _, t := range pkg.Types {
 | 
			
		||||
				klog.V(5).Infof("  considering type %q", t.Name.String())
 | 
			
		||||
				ttag := extractEnabledTypeTag(t)
 | 
			
		||||
				if ttag != nil && ttag.value == "true" {
 | 
			
		||||
					klog.V(5).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)
 | 
			
		||||
			path := pkg.Path
 | 
			
		||||
			// if the source path is within a /vendor/ directory (for example,
 | 
			
		||||
			// k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1), allow
 | 
			
		||||
			// generation to output to the proper relative path (under vendor).
 | 
			
		||||
			// Otherwise, the generator will create the file in the wrong location
 | 
			
		||||
			// in the output directory.
 | 
			
		||||
			// TODO: build a more fundamental concept in gengo for dealing with modifications
 | 
			
		||||
			// to vendored packages.
 | 
			
		||||
			if strings.HasPrefix(pkg.SourcePath, arguments.OutputBase) {
 | 
			
		||||
				expandedPath := strings.TrimPrefix(pkg.SourcePath, arguments.OutputBase)
 | 
			
		||||
				if strings.Contains(expandedPath, "/vendor/") {
 | 
			
		||||
					path = expandedPath
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			packages = append(packages,
 | 
			
		||||
				&generator.DefaultPackage{
 | 
			
		||||
					PackageName: strings.Split(filepath.Base(pkg.Path), ".")[0],
 | 
			
		||||
					PackagePath: path,
 | 
			
		||||
					HeaderText:  header,
 | 
			
		||||
					GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
 | 
			
		||||
						return []generator.Generator{
 | 
			
		||||
							NewGenDeepCopy(arguments.OutputFileBaseName, pkg.Path, boundingDirs, (ptagValue == tagValuePackage), ptagRegister),
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					FilterFunc: func(c *generator.Context, t *types.Type) bool {
 | 
			
		||||
						return t.Name.Package == pkg.Path
 | 
			
		||||
					},
 | 
			
		||||
				})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return packages
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// genDeepCopy produces a file with autogenerated deep-copy functions.
 | 
			
		||||
type genDeepCopy struct {
 | 
			
		||||
	generator.DefaultGen
 | 
			
		||||
	targetPackage string
 | 
			
		||||
	boundingDirs  []string
 | 
			
		||||
	allTypes      bool
 | 
			
		||||
	registerTypes bool
 | 
			
		||||
	imports       namer.ImportTracker
 | 
			
		||||
	typesForInit  []*types.Type
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewGenDeepCopy(sanitizedName, targetPackage string, boundingDirs []string, allTypes, registerTypes bool) generator.Generator {
 | 
			
		||||
	return &genDeepCopy{
 | 
			
		||||
		DefaultGen: generator.DefaultGen{
 | 
			
		||||
			OptionalName: sanitizedName,
 | 
			
		||||
		},
 | 
			
		||||
		targetPackage: targetPackage,
 | 
			
		||||
		boundingDirs:  boundingDirs,
 | 
			
		||||
		allTypes:      allTypes,
 | 
			
		||||
		registerTypes: registerTypes,
 | 
			
		||||
		imports:       generator.NewImportTracker(),
 | 
			
		||||
		typesForInit:  make([]*types.Type, 0),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *genDeepCopy) Namers(c *generator.Context) namer.NameSystems {
 | 
			
		||||
	// Have the raw namer for this file track what it imports.
 | 
			
		||||
	return namer.NameSystems{
 | 
			
		||||
		"raw": namer.NewRawNamer(g.targetPackage, g.imports),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *genDeepCopy) Filter(c *generator.Context, t *types.Type) bool {
 | 
			
		||||
	// Filter out types not being processed or not copyable within the package.
 | 
			
		||||
	enabled := g.allTypes
 | 
			
		||||
	if !enabled {
 | 
			
		||||
		ttag := extractEnabledTypeTag(t)
 | 
			
		||||
		if ttag != nil && ttag.value == "true" {
 | 
			
		||||
			enabled = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if !enabled {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !copyableType(t) {
 | 
			
		||||
		klog.V(2).Infof("Type %v is not copyable", t)
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	klog.V(4).Infof("Type %v is copyable", t)
 | 
			
		||||
	g.typesForInit = append(g.typesForInit, t)
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *genDeepCopy) copyableAndInBounds(t *types.Type) bool {
 | 
			
		||||
	if !copyableType(t) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	// Only packages within the restricted range can be processed.
 | 
			
		||||
	if !isRootedUnder(t.Name.Package, g.boundingDirs) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// deepCopyMethod returns the signature of a DeepCopy() method, nil or an error
 | 
			
		||||
// if the type does not match. This allows more efficient deep copy
 | 
			
		||||
// implementations to be defined by the type's author.  The correct signature
 | 
			
		||||
// for a type T is:
 | 
			
		||||
//    func (t T) DeepCopy() T
 | 
			
		||||
// or:
 | 
			
		||||
//    func (t *T) DeepCopy() *T
 | 
			
		||||
func deepCopyMethod(t *types.Type) (*types.Signature, error) {
 | 
			
		||||
	f, found := t.Methods["DeepCopy"]
 | 
			
		||||
	if !found {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	if len(f.Signature.Parameters) != 0 {
 | 
			
		||||
		return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected no parameters", t)
 | 
			
		||||
	}
 | 
			
		||||
	if len(f.Signature.Results) != 1 {
 | 
			
		||||
		return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected exactly one result", t)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ptrResult := f.Signature.Results[0].Kind == types.Pointer && f.Signature.Results[0].Elem.Name == t.Name
 | 
			
		||||
	nonPtrResult := f.Signature.Results[0].Name == t.Name
 | 
			
		||||
 | 
			
		||||
	if !ptrResult && !nonPtrResult {
 | 
			
		||||
		return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected to return %s or *%s", t, t.Name.Name, t.Name.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ptrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Kind == types.Pointer && f.Signature.Receiver.Elem.Name == t.Name
 | 
			
		||||
	nonPtrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Name == t.Name
 | 
			
		||||
 | 
			
		||||
	if ptrRcvr && !ptrResult {
 | 
			
		||||
		return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a *%s result for a *%s receiver", t, t.Name.Name, t.Name.Name)
 | 
			
		||||
	}
 | 
			
		||||
	if nonPtrRcvr && !nonPtrResult {
 | 
			
		||||
		return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a %s result for a %s receiver", t, t.Name.Name, t.Name.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return f.Signature, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// deepCopyMethodOrDie returns the signatrue of a DeepCopy method, nil or calls 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].Kind == types.Pointer && f.Signature.Parameters[0].Elem.Name == t.Name
 | 
			
		||||
 | 
			
		||||
	if !ptrParam {
 | 
			
		||||
		return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected parameter of type *%s", t, t.Name.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ptrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Kind == types.Pointer && f.Signature.Receiver.Elem.Name == t.Name
 | 
			
		||||
	nonPtrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Name == t.Name
 | 
			
		||||
 | 
			
		||||
	if !ptrRcvr && !nonPtrRcvr {
 | 
			
		||||
		// this should never happen
 | 
			
		||||
		return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a receiver of type %s or *%s", t, t.Name.Name, t.Name.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return f.Signature, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// deepCopyIntoMethodOrDie returns the signature of a DeepCopyInto() method, nil or calls 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 isRootedUnder(pkg string, roots []string) bool {
 | 
			
		||||
	// Add trailing / to avoid false matches, e.g. foo/bar vs foo/barn.  This
 | 
			
		||||
	// assumes that bounding dirs do not have trailing slashes.
 | 
			
		||||
	pkg = pkg + "/"
 | 
			
		||||
	for _, root := range roots {
 | 
			
		||||
		if strings.HasPrefix(pkg, root+"/") {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func copyableType(t *types.Type) bool {
 | 
			
		||||
	// If the type opts out of copy-generation, stop.
 | 
			
		||||
	ttag := 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(5).Infof("Not generating for type %v because type opted out", t)
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !g.allTypes && tv != "true" {
 | 
			
		||||
		// The whole package is NOT being generated, and this type has NOT opted in.
 | 
			
		||||
		klog.V(5).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...)
 | 
			
		||||
	values := types.ExtractCommentTags("+", comments)[interfacesTagName]
 | 
			
		||||
	for _, v := range values {
 | 
			
		||||
		if len(v) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		intfs := strings.Split(v, ",")
 | 
			
		||||
		for _, intf := range intfs {
 | 
			
		||||
			if intf == "" {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			result = append(result, intf)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func extractNonPointerInterfaces(t *types.Type) (bool, error) {
 | 
			
		||||
	comments := append(append([]string{}, t.SecondClosestCommentLines...), t.CommentLines...)
 | 
			
		||||
	values := types.ExtractCommentTags("+", comments)[interfacesNonPointerTagName]
 | 
			
		||||
	if len(values) == 0 {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
	result := values[0] == "true"
 | 
			
		||||
	for _, v := range values {
 | 
			
		||||
		if v == "true" != result {
 | 
			
		||||
			return false, fmt.Errorf("contradicting %v value %q found to previous value %v", interfacesNonPointerTagName, v, result)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *genDeepCopy) deepCopyableInterfacesInner(c *generator.Context, t *types.Type) ([]*types.Type, error) {
 | 
			
		||||
	if t.Kind != types.Struct {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	intfs := extractInterfacesTag(t)
 | 
			
		||||
 | 
			
		||||
	var ts []*types.Type
 | 
			
		||||
	for _, intf := range intfs {
 | 
			
		||||
		t := types.ParseFullyQualifiedName(intf)
 | 
			
		||||
		err := c.AddDir(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(5).Infof("Generating deepcopy function for type %v", t)
 | 
			
		||||
 | 
			
		||||
	sw := generator.NewSnippetWriter(w, c, "$", "$")
 | 
			
		||||
	args := argsFromType(t)
 | 
			
		||||
 | 
			
		||||
	if deepCopyIntoMethodOrDie(t) == nil {
 | 
			
		||||
		sw.Do("// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\n", args)
 | 
			
		||||
		if isReference(t) {
 | 
			
		||||
			sw.Do("func (in $.type|raw$) DeepCopyInto(out *$.type|raw$) {\n", args)
 | 
			
		||||
			sw.Do("{in:=&in\n", nil)
 | 
			
		||||
		} else {
 | 
			
		||||
			sw.Do("func (in *$.type|raw$) DeepCopyInto(out *$.type|raw$) {\n", args)
 | 
			
		||||
		}
 | 
			
		||||
		if deepCopyMethodOrDie(t) != nil {
 | 
			
		||||
			if t.Methods["DeepCopy"].Signature.Receiver.Kind == types.Pointer {
 | 
			
		||||
				sw.Do("clone := in.DeepCopy()\n", nil)
 | 
			
		||||
				sw.Do("*out = *clone\n", nil)
 | 
			
		||||
			} else {
 | 
			
		||||
				sw.Do("*out = in.DeepCopy()\n", nil)
 | 
			
		||||
			}
 | 
			
		||||
			sw.Do("return\n", nil)
 | 
			
		||||
		} else {
 | 
			
		||||
			g.generateFor(t, sw)
 | 
			
		||||
			sw.Do("return\n", nil)
 | 
			
		||||
		}
 | 
			
		||||
		if isReference(t) {
 | 
			
		||||
			sw.Do("}\n", nil)
 | 
			
		||||
		}
 | 
			
		||||
		sw.Do("}\n\n", nil)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if deepCopyMethodOrDie(t) == nil {
 | 
			
		||||
		sw.Do("// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new $.type|raw$.\n", args)
 | 
			
		||||
		if isReference(t) {
 | 
			
		||||
			sw.Do("func (in $.type|raw$) DeepCopy() $.type|raw$ {\n", args)
 | 
			
		||||
		} else {
 | 
			
		||||
			sw.Do("func (in *$.type|raw$) DeepCopy() *$.type|raw$ {\n", args)
 | 
			
		||||
		}
 | 
			
		||||
		sw.Do("if in == nil { return nil }\n", nil)
 | 
			
		||||
		sw.Do("out := new($.type|raw$)\n", args)
 | 
			
		||||
		sw.Do("in.DeepCopyInto(out)\n", nil)
 | 
			
		||||
		if isReference(t) {
 | 
			
		||||
			sw.Do("return *out\n", nil)
 | 
			
		||||
		} else {
 | 
			
		||||
			sw.Do("return out\n", nil)
 | 
			
		||||
		}
 | 
			
		||||
		sw.Do("}\n\n", nil)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	intfs, nonPointerReceiver, err := g.deepCopyableInterfaces(c, t)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, intf := range intfs {
 | 
			
		||||
		sw.Do(fmt.Sprintf("// DeepCopy%s is an autogenerated deepcopy function, copying the receiver, creating a new $.type2|raw$.\n", intf.Name.Name), argsFromType(t, intf))
 | 
			
		||||
		if nonPointerReceiver {
 | 
			
		||||
			sw.Do(fmt.Sprintf("func (in $.type|raw$) DeepCopy%s() $.type2|raw$ {\n", intf.Name.Name), argsFromType(t, intf))
 | 
			
		||||
			sw.Do("return *in.DeepCopy()", nil)
 | 
			
		||||
			sw.Do("}\n\n", nil)
 | 
			
		||||
		} else {
 | 
			
		||||
			sw.Do(fmt.Sprintf("func (in *$.type|raw$) DeepCopy%s() $.type2|raw$ {\n", intf.Name.Name), argsFromType(t, intf))
 | 
			
		||||
			sw.Do("if c := in.DeepCopy(); c != nil {\n", nil)
 | 
			
		||||
			sw.Do("return c\n", nil)
 | 
			
		||||
			sw.Do("}\n", nil)
 | 
			
		||||
			sw.Do("return nil\n", nil)
 | 
			
		||||
			sw.Do("}\n\n", nil)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sw.Error()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isReference return true for pointer, maps, slices and aliases of those.
 | 
			
		||||
func isReference(t *types.Type) bool {
 | 
			
		||||
	if t.Kind == types.Pointer || t.Kind == types.Map || t.Kind == types.Slice {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return t.Kind == types.Alias && isReference(underlyingType(t))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// we use the system of shadowing 'in' and 'out' so that the same code is valid
 | 
			
		||||
// at any nesting level. This makes the autogenerator easy to understand, and
 | 
			
		||||
// the compiler shouldn't care.
 | 
			
		||||
func (g *genDeepCopy) generateFor(t *types.Type, sw *generator.SnippetWriter) {
 | 
			
		||||
	// derive inner types if t is an alias. We call the do* methods below with the alias type.
 | 
			
		||||
	// basic rule: generate according to inner type, but construct objects with the alias type.
 | 
			
		||||
	ut := underlyingType(t)
 | 
			
		||||
 | 
			
		||||
	var f func(*types.Type, *generator.SnippetWriter)
 | 
			
		||||
	switch ut.Kind {
 | 
			
		||||
	case types.Builtin:
 | 
			
		||||
		f = g.doBuiltin
 | 
			
		||||
	case types.Map:
 | 
			
		||||
		f = g.doMap
 | 
			
		||||
	case types.Slice:
 | 
			
		||||
		f = g.doSlice
 | 
			
		||||
	case types.Struct:
 | 
			
		||||
		f = g.doStruct
 | 
			
		||||
	case types.Pointer:
 | 
			
		||||
		f = g.doPointer
 | 
			
		||||
	case types.Interface:
 | 
			
		||||
		// interfaces are handled in-line in the other cases
 | 
			
		||||
		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].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].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", uft, ft, t)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// doPointer generates code for a pointer or an alias to a pointer. The generated code is
 | 
			
		||||
// is the same for both cases, i.e. it's the code for the underlying type.
 | 
			
		||||
func (g *genDeepCopy) doPointer(t *types.Type, sw *generator.SnippetWriter) {
 | 
			
		||||
	ut := underlyingType(t)
 | 
			
		||||
	uet := underlyingType(ut.Elem)
 | 
			
		||||
 | 
			
		||||
	dc, dci := deepCopyMethodOrDie(ut.Elem), deepCopyIntoMethodOrDie(ut.Elem)
 | 
			
		||||
	switch {
 | 
			
		||||
	case dc != nil || dci != nil:
 | 
			
		||||
		rightPointer := !isReference(ut.Elem)
 | 
			
		||||
		if dc != nil {
 | 
			
		||||
			rightPointer = dc.Results[0].Kind == types.Pointer
 | 
			
		||||
		}
 | 
			
		||||
		if rightPointer {
 | 
			
		||||
			sw.Do("*out = (*in).DeepCopy()\n", nil)
 | 
			
		||||
		} else {
 | 
			
		||||
			sw.Do("x := (*in).DeepCopy()\n", nil)
 | 
			
		||||
			sw.Do("*out = &x\n", nil)
 | 
			
		||||
		}
 | 
			
		||||
	case uet.IsAssignable():
 | 
			
		||||
		sw.Do("*out = new($.Elem|raw$)\n", ut)
 | 
			
		||||
		sw.Do("**out = **in", nil)
 | 
			
		||||
	case uet.Kind == types.Map, uet.Kind == types.Slice, uet.Kind == types.Pointer:
 | 
			
		||||
		sw.Do("*out = new($.Elem|raw$)\n", ut)
 | 
			
		||||
		sw.Do("if **in != nil {\n", nil)
 | 
			
		||||
		sw.Do("in, out := *in, *out\n", nil)
 | 
			
		||||
		g.generateFor(uet, sw)
 | 
			
		||||
		sw.Do("}\n", nil)
 | 
			
		||||
	case uet.Kind == types.Struct:
 | 
			
		||||
		sw.Do("*out = new($.Elem|raw$)\n", ut)
 | 
			
		||||
		sw.Do("(*in).DeepCopyInto(*out)\n", nil)
 | 
			
		||||
	default:
 | 
			
		||||
		klog.Fatalf("Hit an unsupported type %v for %v", uet, t)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1260
									
								
								vendor/k8s.io/gengo/examples/defaulter-gen/generators/defaulter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1260
									
								
								vendor/k8s.io/gengo/examples/defaulter-gen/generators/defaulter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										443
									
								
								vendor/k8s.io/gengo/examples/import-boss/generators/import_restrict.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										443
									
								
								vendor/k8s.io/gengo/examples/import-boss/generators/import_restrict.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,443 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2016 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Package generators has the generators for the import-boss utility.
 | 
			
		||||
package generators
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/gengo/args"
 | 
			
		||||
	"k8s.io/gengo/generator"
 | 
			
		||||
	"k8s.io/gengo/namer"
 | 
			
		||||
	"k8s.io/gengo/types"
 | 
			
		||||
	"sigs.k8s.io/yaml"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	goModFile          = "go.mod"
 | 
			
		||||
	importBossFileType = "import-boss"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NameSystems returns the name system used by the generators in this package.
 | 
			
		||||
func NameSystems() namer.NameSystems {
 | 
			
		||||
	return namer.NameSystems{
 | 
			
		||||
		"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 "raw"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Packages makes the import-boss package definition.
 | 
			
		||||
func Packages(c *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
 | 
			
		||||
	pkgs := generator.Packages{}
 | 
			
		||||
	c.FileTypes = map[string]generator.FileType{
 | 
			
		||||
		importBossFileType: importRuleFile{c},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, p := range c.Universe {
 | 
			
		||||
		if !inputIncludes(arguments.InputDirs, p) {
 | 
			
		||||
			// Don't run on e.g. third party dependencies.
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		savedPackage := p
 | 
			
		||||
		pkgs = append(pkgs, &generator.DefaultPackage{
 | 
			
		||||
			PackageName: p.Name,
 | 
			
		||||
			PackagePath: p.Path,
 | 
			
		||||
			Source:      p.SourcePath,
 | 
			
		||||
			// GeneratorFunc returns a list of generators. Each generator makes a
 | 
			
		||||
			// single file.
 | 
			
		||||
			GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
 | 
			
		||||
				return []generator.Generator{&importRules{
 | 
			
		||||
					myPackage: savedPackage,
 | 
			
		||||
				}}
 | 
			
		||||
			},
 | 
			
		||||
			FilterFunc: func(c *generator.Context, t *types.Type) bool {
 | 
			
		||||
				return false
 | 
			
		||||
			},
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pkgs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// inputIncludes returns true if the given package is a (sub) package of one of
 | 
			
		||||
// the InputDirs.
 | 
			
		||||
func inputIncludes(inputs []string, p *types.Package) bool {
 | 
			
		||||
	// TODO: This does not handle conversion of local paths (./foo) into
 | 
			
		||||
	// canonical packages (github.com/example/project/foo).
 | 
			
		||||
	for _, input := range inputs {
 | 
			
		||||
		// Normalize paths
 | 
			
		||||
		input := strings.TrimSuffix(input, "/")
 | 
			
		||||
		input = strings.TrimPrefix(input, "./vendor/")
 | 
			
		||||
		seek := strings.TrimSuffix(p.Path, "/")
 | 
			
		||||
 | 
			
		||||
		if input == seek {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
		if strings.HasSuffix(input, "...") {
 | 
			
		||||
			input = strings.TrimSuffix(input, "...")
 | 
			
		||||
			if strings.HasPrefix(seek+"/", input) {
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A single import restriction rule.
 | 
			
		||||
type Rule struct {
 | 
			
		||||
	// All import paths that match this regexp...
 | 
			
		||||
	SelectorRegexp string
 | 
			
		||||
	// ... must have one of these prefixes ...
 | 
			
		||||
	AllowedPrefixes []string
 | 
			
		||||
	// ... and must not have one of these prefixes.
 | 
			
		||||
	ForbiddenPrefixes []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type InverseRule struct {
 | 
			
		||||
	Rule
 | 
			
		||||
	// True if the rule is to be applied to transitive imports.
 | 
			
		||||
	Transitive bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type fileFormat struct {
 | 
			
		||||
	CurrentImports []string
 | 
			
		||||
 | 
			
		||||
	Rules        []Rule
 | 
			
		||||
	InverseRules []InverseRule
 | 
			
		||||
 | 
			
		||||
	path string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func readFile(path string) (*fileFormat, error) {
 | 
			
		||||
	currentBytes, err := ioutil.ReadFile(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("couldn't read %v: %v", path, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var current fileFormat
 | 
			
		||||
	err = yaml.Unmarshal(currentBytes, ¤t)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("couldn't unmarshal %v: %v", path, err)
 | 
			
		||||
	}
 | 
			
		||||
	current.path = path
 | 
			
		||||
	return ¤t, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeFile(path string, ff *fileFormat) error {
 | 
			
		||||
	raw, err := json.MarshalIndent(ff, "", "\t")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("couldn't format data for file %v.\n%#v", path, ff)
 | 
			
		||||
	}
 | 
			
		||||
	f, err := os.Create(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("couldn't open %v for writing: %v", path, err)
 | 
			
		||||
	}
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
	_, err = f.Write(raw)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This does the actual checking, since it knows the literal destination file.
 | 
			
		||||
type importRuleFile struct {
 | 
			
		||||
	context *generator.Context
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (irf importRuleFile) AssembleFile(f *generator.File, path string) error {
 | 
			
		||||
	return irf.VerifyFile(f, path)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: make a flag to enable this, or expose this information in some other way.
 | 
			
		||||
func (importRuleFile) listEntireImportTree(f *generator.File, path string) error {
 | 
			
		||||
	// If the file exists, populate its current imports. This is mostly to help
 | 
			
		||||
	// humans figure out what they need to fix.
 | 
			
		||||
	if _, err := os.Stat(path); err != nil {
 | 
			
		||||
		// Ignore packages which haven't opted in by adding an .import-restrictions file.
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	current, err := readFile(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	current.CurrentImports = []string{}
 | 
			
		||||
	for v := range f.Imports {
 | 
			
		||||
		current.CurrentImports = append(current.CurrentImports, v)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Strings(current.CurrentImports)
 | 
			
		||||
 | 
			
		||||
	return writeFile(path, current)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// removeLastDir removes the last directory, but leaves the file name
 | 
			
		||||
// unchanged. It returns the new path and the removed directory. So:
 | 
			
		||||
// "a/b/c/file" -> ("a/b/file", "c")
 | 
			
		||||
func removeLastDir(path string) (newPath, removedDir string) {
 | 
			
		||||
	dir, file := filepath.Split(path)
 | 
			
		||||
	dir = strings.TrimSuffix(dir, string(filepath.Separator))
 | 
			
		||||
	return filepath.Join(filepath.Dir(dir), file), filepath.Base(dir)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isGoModRoot checks if a directory is the root directory for a package
 | 
			
		||||
// by checking for the existence of a 'go.mod' file in that directory.
 | 
			
		||||
func isGoModRoot(path string) bool {
 | 
			
		||||
	_, err := os.Stat(filepath.Join(filepath.Dir(path), goModFile))
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// recursiveRead collects all '.import-restriction' files, between the current directory,
 | 
			
		||||
// and the package root when Go modules are enabled, or $GOPATH/src when they are not.
 | 
			
		||||
func recursiveRead(path string) ([]*fileFormat, error) {
 | 
			
		||||
	restrictionFiles := make([]*fileFormat, 0)
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		if _, err := os.Stat(path); err == nil {
 | 
			
		||||
			rules, err := readFile(path)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			restrictionFiles = append(restrictionFiles, rules)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		nextPath, removedDir := removeLastDir(path)
 | 
			
		||||
		if nextPath == path || isGoModRoot(path) || removedDir == "src" {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		path = nextPath
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return restrictionFiles, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (irf importRuleFile) VerifyFile(f *generator.File, path string) error {
 | 
			
		||||
	restrictionFiles, err := recursiveRead(filepath.Join(f.PackageSourcePath, f.Name))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("error finding rules file: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := irf.verifyRules(restrictionFiles, f); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return irf.verifyInverseRules(restrictionFiles, f)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (irf importRuleFile) verifyRules(restrictionFiles []*fileFormat, f *generator.File) error {
 | 
			
		||||
	selectors := make([][]*regexp.Regexp, len(restrictionFiles))
 | 
			
		||||
	for i, restrictionFile := range restrictionFiles {
 | 
			
		||||
		for _, r := range restrictionFile.Rules {
 | 
			
		||||
			re, err := regexp.Compile(r.SelectorRegexp)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("regexp `%s` in file %q doesn't compile: %v", r.SelectorRegexp, restrictionFile.path, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			selectors[i] = append(selectors[i], re)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	forbiddenImports := map[string]string{}
 | 
			
		||||
	allowedMismatchedImports := []string{}
 | 
			
		||||
 | 
			
		||||
	for v := range f.Imports {
 | 
			
		||||
		explicitlyAllowed := false
 | 
			
		||||
 | 
			
		||||
	NextRestrictionFiles:
 | 
			
		||||
		for i, rules := range restrictionFiles {
 | 
			
		||||
			for j, r := range rules.Rules {
 | 
			
		||||
				matching := selectors[i][j].MatchString(v)
 | 
			
		||||
				klog.V(5).Infof("Checking %v matches %v: %v\n", r.SelectorRegexp, v, matching)
 | 
			
		||||
				if !matching {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				for _, forbidden := range r.ForbiddenPrefixes {
 | 
			
		||||
					klog.V(4).Infof("Checking %v against %v\n", v, forbidden)
 | 
			
		||||
					if strings.HasPrefix(v, forbidden) {
 | 
			
		||||
						forbiddenImports[v] = forbidden
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				for _, allowed := range r.AllowedPrefixes {
 | 
			
		||||
					klog.V(4).Infof("Checking %v against %v\n", v, allowed)
 | 
			
		||||
					if strings.HasPrefix(v, allowed) {
 | 
			
		||||
						explicitlyAllowed = true
 | 
			
		||||
						break
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if !explicitlyAllowed {
 | 
			
		||||
					allowedMismatchedImports = append(allowedMismatchedImports, v)
 | 
			
		||||
				} else {
 | 
			
		||||
					klog.V(2).Infof("%v importing %v allowed by %v\n", f.PackagePath, v, restrictionFiles[i].path)
 | 
			
		||||
					break NextRestrictionFiles
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(forbiddenImports) > 0 || len(allowedMismatchedImports) > 0 {
 | 
			
		||||
		var errorBuilder strings.Builder
 | 
			
		||||
		for i, f := range forbiddenImports {
 | 
			
		||||
			fmt.Fprintf(&errorBuilder, "import %v has forbidden prefix %v\n", i, f)
 | 
			
		||||
		}
 | 
			
		||||
		if len(allowedMismatchedImports) > 0 {
 | 
			
		||||
			sort.Sort(sort.StringSlice(allowedMismatchedImports))
 | 
			
		||||
			fmt.Fprintf(&errorBuilder, "the following imports did not match any allowed prefix:\n")
 | 
			
		||||
			for _, i := range allowedMismatchedImports {
 | 
			
		||||
				fmt.Fprintf(&errorBuilder, "  %v\n", i)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return errors.New(errorBuilder.String())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// verifyInverseRules checks that all packages that import a package are allowed to import it.
 | 
			
		||||
func (irf importRuleFile) verifyInverseRules(restrictionFiles []*fileFormat, f *generator.File) error {
 | 
			
		||||
	// compile all Selector regex in all restriction files
 | 
			
		||||
	selectors := make([][]*regexp.Regexp, len(restrictionFiles))
 | 
			
		||||
	for i, restrictionFile := range restrictionFiles {
 | 
			
		||||
		for _, r := range restrictionFile.InverseRules {
 | 
			
		||||
			re, err := regexp.Compile(r.SelectorRegexp)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("regexp `%s` in file %q doesn't compile: %v", r.SelectorRegexp, restrictionFile.path, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			selectors[i] = append(selectors[i], re)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	directImport := map[string]bool{}
 | 
			
		||||
	for _, imp := range irf.context.IncomingImports()[f.PackagePath] {
 | 
			
		||||
		directImport[imp] = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	forbiddenImports := map[string]string{}
 | 
			
		||||
	allowedMismatchedImports := []string{}
 | 
			
		||||
 | 
			
		||||
	for _, v := range irf.context.TransitiveIncomingImports()[f.PackagePath] {
 | 
			
		||||
		explicitlyAllowed := false
 | 
			
		||||
 | 
			
		||||
	NextRestrictionFiles:
 | 
			
		||||
		for i, rules := range restrictionFiles {
 | 
			
		||||
			for j, r := range rules.InverseRules {
 | 
			
		||||
				if !r.Transitive && !directImport[v] {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				re := selectors[i][j]
 | 
			
		||||
				matching := re.MatchString(v)
 | 
			
		||||
				klog.V(4).Infof("Checking %v matches %v (importing %v: %v\n", r.SelectorRegexp, v, f.PackagePath, matching)
 | 
			
		||||
				if !matching {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				for _, forbidden := range r.ForbiddenPrefixes {
 | 
			
		||||
					klog.V(4).Infof("Checking %v against %v\n", v, forbidden)
 | 
			
		||||
					if strings.HasPrefix(v, forbidden) {
 | 
			
		||||
						forbiddenImports[v] = forbidden
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				for _, allowed := range r.AllowedPrefixes {
 | 
			
		||||
					klog.V(4).Infof("Checking %v against %v\n", v, allowed)
 | 
			
		||||
					if strings.HasPrefix(v, allowed) {
 | 
			
		||||
						explicitlyAllowed = true
 | 
			
		||||
						break
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if !explicitlyAllowed {
 | 
			
		||||
					allowedMismatchedImports = append(allowedMismatchedImports, v)
 | 
			
		||||
				} else {
 | 
			
		||||
					klog.V(2).Infof("%v importing %v allowed by %v\n", v, f.PackagePath, restrictionFiles[i].path)
 | 
			
		||||
					break NextRestrictionFiles
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(forbiddenImports) > 0 || len(allowedMismatchedImports) > 0 {
 | 
			
		||||
		var errorBuilder strings.Builder
 | 
			
		||||
		for i, f := range forbiddenImports {
 | 
			
		||||
			fmt.Fprintf(&errorBuilder, "(inverse): import %v has forbidden prefix %v\n", i, f)
 | 
			
		||||
		}
 | 
			
		||||
		if len(allowedMismatchedImports) > 0 {
 | 
			
		||||
			sort.Sort(sort.StringSlice(allowedMismatchedImports))
 | 
			
		||||
			fmt.Fprintf(&errorBuilder, "(inverse): the following imports did not match any allowed prefix:\n")
 | 
			
		||||
			for _, i := range allowedMismatchedImports {
 | 
			
		||||
				fmt.Fprintf(&errorBuilder, "  %v\n", i)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return errors.New(errorBuilder.String())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// importRules produces a file with a set for a single type.
 | 
			
		||||
type importRules struct {
 | 
			
		||||
	myPackage *types.Package
 | 
			
		||||
	imports   namer.ImportTracker
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ = generator.Generator(&importRules{})
 | 
			
		||||
	_ = generator.FileType(importRuleFile{})
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (r *importRules) Name() string                                                  { return "import rules" }
 | 
			
		||||
func (r *importRules) Filter(*generator.Context, *types.Type) bool                   { return false }
 | 
			
		||||
func (r *importRules) Namers(*generator.Context) namer.NameSystems                   { return nil }
 | 
			
		||||
func (r *importRules) PackageVars(*generator.Context) []string                       { return []string{} }
 | 
			
		||||
func (r *importRules) PackageConsts(*generator.Context) []string                     { return []string{} }
 | 
			
		||||
func (r *importRules) GenerateType(*generator.Context, *types.Type, io.Writer) error { return nil }
 | 
			
		||||
func (r *importRules) Filename() string                                              { return ".import-restrictions" }
 | 
			
		||||
func (r *importRules) FileType() string                                              { return importBossFileType }
 | 
			
		||||
func (r *importRules) Init(c *generator.Context, w io.Writer) error                  { return nil }
 | 
			
		||||
func (r *importRules) Finalize(*generator.Context, io.Writer) error                  { return nil }
 | 
			
		||||
 | 
			
		||||
func dfsImports(dest *[]string, seen map[string]bool, p *types.Package) {
 | 
			
		||||
	for _, p2 := range p.Imports {
 | 
			
		||||
		if seen[p2.Path] {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		seen[p2.Path] = true
 | 
			
		||||
		dfsImports(dest, seen, p2)
 | 
			
		||||
		*dest = append(*dest, p2.Path)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *importRules) Imports(*generator.Context) []string {
 | 
			
		||||
	all := []string{}
 | 
			
		||||
	dfsImports(&all, map[string]bool{}, r.myPackage)
 | 
			
		||||
	return all
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										378
									
								
								vendor/k8s.io/gengo/examples/set-gen/generators/sets.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										378
									
								
								vendor/k8s.io/gengo/examples/set-gen/generators/sets.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,378 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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 has the generators for the set-gen utility.
 | 
			
		||||
package generators
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/gengo/args"
 | 
			
		||||
	"k8s.io/gengo/generator"
 | 
			
		||||
	"k8s.io/gengo/namer"
 | 
			
		||||
	"k8s.io/gengo/types"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NameSystems returns the name system used by the generators in this package.
 | 
			
		||||
func NameSystems() namer.NameSystems {
 | 
			
		||||
	return namer.NameSystems{
 | 
			
		||||
		"public":  namer.NewPublicNamer(0),
 | 
			
		||||
		"private": namer.NewPrivateNamer(0),
 | 
			
		||||
		"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"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Packages makes the sets package definition.
 | 
			
		||||
func Packages(_ *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
 | 
			
		||||
	boilerplate, err := arguments.LoadGoBoilerplate()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		klog.Fatalf("Failed loading boilerplate: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return generator.Packages{&generator.DefaultPackage{
 | 
			
		||||
		PackageName: "sets",
 | 
			
		||||
		PackagePath: arguments.OutputPackagePath,
 | 
			
		||||
		HeaderText:  boilerplate,
 | 
			
		||||
		PackageDocumentation: []byte(
 | 
			
		||||
			`// Package sets has auto-generated set types.
 | 
			
		||||
`),
 | 
			
		||||
		// GeneratorFunc returns a list of generators. Each generator makes a
 | 
			
		||||
		// single file.
 | 
			
		||||
		GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
 | 
			
		||||
			generators = []generator.Generator{
 | 
			
		||||
				// Always generate a "doc.go" file.
 | 
			
		||||
				generator.DefaultGen{OptionalName: "doc"},
 | 
			
		||||
				// Make a separate file for the Empty type, since it's shared by every type.
 | 
			
		||||
				generator.DefaultGen{
 | 
			
		||||
					OptionalName: "empty",
 | 
			
		||||
					OptionalBody: []byte(emptyTypeDecl),
 | 
			
		||||
				},
 | 
			
		||||
			}
 | 
			
		||||
			// Since we want a file per type that we generate a set for, we
 | 
			
		||||
			// have to provide a function for this.
 | 
			
		||||
			for _, t := range c.Order {
 | 
			
		||||
				generators = append(generators, &genSet{
 | 
			
		||||
					DefaultGen: generator.DefaultGen{
 | 
			
		||||
						// Use the privatized version of the
 | 
			
		||||
						// type name as the file name.
 | 
			
		||||
						//
 | 
			
		||||
						// TODO: make a namer that converts
 | 
			
		||||
						// camelCase to '-' separation for file
 | 
			
		||||
						// names?
 | 
			
		||||
						OptionalName: c.Namers["private"].Name(t),
 | 
			
		||||
					},
 | 
			
		||||
					outputPackage: arguments.OutputPackagePath,
 | 
			
		||||
					typeToMatch:   t,
 | 
			
		||||
					imports:       generator.NewImportTracker(),
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
			return generators
 | 
			
		||||
		},
 | 
			
		||||
		FilterFunc: func(c *generator.Context, t *types.Type) bool {
 | 
			
		||||
			// It would be reasonable to filter by the type's package here.
 | 
			
		||||
			// It might be necessary if your input directory has a big
 | 
			
		||||
			// import graph.
 | 
			
		||||
			switch t.Kind {
 | 
			
		||||
			case types.Map, types.Slice, types.Pointer:
 | 
			
		||||
				// These types can't be keys in a map.
 | 
			
		||||
				return false
 | 
			
		||||
			case types.Builtin:
 | 
			
		||||
				return true
 | 
			
		||||
			case types.Struct:
 | 
			
		||||
				// Only some structs can be keys in a map. This is triggered by the line
 | 
			
		||||
				// // +genset
 | 
			
		||||
				// or
 | 
			
		||||
				// // +genset=true
 | 
			
		||||
				return extractBoolTagOrDie("genset", t.CommentLines) == true
 | 
			
		||||
			}
 | 
			
		||||
			return false
 | 
			
		||||
		},
 | 
			
		||||
	}}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// genSet produces a file with a set for a single type.
 | 
			
		||||
type genSet struct {
 | 
			
		||||
	generator.DefaultGen
 | 
			
		||||
	outputPackage string
 | 
			
		||||
	typeToMatch   *types.Type
 | 
			
		||||
	imports       namer.ImportTracker
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Filter ignores all but one type because we're making a single file per type.
 | 
			
		||||
func (g *genSet) Filter(c *generator.Context, t *types.Type) bool { return t == g.typeToMatch }
 | 
			
		||||
 | 
			
		||||
func (g *genSet) Namers(c *generator.Context) namer.NameSystems {
 | 
			
		||||
	return namer.NameSystems{
 | 
			
		||||
		"raw": namer.NewRawNamer(g.outputPackage, g.imports),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *genSet) Imports(c *generator.Context) (imports []string) {
 | 
			
		||||
	return append(g.imports.ImportLines(), "reflect", "sort")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// args constructs arguments for templates. Usage:
 | 
			
		||||
// g.args(t, "key1", value1, "key2", value2, ...)
 | 
			
		||||
//
 | 
			
		||||
// 't' is loaded with the key 'type'.
 | 
			
		||||
//
 | 
			
		||||
// We could use t directly as the argument, but doing it this way makes it easy
 | 
			
		||||
// to mix in additional parameters. This feature is not used in this set
 | 
			
		||||
// generator, but is present as an example.
 | 
			
		||||
func (g *genSet) args(t *types.Type, kv ...interface{}) interface{} {
 | 
			
		||||
	m := map[interface{}]interface{}{"type": t}
 | 
			
		||||
	for i := 0; i < len(kv)/2; i++ {
 | 
			
		||||
		m[kv[i*2]] = kv[i*2+1]
 | 
			
		||||
	}
 | 
			
		||||
	return m
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GenerateType makes the body of a file implementing a set for type t.
 | 
			
		||||
func (g *genSet) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
 | 
			
		||||
	sw := generator.NewSnippetWriter(w, c, "$", "$")
 | 
			
		||||
	sw.Do(setCode, g.args(t))
 | 
			
		||||
	sw.Do("func less$.type|public$(lhs, rhs $.type|raw$) bool {\n", g.args(t))
 | 
			
		||||
	g.lessBody(sw, t)
 | 
			
		||||
	sw.Do("}\n", g.args(t))
 | 
			
		||||
	return sw.Error()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *genSet) lessBody(sw *generator.SnippetWriter, t *types.Type) {
 | 
			
		||||
	// TODO: make this recursive, handle pointers and multiple nested structs...
 | 
			
		||||
	switch t.Kind {
 | 
			
		||||
	case types.Struct:
 | 
			
		||||
		for _, m := range types.FlattenMembers(t.Members) {
 | 
			
		||||
			sw.Do("if lhs.$.Name$ < rhs.$.Name$ { return true }\n", m)
 | 
			
		||||
			sw.Do("if lhs.$.Name$ > rhs.$.Name$ { return false }\n", m)
 | 
			
		||||
		}
 | 
			
		||||
		sw.Do("return false\n", nil)
 | 
			
		||||
	default:
 | 
			
		||||
		sw.Do("return lhs < rhs\n", nil)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// written to the "empty.go" file.
 | 
			
		||||
var emptyTypeDecl = `
 | 
			
		||||
// Empty is public since it is used by some internal API objects for conversions between external
 | 
			
		||||
// string arrays and internal sets, and conversion logic requires public types today.
 | 
			
		||||
type Empty struct{}
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
// Written for every type. If you've never used text/template before:
 | 
			
		||||
// $.type$ refers to the source type; |public means to
 | 
			
		||||
// call the function giving the public name, |raw the raw type name.
 | 
			
		||||
var setCode = `// sets.$.type|public$ is a set of $.type|raw$s, implemented via map[$.type|raw$]struct{} for minimal memory consumption.
 | 
			
		||||
type $.type|public$ map[$.type|raw$]Empty
 | 
			
		||||
 | 
			
		||||
// New$.type|public$ creates a $.type|public$ from a list of values.
 | 
			
		||||
func New$.type|public$(items ...$.type|raw$) $.type|public$ {
 | 
			
		||||
	ss := make($.type|public$, len(items))
 | 
			
		||||
	ss.Insert(items...)
 | 
			
		||||
	return ss
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// $.type|public$KeySet creates a $.type|public$ from a keys of a map[$.type|raw$](? extends interface{}).
 | 
			
		||||
// If the value passed in is not actually a map, this will panic.
 | 
			
		||||
func $.type|public$KeySet(theMap interface{}) $.type|public$ {
 | 
			
		||||
	v := reflect.ValueOf(theMap)
 | 
			
		||||
	ret := $.type|public${}
 | 
			
		||||
 | 
			
		||||
	for _, keyValue := range v.MapKeys() {
 | 
			
		||||
		ret.Insert(keyValue.Interface().($.type|raw$))
 | 
			
		||||
	}
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Insert adds items to the set.
 | 
			
		||||
func (s $.type|public$) Insert(items ...$.type|raw$) $.type|public$ {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		s[item] = Empty{}
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete removes all items from the set.
 | 
			
		||||
func (s $.type|public$) Delete(items ...$.type|raw$) $.type|public$ {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		delete(s, item)
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Has returns true if and only if item is contained in the set.
 | 
			
		||||
func (s $.type|public$) Has(item $.type|raw$) bool {
 | 
			
		||||
	_, contained := s[item]
 | 
			
		||||
	return contained
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAll returns true if and only if all items are contained in the set.
 | 
			
		||||
func (s $.type|public$) HasAll(items ...$.type|raw$) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if !s.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAny returns true if any items are contained in the set.
 | 
			
		||||
func (s $.type|public$) HasAny(items ...$.type|raw$) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if s.Has(item) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clone returns a new set which is a copy of the current set.
 | 
			
		||||
func (s $.type|public$) Clone() $.type|public$ {
 | 
			
		||||
	result := make($.type|public$, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Difference returns a set of objects that are not in s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.Difference(s2) = {a3}
 | 
			
		||||
// s2.Difference(s1) = {a4, a5}
 | 
			
		||||
func (s1 $.type|public$) Difference(s2 $.type|public$) $.type|public$ {
 | 
			
		||||
	result := New$.type|public$()
 | 
			
		||||
	for key := range s1 {
 | 
			
		||||
		if !s2.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.SymmetricDifference(s2) = {a3, a4, a5}
 | 
			
		||||
// s2.SymmetricDifference(s1) = {a3, a4, a5}
 | 
			
		||||
func (s1 $.type|public$) SymmetricDifference(s2 $.type|public$) $.type|public$ {
 | 
			
		||||
	return s1.Difference(s2).Union(s2.Difference(s1))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Union returns a new set which includes items in either s1 or s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a3, a4}
 | 
			
		||||
// s1.Union(s2) = {a1, a2, a3, a4}
 | 
			
		||||
// s2.Union(s1) = {a1, a2, a3, a4}
 | 
			
		||||
func (s1 $.type|public$) Union(s2 $.type|public$) $.type|public$ {
 | 
			
		||||
	result := s1.Clone()
 | 
			
		||||
	for key := range s2 {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Intersection returns a new set which includes the item in BOTH s1 and s2
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a2, a3}
 | 
			
		||||
// s1.Intersection(s2) = {a2}
 | 
			
		||||
func (s1 $.type|public$) Intersection(s2 $.type|public$) $.type|public$ {
 | 
			
		||||
	var walk, other $.type|public$
 | 
			
		||||
	result := New$.type|public$()
 | 
			
		||||
	if s1.Len() < s2.Len() {
 | 
			
		||||
		walk = s1
 | 
			
		||||
		other = s2
 | 
			
		||||
	} else {
 | 
			
		||||
		walk = s2
 | 
			
		||||
		other = s1
 | 
			
		||||
	}
 | 
			
		||||
	for key := range walk {
 | 
			
		||||
		if other.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsSuperset returns true if and only if s1 is a superset of s2.
 | 
			
		||||
func (s1 $.type|public$) IsSuperset(s2 $.type|public$) bool {
 | 
			
		||||
	for item := range s2 {
 | 
			
		||||
		if !s1.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equal returns true if and only if s1 is equal (as a set) to s2.
 | 
			
		||||
// Two sets are equal if their membership is identical.
 | 
			
		||||
// (In practice, this means same elements, order doesn't matter)
 | 
			
		||||
func (s1 $.type|public$) Equal(s2 $.type|public$) bool {
 | 
			
		||||
	return len(s1) == len(s2) && s1.IsSuperset(s2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type sortableSliceOf$.type|public$ []$.type|raw$
 | 
			
		||||
 | 
			
		||||
func (s sortableSliceOf$.type|public$) Len() int { return len(s) }
 | 
			
		||||
func (s sortableSliceOf$.type|public$) Less(i, j int) bool { return less$.type|public$(s[i], s[j]) }
 | 
			
		||||
func (s sortableSliceOf$.type|public$) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
 | 
			
		||||
 | 
			
		||||
// List returns the contents as a sorted $.type|raw$ slice.
 | 
			
		||||
func (s $.type|public$) List() []$.type|raw$ {
 | 
			
		||||
	res := make(sortableSliceOf$.type|public$, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(res)
 | 
			
		||||
	return []$.type|raw$(res)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnsortedList returns the slice with contents in random order.
 | 
			
		||||
func (s $.type|public$) UnsortedList() []$.type|raw$ {
 | 
			
		||||
	res :=make([]$.type|raw$, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a single element from the set.
 | 
			
		||||
func (s $.type|public$) PopAny() ($.type|raw$, bool) {
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		s.Delete(key)
 | 
			
		||||
		return key, true
 | 
			
		||||
	}
 | 
			
		||||
	var zeroValue $.type|raw$
 | 
			
		||||
	return zeroValue, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the size of the set.
 | 
			
		||||
func (s $.type|public$) Len() int {
 | 
			
		||||
	return len(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
`
 | 
			
		||||
							
								
								
									
										33
									
								
								vendor/k8s.io/gengo/examples/set-gen/generators/tags.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/k8s.io/gengo/examples/set-gen/generators/tags.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,33 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2016 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package generators
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"k8s.io/gengo/types"
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// extractBoolTagOrDie gets the comment-tags for the key and asserts that, if
 | 
			
		||||
// it exists, the value is boolean.  If the tag did not exist, it returns
 | 
			
		||||
// false.
 | 
			
		||||
func extractBoolTagOrDie(key string, lines []string) bool {
 | 
			
		||||
	val, err := types.ExtractSingleBoolCommentTag("+", key, false, lines)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		klog.Fatalf(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	return val
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										221
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/byte.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										221
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/byte.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,221 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by set-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package sets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// sets.Byte is a set of bytes, implemented via map[byte]struct{} for minimal memory consumption.
 | 
			
		||||
type Byte map[byte]Empty
 | 
			
		||||
 | 
			
		||||
// NewByte creates a Byte from a list of values.
 | 
			
		||||
func NewByte(items ...byte) Byte {
 | 
			
		||||
	ss := make(Byte, len(items))
 | 
			
		||||
	ss.Insert(items...)
 | 
			
		||||
	return ss
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ByteKeySet creates a Byte from a keys of a map[byte](? extends interface{}).
 | 
			
		||||
// If the value passed in is not actually a map, this will panic.
 | 
			
		||||
func ByteKeySet(theMap interface{}) Byte {
 | 
			
		||||
	v := reflect.ValueOf(theMap)
 | 
			
		||||
	ret := Byte{}
 | 
			
		||||
 | 
			
		||||
	for _, keyValue := range v.MapKeys() {
 | 
			
		||||
		ret.Insert(keyValue.Interface().(byte))
 | 
			
		||||
	}
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Insert adds items to the set.
 | 
			
		||||
func (s Byte) Insert(items ...byte) Byte {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		s[item] = Empty{}
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete removes all items from the set.
 | 
			
		||||
func (s Byte) Delete(items ...byte) Byte {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		delete(s, item)
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Has returns true if and only if item is contained in the set.
 | 
			
		||||
func (s Byte) Has(item byte) bool {
 | 
			
		||||
	_, contained := s[item]
 | 
			
		||||
	return contained
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAll returns true if and only if all items are contained in the set.
 | 
			
		||||
func (s Byte) HasAll(items ...byte) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if !s.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAny returns true if any items are contained in the set.
 | 
			
		||||
func (s Byte) HasAny(items ...byte) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if s.Has(item) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clone returns a new set which is a copy of the current set.
 | 
			
		||||
func (s Byte) Clone() Byte {
 | 
			
		||||
	result := make(Byte, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Difference returns a set of objects that are not in s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.Difference(s2) = {a3}
 | 
			
		||||
// s2.Difference(s1) = {a4, a5}
 | 
			
		||||
func (s1 Byte) Difference(s2 Byte) Byte {
 | 
			
		||||
	result := NewByte()
 | 
			
		||||
	for key := range s1 {
 | 
			
		||||
		if !s2.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.SymmetricDifference(s2) = {a3, a4, a5}
 | 
			
		||||
// s2.SymmetricDifference(s1) = {a3, a4, a5}
 | 
			
		||||
func (s1 Byte) SymmetricDifference(s2 Byte) Byte {
 | 
			
		||||
	return s1.Difference(s2).Union(s2.Difference(s1))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Union returns a new set which includes items in either s1 or s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a3, a4}
 | 
			
		||||
// s1.Union(s2) = {a1, a2, a3, a4}
 | 
			
		||||
// s2.Union(s1) = {a1, a2, a3, a4}
 | 
			
		||||
func (s1 Byte) Union(s2 Byte) Byte {
 | 
			
		||||
	result := s1.Clone()
 | 
			
		||||
	for key := range s2 {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Intersection returns a new set which includes the item in BOTH s1 and s2
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a2, a3}
 | 
			
		||||
// s1.Intersection(s2) = {a2}
 | 
			
		||||
func (s1 Byte) Intersection(s2 Byte) Byte {
 | 
			
		||||
	var walk, other Byte
 | 
			
		||||
	result := NewByte()
 | 
			
		||||
	if s1.Len() < s2.Len() {
 | 
			
		||||
		walk = s1
 | 
			
		||||
		other = s2
 | 
			
		||||
	} else {
 | 
			
		||||
		walk = s2
 | 
			
		||||
		other = s1
 | 
			
		||||
	}
 | 
			
		||||
	for key := range walk {
 | 
			
		||||
		if other.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsSuperset returns true if and only if s1 is a superset of s2.
 | 
			
		||||
func (s1 Byte) IsSuperset(s2 Byte) bool {
 | 
			
		||||
	for item := range s2 {
 | 
			
		||||
		if !s1.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equal returns true if and only if s1 is equal (as a set) to s2.
 | 
			
		||||
// Two sets are equal if their membership is identical.
 | 
			
		||||
// (In practice, this means same elements, order doesn't matter)
 | 
			
		||||
func (s1 Byte) Equal(s2 Byte) bool {
 | 
			
		||||
	return len(s1) == len(s2) && s1.IsSuperset(s2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type sortableSliceOfByte []byte
 | 
			
		||||
 | 
			
		||||
func (s sortableSliceOfByte) Len() int           { return len(s) }
 | 
			
		||||
func (s sortableSliceOfByte) Less(i, j int) bool { return lessByte(s[i], s[j]) }
 | 
			
		||||
func (s sortableSliceOfByte) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
 | 
			
		||||
 | 
			
		||||
// List returns the contents as a sorted byte slice.
 | 
			
		||||
func (s Byte) List() []byte {
 | 
			
		||||
	res := make(sortableSliceOfByte, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(res)
 | 
			
		||||
	return []byte(res)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnsortedList returns the slice with contents in random order.
 | 
			
		||||
func (s Byte) UnsortedList() []byte {
 | 
			
		||||
	res := make([]byte, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a single element from the set.
 | 
			
		||||
func (s Byte) PopAny() (byte, bool) {
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		s.Delete(key)
 | 
			
		||||
		return key, true
 | 
			
		||||
	}
 | 
			
		||||
	var zeroValue byte
 | 
			
		||||
	return zeroValue, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the size of the set.
 | 
			
		||||
func (s Byte) Len() int {
 | 
			
		||||
	return len(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lessByte(lhs, rhs byte) bool {
 | 
			
		||||
	return lhs < rhs
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,20 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by set-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
// Package sets has auto-generated set types.
 | 
			
		||||
package sets
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/empty.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/empty.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,23 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by set-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package sets
 | 
			
		||||
 | 
			
		||||
// Empty is public since it is used by some internal API objects for conversions between external
 | 
			
		||||
// string arrays and internal sets, and conversion logic requires public types today.
 | 
			
		||||
type Empty struct{}
 | 
			
		||||
							
								
								
									
										221
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/int.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										221
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/int.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,221 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by set-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package sets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// sets.Int is a set of ints, implemented via map[int]struct{} for minimal memory consumption.
 | 
			
		||||
type Int map[int]Empty
 | 
			
		||||
 | 
			
		||||
// NewInt creates a Int from a list of values.
 | 
			
		||||
func NewInt(items ...int) Int {
 | 
			
		||||
	ss := make(Int, len(items))
 | 
			
		||||
	ss.Insert(items...)
 | 
			
		||||
	return ss
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntKeySet creates a Int from a keys of a map[int](? extends interface{}).
 | 
			
		||||
// If the value passed in is not actually a map, this will panic.
 | 
			
		||||
func IntKeySet(theMap interface{}) Int {
 | 
			
		||||
	v := reflect.ValueOf(theMap)
 | 
			
		||||
	ret := Int{}
 | 
			
		||||
 | 
			
		||||
	for _, keyValue := range v.MapKeys() {
 | 
			
		||||
		ret.Insert(keyValue.Interface().(int))
 | 
			
		||||
	}
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Insert adds items to the set.
 | 
			
		||||
func (s Int) Insert(items ...int) Int {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		s[item] = Empty{}
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete removes all items from the set.
 | 
			
		||||
func (s Int) Delete(items ...int) Int {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		delete(s, item)
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Has returns true if and only if item is contained in the set.
 | 
			
		||||
func (s Int) Has(item int) bool {
 | 
			
		||||
	_, contained := s[item]
 | 
			
		||||
	return contained
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAll returns true if and only if all items are contained in the set.
 | 
			
		||||
func (s Int) HasAll(items ...int) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if !s.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAny returns true if any items are contained in the set.
 | 
			
		||||
func (s Int) HasAny(items ...int) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if s.Has(item) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clone returns a new set which is a copy of the current set.
 | 
			
		||||
func (s Int) Clone() Int {
 | 
			
		||||
	result := make(Int, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Difference returns a set of objects that are not in s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.Difference(s2) = {a3}
 | 
			
		||||
// s2.Difference(s1) = {a4, a5}
 | 
			
		||||
func (s1 Int) Difference(s2 Int) Int {
 | 
			
		||||
	result := NewInt()
 | 
			
		||||
	for key := range s1 {
 | 
			
		||||
		if !s2.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.SymmetricDifference(s2) = {a3, a4, a5}
 | 
			
		||||
// s2.SymmetricDifference(s1) = {a3, a4, a5}
 | 
			
		||||
func (s1 Int) SymmetricDifference(s2 Int) Int {
 | 
			
		||||
	return s1.Difference(s2).Union(s2.Difference(s1))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Union returns a new set which includes items in either s1 or s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a3, a4}
 | 
			
		||||
// s1.Union(s2) = {a1, a2, a3, a4}
 | 
			
		||||
// s2.Union(s1) = {a1, a2, a3, a4}
 | 
			
		||||
func (s1 Int) Union(s2 Int) Int {
 | 
			
		||||
	result := s1.Clone()
 | 
			
		||||
	for key := range s2 {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Intersection returns a new set which includes the item in BOTH s1 and s2
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a2, a3}
 | 
			
		||||
// s1.Intersection(s2) = {a2}
 | 
			
		||||
func (s1 Int) Intersection(s2 Int) Int {
 | 
			
		||||
	var walk, other Int
 | 
			
		||||
	result := NewInt()
 | 
			
		||||
	if s1.Len() < s2.Len() {
 | 
			
		||||
		walk = s1
 | 
			
		||||
		other = s2
 | 
			
		||||
	} else {
 | 
			
		||||
		walk = s2
 | 
			
		||||
		other = s1
 | 
			
		||||
	}
 | 
			
		||||
	for key := range walk {
 | 
			
		||||
		if other.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsSuperset returns true if and only if s1 is a superset of s2.
 | 
			
		||||
func (s1 Int) IsSuperset(s2 Int) bool {
 | 
			
		||||
	for item := range s2 {
 | 
			
		||||
		if !s1.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equal returns true if and only if s1 is equal (as a set) to s2.
 | 
			
		||||
// Two sets are equal if their membership is identical.
 | 
			
		||||
// (In practice, this means same elements, order doesn't matter)
 | 
			
		||||
func (s1 Int) Equal(s2 Int) bool {
 | 
			
		||||
	return len(s1) == len(s2) && s1.IsSuperset(s2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type sortableSliceOfInt []int
 | 
			
		||||
 | 
			
		||||
func (s sortableSliceOfInt) Len() int           { return len(s) }
 | 
			
		||||
func (s sortableSliceOfInt) Less(i, j int) bool { return lessInt(s[i], s[j]) }
 | 
			
		||||
func (s sortableSliceOfInt) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
 | 
			
		||||
 | 
			
		||||
// List returns the contents as a sorted int slice.
 | 
			
		||||
func (s Int) List() []int {
 | 
			
		||||
	res := make(sortableSliceOfInt, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(res)
 | 
			
		||||
	return []int(res)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnsortedList returns the slice with contents in random order.
 | 
			
		||||
func (s Int) UnsortedList() []int {
 | 
			
		||||
	res := make([]int, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a single element from the set.
 | 
			
		||||
func (s Int) PopAny() (int, bool) {
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		s.Delete(key)
 | 
			
		||||
		return key, true
 | 
			
		||||
	}
 | 
			
		||||
	var zeroValue int
 | 
			
		||||
	return zeroValue, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the size of the set.
 | 
			
		||||
func (s Int) Len() int {
 | 
			
		||||
	return len(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lessInt(lhs, rhs int) bool {
 | 
			
		||||
	return lhs < rhs
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										221
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/int64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										221
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/int64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,221 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by set-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package sets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// sets.Int64 is a set of int64s, implemented via map[int64]struct{} for minimal memory consumption.
 | 
			
		||||
type Int64 map[int64]Empty
 | 
			
		||||
 | 
			
		||||
// NewInt64 creates a Int64 from a list of values.
 | 
			
		||||
func NewInt64(items ...int64) Int64 {
 | 
			
		||||
	ss := make(Int64, len(items))
 | 
			
		||||
	ss.Insert(items...)
 | 
			
		||||
	return ss
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64KeySet creates a Int64 from a keys of a map[int64](? extends interface{}).
 | 
			
		||||
// If the value passed in is not actually a map, this will panic.
 | 
			
		||||
func Int64KeySet(theMap interface{}) Int64 {
 | 
			
		||||
	v := reflect.ValueOf(theMap)
 | 
			
		||||
	ret := Int64{}
 | 
			
		||||
 | 
			
		||||
	for _, keyValue := range v.MapKeys() {
 | 
			
		||||
		ret.Insert(keyValue.Interface().(int64))
 | 
			
		||||
	}
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Insert adds items to the set.
 | 
			
		||||
func (s Int64) Insert(items ...int64) Int64 {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		s[item] = Empty{}
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete removes all items from the set.
 | 
			
		||||
func (s Int64) Delete(items ...int64) Int64 {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		delete(s, item)
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Has returns true if and only if item is contained in the set.
 | 
			
		||||
func (s Int64) Has(item int64) bool {
 | 
			
		||||
	_, contained := s[item]
 | 
			
		||||
	return contained
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAll returns true if and only if all items are contained in the set.
 | 
			
		||||
func (s Int64) HasAll(items ...int64) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if !s.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAny returns true if any items are contained in the set.
 | 
			
		||||
func (s Int64) HasAny(items ...int64) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if s.Has(item) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clone returns a new set which is a copy of the current set.
 | 
			
		||||
func (s Int64) Clone() Int64 {
 | 
			
		||||
	result := make(Int64, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Difference returns a set of objects that are not in s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.Difference(s2) = {a3}
 | 
			
		||||
// s2.Difference(s1) = {a4, a5}
 | 
			
		||||
func (s1 Int64) Difference(s2 Int64) Int64 {
 | 
			
		||||
	result := NewInt64()
 | 
			
		||||
	for key := range s1 {
 | 
			
		||||
		if !s2.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.SymmetricDifference(s2) = {a3, a4, a5}
 | 
			
		||||
// s2.SymmetricDifference(s1) = {a3, a4, a5}
 | 
			
		||||
func (s1 Int64) SymmetricDifference(s2 Int64) Int64 {
 | 
			
		||||
	return s1.Difference(s2).Union(s2.Difference(s1))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Union returns a new set which includes items in either s1 or s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a3, a4}
 | 
			
		||||
// s1.Union(s2) = {a1, a2, a3, a4}
 | 
			
		||||
// s2.Union(s1) = {a1, a2, a3, a4}
 | 
			
		||||
func (s1 Int64) Union(s2 Int64) Int64 {
 | 
			
		||||
	result := s1.Clone()
 | 
			
		||||
	for key := range s2 {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Intersection returns a new set which includes the item in BOTH s1 and s2
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a2, a3}
 | 
			
		||||
// s1.Intersection(s2) = {a2}
 | 
			
		||||
func (s1 Int64) Intersection(s2 Int64) Int64 {
 | 
			
		||||
	var walk, other Int64
 | 
			
		||||
	result := NewInt64()
 | 
			
		||||
	if s1.Len() < s2.Len() {
 | 
			
		||||
		walk = s1
 | 
			
		||||
		other = s2
 | 
			
		||||
	} else {
 | 
			
		||||
		walk = s2
 | 
			
		||||
		other = s1
 | 
			
		||||
	}
 | 
			
		||||
	for key := range walk {
 | 
			
		||||
		if other.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsSuperset returns true if and only if s1 is a superset of s2.
 | 
			
		||||
func (s1 Int64) IsSuperset(s2 Int64) bool {
 | 
			
		||||
	for item := range s2 {
 | 
			
		||||
		if !s1.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equal returns true if and only if s1 is equal (as a set) to s2.
 | 
			
		||||
// Two sets are equal if their membership is identical.
 | 
			
		||||
// (In practice, this means same elements, order doesn't matter)
 | 
			
		||||
func (s1 Int64) Equal(s2 Int64) bool {
 | 
			
		||||
	return len(s1) == len(s2) && s1.IsSuperset(s2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type sortableSliceOfInt64 []int64
 | 
			
		||||
 | 
			
		||||
func (s sortableSliceOfInt64) Len() int           { return len(s) }
 | 
			
		||||
func (s sortableSliceOfInt64) Less(i, j int) bool { return lessInt64(s[i], s[j]) }
 | 
			
		||||
func (s sortableSliceOfInt64) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
 | 
			
		||||
 | 
			
		||||
// List returns the contents as a sorted int64 slice.
 | 
			
		||||
func (s Int64) List() []int64 {
 | 
			
		||||
	res := make(sortableSliceOfInt64, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(res)
 | 
			
		||||
	return []int64(res)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnsortedList returns the slice with contents in random order.
 | 
			
		||||
func (s Int64) UnsortedList() []int64 {
 | 
			
		||||
	res := make([]int64, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a single element from the set.
 | 
			
		||||
func (s Int64) PopAny() (int64, bool) {
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		s.Delete(key)
 | 
			
		||||
		return key, true
 | 
			
		||||
	}
 | 
			
		||||
	var zeroValue int64
 | 
			
		||||
	return zeroValue, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the size of the set.
 | 
			
		||||
func (s Int64) Len() int {
 | 
			
		||||
	return len(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lessInt64(lhs, rhs int64) bool {
 | 
			
		||||
	return lhs < rhs
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										221
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/string.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										221
									
								
								vendor/k8s.io/gengo/examples/set-gen/sets/string.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,221 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by set-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package sets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// sets.String is a set of strings, implemented via map[string]struct{} for minimal memory consumption.
 | 
			
		||||
type String map[string]Empty
 | 
			
		||||
 | 
			
		||||
// NewString creates a String from a list of values.
 | 
			
		||||
func NewString(items ...string) String {
 | 
			
		||||
	ss := make(String, len(items))
 | 
			
		||||
	ss.Insert(items...)
 | 
			
		||||
	return ss
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringKeySet creates a String from a keys of a map[string](? extends interface{}).
 | 
			
		||||
// If the value passed in is not actually a map, this will panic.
 | 
			
		||||
func StringKeySet(theMap interface{}) String {
 | 
			
		||||
	v := reflect.ValueOf(theMap)
 | 
			
		||||
	ret := String{}
 | 
			
		||||
 | 
			
		||||
	for _, keyValue := range v.MapKeys() {
 | 
			
		||||
		ret.Insert(keyValue.Interface().(string))
 | 
			
		||||
	}
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Insert adds items to the set.
 | 
			
		||||
func (s String) Insert(items ...string) String {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		s[item] = Empty{}
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete removes all items from the set.
 | 
			
		||||
func (s String) Delete(items ...string) String {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		delete(s, item)
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Has returns true if and only if item is contained in the set.
 | 
			
		||||
func (s String) Has(item string) bool {
 | 
			
		||||
	_, contained := s[item]
 | 
			
		||||
	return contained
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAll returns true if and only if all items are contained in the set.
 | 
			
		||||
func (s String) HasAll(items ...string) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if !s.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAny returns true if any items are contained in the set.
 | 
			
		||||
func (s String) HasAny(items ...string) bool {
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if s.Has(item) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clone returns a new set which is a copy of the current set.
 | 
			
		||||
func (s String) Clone() String {
 | 
			
		||||
	result := make(String, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Difference returns a set of objects that are not in s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.Difference(s2) = {a3}
 | 
			
		||||
// s2.Difference(s1) = {a4, a5}
 | 
			
		||||
func (s1 String) Difference(s2 String) String {
 | 
			
		||||
	result := NewString()
 | 
			
		||||
	for key := range s1 {
 | 
			
		||||
		if !s2.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.SymmetricDifference(s2) = {a3, a4, a5}
 | 
			
		||||
// s2.SymmetricDifference(s1) = {a3, a4, a5}
 | 
			
		||||
func (s1 String) SymmetricDifference(s2 String) String {
 | 
			
		||||
	return s1.Difference(s2).Union(s2.Difference(s1))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Union returns a new set which includes items in either s1 or s2.
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a3, a4}
 | 
			
		||||
// s1.Union(s2) = {a1, a2, a3, a4}
 | 
			
		||||
// s2.Union(s1) = {a1, a2, a3, a4}
 | 
			
		||||
func (s1 String) Union(s2 String) String {
 | 
			
		||||
	result := s1.Clone()
 | 
			
		||||
	for key := range s2 {
 | 
			
		||||
		result.Insert(key)
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Intersection returns a new set which includes the item in BOTH s1 and s2
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a2, a3}
 | 
			
		||||
// s1.Intersection(s2) = {a2}
 | 
			
		||||
func (s1 String) Intersection(s2 String) String {
 | 
			
		||||
	var walk, other String
 | 
			
		||||
	result := NewString()
 | 
			
		||||
	if s1.Len() < s2.Len() {
 | 
			
		||||
		walk = s1
 | 
			
		||||
		other = s2
 | 
			
		||||
	} else {
 | 
			
		||||
		walk = s2
 | 
			
		||||
		other = s1
 | 
			
		||||
	}
 | 
			
		||||
	for key := range walk {
 | 
			
		||||
		if other.Has(key) {
 | 
			
		||||
			result.Insert(key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsSuperset returns true if and only if s1 is a superset of s2.
 | 
			
		||||
func (s1 String) IsSuperset(s2 String) bool {
 | 
			
		||||
	for item := range s2 {
 | 
			
		||||
		if !s1.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equal returns true if and only if s1 is equal (as a set) to s2.
 | 
			
		||||
// Two sets are equal if their membership is identical.
 | 
			
		||||
// (In practice, this means same elements, order doesn't matter)
 | 
			
		||||
func (s1 String) Equal(s2 String) bool {
 | 
			
		||||
	return len(s1) == len(s2) && s1.IsSuperset(s2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type sortableSliceOfString []string
 | 
			
		||||
 | 
			
		||||
func (s sortableSliceOfString) Len() int           { return len(s) }
 | 
			
		||||
func (s sortableSliceOfString) Less(i, j int) bool { return lessString(s[i], s[j]) }
 | 
			
		||||
func (s sortableSliceOfString) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
 | 
			
		||||
 | 
			
		||||
// List returns the contents as a sorted string slice.
 | 
			
		||||
func (s String) List() []string {
 | 
			
		||||
	res := make(sortableSliceOfString, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(res)
 | 
			
		||||
	return []string(res)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnsortedList returns the slice with contents in random order.
 | 
			
		||||
func (s String) UnsortedList() []string {
 | 
			
		||||
	res := make([]string, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a single element from the set.
 | 
			
		||||
func (s String) PopAny() (string, bool) {
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		s.Delete(key)
 | 
			
		||||
		return key, true
 | 
			
		||||
	}
 | 
			
		||||
	var zeroValue string
 | 
			
		||||
	return zeroValue, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the size of the set.
 | 
			
		||||
func (s String) Len() int {
 | 
			
		||||
	return len(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lessString(lhs, rhs string) bool {
 | 
			
		||||
	return lhs < rhs
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										62
									
								
								vendor/k8s.io/gengo/generator/default_generator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										62
									
								
								vendor/k8s.io/gengo/generator/default_generator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,62 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/namer"
 | 
			
		||||
	"k8s.io/gengo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	GolangFileType = "golang"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// DefaultGen implements a do-nothing Generator.
 | 
			
		||||
//
 | 
			
		||||
// It can be used to implement static content files.
 | 
			
		||||
type DefaultGen struct {
 | 
			
		||||
	// OptionalName, if present, will be used for the generator's name, and
 | 
			
		||||
	// the filename (with ".go" appended).
 | 
			
		||||
	OptionalName string
 | 
			
		||||
 | 
			
		||||
	// OptionalBody, 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 (d DefaultGen) Name() string                                        { return d.OptionalName }
 | 
			
		||||
func (d DefaultGen) Filter(*Context, *types.Type) bool                   { return true }
 | 
			
		||||
func (d DefaultGen) Namers(*Context) namer.NameSystems                   { return nil }
 | 
			
		||||
func (d DefaultGen) Imports(*Context) []string                           { return []string{} }
 | 
			
		||||
func (d DefaultGen) PackageVars(*Context) []string                       { return []string{} }
 | 
			
		||||
func (d DefaultGen) PackageConsts(*Context) []string                     { return []string{} }
 | 
			
		||||
func (d DefaultGen) GenerateType(*Context, *types.Type, io.Writer) error { return nil }
 | 
			
		||||
func (d DefaultGen) Filename() string                                    { return d.OptionalName + ".go" }
 | 
			
		||||
func (d DefaultGen) FileType() string                                    { return GolangFileType }
 | 
			
		||||
func (d DefaultGen) Finalize(*Context, io.Writer) error                  { return nil }
 | 
			
		||||
 | 
			
		||||
func (d DefaultGen) Init(c *Context, w io.Writer) error {
 | 
			
		||||
	_, err := w.Write(d.OptionalBody)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ = Generator(DefaultGen{})
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										75
									
								
								vendor/k8s.io/gengo/generator/default_package.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										75
									
								
								vendor/k8s.io/gengo/generator/default_package.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,75 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// DefaultPackage contains a default implementation of Package.
 | 
			
		||||
type DefaultPackage struct {
 | 
			
		||||
	// Short name of package, used in the "package xxxx" line.
 | 
			
		||||
	PackageName string
 | 
			
		||||
	// Import path of the package, and the location on disk of the package.
 | 
			
		||||
	PackagePath string
 | 
			
		||||
	// The location of the package on disk.
 | 
			
		||||
	Source string
 | 
			
		||||
 | 
			
		||||
	// Emitted at the top of every file.
 | 
			
		||||
	HeaderText []byte
 | 
			
		||||
 | 
			
		||||
	// Emitted only for a "doc.go" file; appended to the HeaderText for
 | 
			
		||||
	// that file.
 | 
			
		||||
	PackageDocumentation []byte
 | 
			
		||||
 | 
			
		||||
	// If non-nil, will be called on "Generators"; otherwise, the static
 | 
			
		||||
	// list will be used. So you should set only one of these two fields.
 | 
			
		||||
	GeneratorFunc func(*Context) []Generator
 | 
			
		||||
	GeneratorList []Generator
 | 
			
		||||
 | 
			
		||||
	// Optional; filters the types exposed to the generators.
 | 
			
		||||
	FilterFunc func(*Context, *types.Type) bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *DefaultPackage) Name() string       { return d.PackageName }
 | 
			
		||||
func (d *DefaultPackage) Path() string       { return d.PackagePath }
 | 
			
		||||
func (d *DefaultPackage) SourcePath() string { return d.Source }
 | 
			
		||||
 | 
			
		||||
func (d *DefaultPackage) Filter(c *Context, t *types.Type) bool {
 | 
			
		||||
	if d.FilterFunc != nil {
 | 
			
		||||
		return d.FilterFunc(c, t)
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *DefaultPackage) Generators(c *Context) []Generator {
 | 
			
		||||
	if d.GeneratorFunc != nil {
 | 
			
		||||
		return d.GeneratorFunc(c)
 | 
			
		||||
	}
 | 
			
		||||
	return d.GeneratorList
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *DefaultPackage) Header(filename string) []byte {
 | 
			
		||||
	if filename == "doc.go" {
 | 
			
		||||
		return append(d.HeaderText, d.PackageDocumentation...)
 | 
			
		||||
	}
 | 
			
		||||
	return d.HeaderText
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ = Package(&DefaultPackage{})
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/k8s.io/gengo/generator/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/k8s.io/gengo/generator/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,31 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/generator"
 | 
			
		||||
							
								
								
									
										50
									
								
								vendor/k8s.io/gengo/generator/error_tracker.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/k8s.io/gengo/generator/error_tracker.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,50 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										329
									
								
								vendor/k8s.io/gengo/generator/execute.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										329
									
								
								vendor/k8s.io/gengo/generator/execute.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,329 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/tools/imports"
 | 
			
		||||
	"k8s.io/gengo/namer"
 | 
			
		||||
	"k8s.io/gengo/types"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func errs2strings(errors []error) []string {
 | 
			
		||||
	strs := make([]string, len(errors))
 | 
			
		||||
	for i := range errors {
 | 
			
		||||
		strs[i] = errors[i].Error()
 | 
			
		||||
	}
 | 
			
		||||
	return strs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExecutePackages runs the generators for every package in 'packages'. 'outDir'
 | 
			
		||||
// is the base directory in which to place all the generated packages; it
 | 
			
		||||
// should be a physical path on disk, not an import path. e.g.:
 | 
			
		||||
// /path/to/home/path/to/gopath/src/
 | 
			
		||||
// Each package has its import path already, this will be appended to 'outDir'.
 | 
			
		||||
func (c *Context) ExecutePackages(outDir string, packages Packages) error {
 | 
			
		||||
	var errors []error
 | 
			
		||||
	for _, p := range packages {
 | 
			
		||||
		if err := c.ExecutePackage(outDir, p); err != nil {
 | 
			
		||||
			errors = append(errors, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(errors) > 0 {
 | 
			
		||||
		return fmt.Errorf("some packages had errors:\n%v\n", strings.Join(errs2strings(errors), "\n"))
 | 
			
		||||
	}
 | 
			
		||||
	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 (ft DefaultFileType) VerifyFile(f *File, pathname string) error {
 | 
			
		||||
	klog.V(5).Infof("Verifying file %q", pathname)
 | 
			
		||||
	friendlyName := filepath.Join(f.PackageName, f.Name)
 | 
			
		||||
	b := &bytes.Buffer{}
 | 
			
		||||
	et := NewErrorTracker(b)
 | 
			
		||||
	ft.Assemble(et, f)
 | 
			
		||||
	if et.Error() != nil {
 | 
			
		||||
		return et.Error()
 | 
			
		||||
	}
 | 
			
		||||
	formatted, err := ft.Format(b.Bytes())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("unable to format the output for %q: %v", friendlyName, err)
 | 
			
		||||
	}
 | 
			
		||||
	existing, err := ioutil.ReadFile(pathname)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("unable to read file %q for comparison: %v", friendlyName, err)
 | 
			
		||||
	}
 | 
			
		||||
	if bytes.Compare(formatted, existing) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	// Be nice and find the first place where they differ
 | 
			
		||||
	i := 0
 | 
			
		||||
	for i < len(formatted) && i < len(existing) && formatted[i] == existing[i] {
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	eDiff, fDiff := existing[i:], formatted[i:]
 | 
			
		||||
	if len(eDiff) > 100 {
 | 
			
		||||
		eDiff = eDiff[:100]
 | 
			
		||||
	}
 | 
			
		||||
	if len(fDiff) > 100 {
 | 
			
		||||
		fDiff = fDiff[:100]
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Errorf("output for %q differs; first existing/expected diff: \n  %q\n  %q", friendlyName, string(eDiff), string(fDiff))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func assembleGolangFile(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) {
 | 
			
		||||
	return imports.Process("", src, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewGolangFile() *DefaultFileType {
 | 
			
		||||
	return &DefaultFileType{
 | 
			
		||||
		Format:   importsWrapper,
 | 
			
		||||
		Assemble: assembleGolangFile,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExecutePackage executes a single package. 'outDir' is the base directory in
 | 
			
		||||
// which to place the package; it should be a physical path on disk, not an
 | 
			
		||||
// import path. e.g.: '/path/to/home/path/to/gopath/src/' The package knows its
 | 
			
		||||
// import path already, this will be appended to 'outDir'.
 | 
			
		||||
func (c *Context) ExecutePackage(outDir string, p Package) error {
 | 
			
		||||
	path := filepath.Join(outDir, p.Path())
 | 
			
		||||
 | 
			
		||||
	// When working outside of GOPATH, we typically won't want to generate the
 | 
			
		||||
	// full path for a package. For example, if our current project's root/base
 | 
			
		||||
	// package is github.com/foo/bar, outDir=., p.Path()=github.com/foo/bar/generated,
 | 
			
		||||
	// then we really want to be writing files to ./generated, not ./github.com/foo/bar/generated.
 | 
			
		||||
	// The following will trim a path prefix (github.com/foo/bar) from p.Path() to arrive at
 | 
			
		||||
	// a relative path that works with projects not in GOPATH.
 | 
			
		||||
	if c.TrimPathPrefix != "" {
 | 
			
		||||
		separator := string(filepath.Separator)
 | 
			
		||||
		if !strings.HasSuffix(c.TrimPathPrefix, separator) {
 | 
			
		||||
			c.TrimPathPrefix += separator
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		path = strings.TrimPrefix(path, c.TrimPathPrefix)
 | 
			
		||||
	}
 | 
			
		||||
	klog.V(5).Infof("Processing package %q, disk location %q", p.Name(), path)
 | 
			
		||||
	// Filter out any types the *package* doesn't care about.
 | 
			
		||||
	packageContext := c.filteredBy(p.Filter)
 | 
			
		||||
	os.MkdirAll(path, 0755)
 | 
			
		||||
	files := map[string]*File{}
 | 
			
		||||
	for _, g := range p.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:       p.Name(),
 | 
			
		||||
				PackagePath:       p.Path(),
 | 
			
		||||
				PackageSourcePath: p.SourcePath(),
 | 
			
		||||
				Header:            p.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 errors []error
 | 
			
		||||
	for _, f := range files {
 | 
			
		||||
		finalPath := filepath.Join(path, 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)
 | 
			
		||||
		}
 | 
			
		||||
		var err error
 | 
			
		||||
		if c.Verify {
 | 
			
		||||
			err = assembler.VerifyFile(f, finalPath)
 | 
			
		||||
		} else {
 | 
			
		||||
			err = assembler.AssembleFile(f, finalPath)
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			errors = append(errors, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(errors) > 0 {
 | 
			
		||||
		return fmt.Errorf("errors in package %q:\n%v\n", p.Path(), strings.Join(errs2strings(errors), "\n"))
 | 
			
		||||
	}
 | 
			
		||||
	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()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										259
									
								
								vendor/k8s.io/gengo/generator/generator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										259
									
								
								vendor/k8s.io/gengo/generator/generator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,259 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/namer"
 | 
			
		||||
	"k8s.io/gengo/parser"
 | 
			
		||||
	"k8s.io/gengo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Package contains the contract for generating a package.
 | 
			
		||||
type Package interface {
 | 
			
		||||
	// Name returns the package short name.
 | 
			
		||||
	Name() string
 | 
			
		||||
	// Path returns the package import path.
 | 
			
		||||
	Path() string
 | 
			
		||||
	// SourcePath returns the location of the package on disk.
 | 
			
		||||
	SourcePath() 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
 | 
			
		||||
	PackageSourcePath string
 | 
			
		||||
	Imports           map[string]struct{}
 | 
			
		||||
	Vars              bytes.Buffer
 | 
			
		||||
	Consts            bytes.Buffer
 | 
			
		||||
	Body              bytes.Buffer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type FileType interface {
 | 
			
		||||
	AssembleFile(f *File, path string) error
 | 
			
		||||
	VerifyFile(f *File, path string) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Packages is a list of packages to generate.
 | 
			
		||||
type Packages []Package
 | 
			
		||||
 | 
			
		||||
// 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 Package 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
 | 
			
		||||
 | 
			
		||||
	// Incoming imports, i.e. packages importing the given package.
 | 
			
		||||
	incomingImports map[string][]string
 | 
			
		||||
 | 
			
		||||
	// Incoming transitive imports, i.e. the transitive closure of IncomingImports
 | 
			
		||||
	incomingTransitiveImports map[string][]string
 | 
			
		||||
 | 
			
		||||
	// All the user-specified packages.  This is after recursive expansion.
 | 
			
		||||
	Inputs []string
 | 
			
		||||
 | 
			
		||||
	// The canonical ordering of the types (will be filtered by both the
 | 
			
		||||
	// Package'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 "golang" filetype will be provided.
 | 
			
		||||
	FileTypes map[string]FileType
 | 
			
		||||
 | 
			
		||||
	// If true, Execute* calls will just verify that the existing output is
 | 
			
		||||
	// correct. (You may set this after calling NewContext.)
 | 
			
		||||
	Verify bool
 | 
			
		||||
 | 
			
		||||
	// Allows generators to add packages at runtime.
 | 
			
		||||
	builder *parser.Builder
 | 
			
		||||
 | 
			
		||||
	// If specified, trim the prefix from a package's path before writing files.
 | 
			
		||||
	TrimPathPrefix string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewContext generates a context from the given builder, naming systems, and
 | 
			
		||||
// the naming system you wish to construct the canonical ordering from.
 | 
			
		||||
func NewContext(b *parser.Builder, nameSystems namer.NameSystems, canonicalOrderName string) (*Context, error) {
 | 
			
		||||
	universe, err := b.FindTypes()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c := &Context{
 | 
			
		||||
		Namers:   namer.NameSystems{},
 | 
			
		||||
		Universe: universe,
 | 
			
		||||
		Inputs:   b.FindPackages(),
 | 
			
		||||
		FileTypes: map[string]FileType{
 | 
			
		||||
			GolangFileType: NewGolangFile(),
 | 
			
		||||
		},
 | 
			
		||||
		builder: b,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IncomingImports returns the incoming imports for each package. The map is lazily computed.
 | 
			
		||||
func (ctxt *Context) IncomingImports() map[string][]string {
 | 
			
		||||
	if ctxt.incomingImports == nil {
 | 
			
		||||
		incoming := map[string][]string{}
 | 
			
		||||
		for _, pkg := range ctxt.Universe {
 | 
			
		||||
			for imp := range pkg.Imports {
 | 
			
		||||
				incoming[imp] = append(incoming[imp], pkg.Path)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		ctxt.incomingImports = incoming
 | 
			
		||||
	}
 | 
			
		||||
	return ctxt.incomingImports
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TransitiveIncomingImports returns the transitive closure of the incoming imports for each package.
 | 
			
		||||
// The map is lazily computed.
 | 
			
		||||
func (ctxt *Context) TransitiveIncomingImports() map[string][]string {
 | 
			
		||||
	if ctxt.incomingTransitiveImports == nil {
 | 
			
		||||
		ctxt.incomingTransitiveImports = transitiveClosure(ctxt.IncomingImports())
 | 
			
		||||
	}
 | 
			
		||||
	return ctxt.incomingTransitiveImports
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddDir adds a Go package to the context. The specified path must be a single
 | 
			
		||||
// go package import path.  GOPATH, GOROOT, and the location of your go binary
 | 
			
		||||
// (`which go`) will all be searched, in the normal Go fashion.
 | 
			
		||||
// Deprecated. Please use AddDirectory.
 | 
			
		||||
func (ctxt *Context) AddDir(path string) error {
 | 
			
		||||
	ctxt.incomingImports = nil
 | 
			
		||||
	ctxt.incomingTransitiveImports = nil
 | 
			
		||||
	return ctxt.builder.AddDirTo(path, &ctxt.Universe)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddDirectory adds a Go package to the context. The specified path must be a
 | 
			
		||||
// single go package import path.  GOPATH, GOROOT, and the location of your go
 | 
			
		||||
// binary (`which go`) will all be searched, in the normal Go fashion.
 | 
			
		||||
func (ctxt *Context) AddDirectory(path string) (*types.Package, error) {
 | 
			
		||||
	ctxt.incomingImports = nil
 | 
			
		||||
	ctxt.incomingTransitiveImports = nil
 | 
			
		||||
	return ctxt.builder.AddDirectoryTo(path, &ctxt.Universe)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										89
									
								
								vendor/k8s.io/gengo/generator/import_tracker.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										89
									
								
								vendor/k8s.io/gengo/generator/import_tracker.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,89 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/gengo/namer"
 | 
			
		||||
	"k8s.io/gengo/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 golangTrackerLocalName(&tracker, 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 golangTrackerLocalName(tracker namer.ImportTracker, 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)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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.Replace(name, "_", "", -1)
 | 
			
		||||
		// These characters commonly appear in import paths for go
 | 
			
		||||
		// packages, but aren't legal go names. So we'll sanitize.
 | 
			
		||||
		name = strings.Replace(name, ".", "", -1)
 | 
			
		||||
		name = strings.Replace(name, "-", "", -1)
 | 
			
		||||
		if _, found := tracker.PathOf(name); found {
 | 
			
		||||
			// This name collides with some other package
 | 
			
		||||
			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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										154
									
								
								vendor/k8s.io/gengo/generator/snippet_writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										154
									
								
								vendor/k8s.io/gengo/generator/snippet_writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,154 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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.
 | 
			
		||||
func (a Args) With(key, value interface{}) Args {
 | 
			
		||||
	a2 := Args{key: value}
 | 
			
		||||
	for k, v := range a {
 | 
			
		||||
		a2[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	return a2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithArgs makes a copy of a and adds the given arguments.
 | 
			
		||||
func (a Args) WithArgs(rhs Args) Args {
 | 
			
		||||
	a2 := Args{}
 | 
			
		||||
	for k, v := range rhs {
 | 
			
		||||
		a2[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	for k, v := range a {
 | 
			
		||||
		a2[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	return a2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *SnippetWriter) Out() io.Writer {
 | 
			
		||||
	return s.w
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Error returns any encountered error.
 | 
			
		||||
func (s *SnippetWriter) Error() error {
 | 
			
		||||
	return s.err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										65
									
								
								vendor/k8s.io/gengo/generator/transitive_closure.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								vendor/k8s.io/gengo/generator/transitive_closure.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,65 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 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 "sort"
 | 
			
		||||
 | 
			
		||||
type edge struct {
 | 
			
		||||
	from string
 | 
			
		||||
	to   string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func transitiveClosure(in map[string][]string) map[string][]string {
 | 
			
		||||
	adj := make(map[edge]bool)
 | 
			
		||||
	imports := make(map[string]struct{})
 | 
			
		||||
	for from, tos := range in {
 | 
			
		||||
		for _, to := range tos {
 | 
			
		||||
			adj[edge{from, to}] = true
 | 
			
		||||
			imports[to] = struct{}{}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Warshal's algorithm
 | 
			
		||||
	for k := range in {
 | 
			
		||||
		for i := range in {
 | 
			
		||||
			if !adj[edge{i, k}] {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			for j := range imports {
 | 
			
		||||
				if adj[edge{i, j}] {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				if adj[edge{k, j}] {
 | 
			
		||||
					adj[edge{i, j}] = true
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	out := make(map[string][]string, len(in))
 | 
			
		||||
	for i := range in {
 | 
			
		||||
		for j := range imports {
 | 
			
		||||
			if adj[edge{i, j}] {
 | 
			
		||||
				out[i] = append(out[i], j)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		sort.Strings(out[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/k8s.io/gengo/namer/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/k8s.io/gengo/namer/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,31 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/namer"
 | 
			
		||||
							
								
								
									
										121
									
								
								vendor/k8s.io/gengo/namer/import_tracker.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										121
									
								
								vendor/k8s.io/gengo/namer/import_tracker.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,121 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/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.Sort(sort.StringSlice(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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										395
									
								
								vendor/k8s.io/gengo/namer/namer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										395
									
								
								vendor/k8s.io/gengo/namer/namer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,395 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/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 _, pt := range t.Signature.Parameters {
 | 
			
		||||
			parts = append(parts, ns.removePrefixAndSuffix(ns.Name(pt)))
 | 
			
		||||
		}
 | 
			
		||||
		parts = append(parts, "Returns")
 | 
			
		||||
		for _, rt := range t.Signature.Results {
 | 
			
		||||
			parts = append(parts, ns.removePrefixAndSuffix(ns.Name(rt)))
 | 
			
		||||
		}
 | 
			
		||||
		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)
 | 
			
		||||
		}
 | 
			
		||||
		name = "interface{" + strings.Join(elems, "; ") + "}"
 | 
			
		||||
	case types.Func:
 | 
			
		||||
		// TODO: add to name test
 | 
			
		||||
		params := []string{}
 | 
			
		||||
		for _, pt := range t.Signature.Parameters {
 | 
			
		||||
			params = append(params, r.Name(pt))
 | 
			
		||||
		}
 | 
			
		||||
		results := []string{}
 | 
			
		||||
		for _, rt := range t.Signature.Results {
 | 
			
		||||
			results = append(results, r.Name(rt))
 | 
			
		||||
		}
 | 
			
		||||
		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/namer/order.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										72
									
								
								vendor/k8s.io/gengo/namer/order.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,72 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/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/namer/plural_namer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										120
									
								
								vendor/k8s.io/gengo/namer/plural_namer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,120 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/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/parser/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/k8s.io/gengo/parser/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,19 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/parser"
 | 
			
		||||
							
								
								
									
										925
									
								
								vendor/k8s.io/gengo/parser/parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										925
									
								
								vendor/k8s.io/gengo/parser/parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,925 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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 (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"go/ast"
 | 
			
		||||
	"go/build"
 | 
			
		||||
	"go/constant"
 | 
			
		||||
	"go/parser"
 | 
			
		||||
	"go/token"
 | 
			
		||||
	tc "go/types"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"path"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/gengo/types"
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// This clarifies when a pkg path has been canonicalized.
 | 
			
		||||
type importPathString string
 | 
			
		||||
 | 
			
		||||
// Builder lets you add all the go files in all the packages that you care
 | 
			
		||||
// about, then constructs the type source data.
 | 
			
		||||
type Builder struct {
 | 
			
		||||
	context *build.Context
 | 
			
		||||
 | 
			
		||||
	// If true, include *_test.go
 | 
			
		||||
	IncludeTestFiles bool
 | 
			
		||||
 | 
			
		||||
	// Map of package names to more canonical information about the package.
 | 
			
		||||
	// This might hold the same value for multiple names, e.g. if someone
 | 
			
		||||
	// referenced ./pkg/name or in the case of vendoring, which canonicalizes
 | 
			
		||||
	// differently that what humans would type.
 | 
			
		||||
	//
 | 
			
		||||
	// This must only be accessed via getLoadedBuildPackage and setLoadedBuildPackage
 | 
			
		||||
	buildPackages map[importPathString]*build.Package
 | 
			
		||||
 | 
			
		||||
	fset *token.FileSet
 | 
			
		||||
	// map of package path to list of parsed files
 | 
			
		||||
	parsed map[importPathString][]parsedFile
 | 
			
		||||
	// map of package path to absolute path (to prevent overlap)
 | 
			
		||||
	absPaths map[importPathString]string
 | 
			
		||||
 | 
			
		||||
	// Set by typeCheckPackage(), used by importPackage() and friends.
 | 
			
		||||
	typeCheckedPackages map[importPathString]*tc.Package
 | 
			
		||||
 | 
			
		||||
	// Map of package path to whether the user requested it or it was from
 | 
			
		||||
	// an import.
 | 
			
		||||
	userRequested map[importPathString]bool
 | 
			
		||||
 | 
			
		||||
	// All comments from everywhere in every parsed file.
 | 
			
		||||
	endLineToCommentGroup map[fileLine]*ast.CommentGroup
 | 
			
		||||
 | 
			
		||||
	// map of package to list of packages it imports.
 | 
			
		||||
	importGraph map[importPathString]map[string]struct{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// parsedFile is for tracking files with name
 | 
			
		||||
type parsedFile struct {
 | 
			
		||||
	name string
 | 
			
		||||
	file *ast.File
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// key type for finding comments.
 | 
			
		||||
type fileLine struct {
 | 
			
		||||
	file string
 | 
			
		||||
	line int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// New constructs a new builder.
 | 
			
		||||
func New() *Builder {
 | 
			
		||||
	c := build.Default
 | 
			
		||||
	if c.GOROOT == "" {
 | 
			
		||||
		if p, err := exec.Command("which", "go").CombinedOutput(); err == nil {
 | 
			
		||||
			// The returned string will have some/path/bin/go, so remove the last two elements.
 | 
			
		||||
			c.GOROOT = filepath.Dir(filepath.Dir(strings.Trim(string(p), "\n")))
 | 
			
		||||
		} else {
 | 
			
		||||
			klog.Warningf("Warning: $GOROOT not set, and unable to run `which go` to find it: %v\n", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// Force this to off, since we don't properly parse CGo.  All symbols must
 | 
			
		||||
	// have non-CGo equivalents.
 | 
			
		||||
	c.CgoEnabled = false
 | 
			
		||||
	return &Builder{
 | 
			
		||||
		context:               &c,
 | 
			
		||||
		buildPackages:         map[importPathString]*build.Package{},
 | 
			
		||||
		typeCheckedPackages:   map[importPathString]*tc.Package{},
 | 
			
		||||
		fset:                  token.NewFileSet(),
 | 
			
		||||
		parsed:                map[importPathString][]parsedFile{},
 | 
			
		||||
		absPaths:              map[importPathString]string{},
 | 
			
		||||
		userRequested:         map[importPathString]bool{},
 | 
			
		||||
		endLineToCommentGroup: map[fileLine]*ast.CommentGroup{},
 | 
			
		||||
		importGraph:           map[importPathString]map[string]struct{}{},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddBuildTags adds the specified build tags to the parse context.
 | 
			
		||||
func (b *Builder) AddBuildTags(tags ...string) {
 | 
			
		||||
	b.context.BuildTags = append(b.context.BuildTags, tags...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *Builder) getLoadedBuildPackage(importPath string) (*build.Package, bool) {
 | 
			
		||||
	canonicalized := canonicalizeImportPath(importPath)
 | 
			
		||||
	if string(canonicalized) != importPath {
 | 
			
		||||
		klog.V(5).Infof("getLoadedBuildPackage: %s normalized to %s", importPath, canonicalized)
 | 
			
		||||
	}
 | 
			
		||||
	buildPkg, ok := b.buildPackages[canonicalized]
 | 
			
		||||
	return buildPkg, ok
 | 
			
		||||
}
 | 
			
		||||
func (b *Builder) setLoadedBuildPackage(importPath string, buildPkg *build.Package) {
 | 
			
		||||
	canonicalizedImportPath := canonicalizeImportPath(importPath)
 | 
			
		||||
	if string(canonicalizedImportPath) != importPath {
 | 
			
		||||
		klog.V(5).Infof("setLoadedBuildPackage: importPath %s normalized to %s", importPath, canonicalizedImportPath)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	canonicalizedBuildPkgImportPath := canonicalizeImportPath(buildPkg.ImportPath)
 | 
			
		||||
	if string(canonicalizedBuildPkgImportPath) != buildPkg.ImportPath {
 | 
			
		||||
		klog.V(5).Infof("setLoadedBuildPackage: buildPkg.ImportPath %s normalized to %s", buildPkg.ImportPath, canonicalizedBuildPkgImportPath)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if canonicalizedImportPath != canonicalizedBuildPkgImportPath {
 | 
			
		||||
		klog.V(5).Infof("setLoadedBuildPackage: normalized importPath (%s) differs from buildPkg.ImportPath (%s)", canonicalizedImportPath, canonicalizedBuildPkgImportPath)
 | 
			
		||||
	}
 | 
			
		||||
	b.buildPackages[canonicalizedImportPath] = buildPkg
 | 
			
		||||
	b.buildPackages[canonicalizedBuildPkgImportPath] = buildPkg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get package information from the go/build package. Automatically excludes
 | 
			
		||||
// e.g. test files and files for other platforms-- there is quite a bit of
 | 
			
		||||
// logic of that nature in the build package.
 | 
			
		||||
func (b *Builder) importBuildPackage(dir string) (*build.Package, error) {
 | 
			
		||||
	if buildPkg, ok := b.getLoadedBuildPackage(dir); ok {
 | 
			
		||||
		return buildPkg, nil
 | 
			
		||||
	}
 | 
			
		||||
	// This validates the `package foo // github.com/bar/foo` comments.
 | 
			
		||||
	buildPkg, err := b.importWithMode(dir, build.ImportComment)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if _, ok := err.(*build.NoGoError); !ok {
 | 
			
		||||
			return nil, fmt.Errorf("unable to import %q: %v", dir, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if buildPkg == nil {
 | 
			
		||||
		// Might be an empty directory. Try to just find the dir.
 | 
			
		||||
		buildPkg, err = b.importWithMode(dir, build.FindOnly)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Remember it under the user-provided name.
 | 
			
		||||
	klog.V(5).Infof("saving buildPackage %s", dir)
 | 
			
		||||
	b.setLoadedBuildPackage(dir, buildPkg)
 | 
			
		||||
 | 
			
		||||
	return buildPkg, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddFileForTest adds a file to the set, without verifying that the provided
 | 
			
		||||
// pkg actually exists on disk. The pkg must be of the form "canonical/pkg/path"
 | 
			
		||||
// and the path must be the absolute path to the file.  Because this bypasses
 | 
			
		||||
// the normal recursive finding of package dependencies (on disk), test should
 | 
			
		||||
// sort their test files topologically first, so all deps are resolved by the
 | 
			
		||||
// time we need them.
 | 
			
		||||
func (b *Builder) AddFileForTest(pkg string, path string, src []byte) error {
 | 
			
		||||
	if err := b.addFile(importPathString(pkg), path, src, true); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if _, err := b.typeCheckPackage(importPathString(pkg), true); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// addFile adds a file to the set. The pkgPath must be of the form
 | 
			
		||||
// "canonical/pkg/path" and the path must be the absolute path to the file. A
 | 
			
		||||
// flag indicates whether this file was user-requested or just from following
 | 
			
		||||
// the import graph.
 | 
			
		||||
func (b *Builder) addFile(pkgPath importPathString, path string, src []byte, userRequested bool) error {
 | 
			
		||||
	for _, p := range b.parsed[pkgPath] {
 | 
			
		||||
		if path == p.name {
 | 
			
		||||
			klog.V(5).Infof("addFile %s %s already parsed, skipping", pkgPath, path)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	klog.V(6).Infof("addFile %s %s", pkgPath, path)
 | 
			
		||||
	p, err := parser.ParseFile(b.fset, path, src, parser.DeclarationErrors|parser.ParseComments)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// This is redundant with addDir, but some tests call AddFileForTest, which
 | 
			
		||||
	// call into here without calling addDir.
 | 
			
		||||
	b.userRequested[pkgPath] = userRequested || b.userRequested[pkgPath]
 | 
			
		||||
 | 
			
		||||
	b.parsed[pkgPath] = append(b.parsed[pkgPath], parsedFile{path, p})
 | 
			
		||||
	for _, c := range p.Comments {
 | 
			
		||||
		position := b.fset.Position(c.End())
 | 
			
		||||
		b.endLineToCommentGroup[fileLine{position.Filename, position.Line}] = c
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We have to get the packages from this specific file, in case the
 | 
			
		||||
	// user added individual files instead of entire directories.
 | 
			
		||||
	if b.importGraph[pkgPath] == nil {
 | 
			
		||||
		b.importGraph[pkgPath] = map[string]struct{}{}
 | 
			
		||||
	}
 | 
			
		||||
	for _, im := range p.Imports {
 | 
			
		||||
		importedPath := strings.Trim(im.Path.Value, `"`)
 | 
			
		||||
		b.importGraph[pkgPath][importedPath] = struct{}{}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddDir adds an entire directory, scanning it for go files. 'dir' should have
 | 
			
		||||
// a single go package in it. GOPATH, GOROOT, and the location of your go
 | 
			
		||||
// binary (`which go`) will all be searched if dir doesn't literally resolve.
 | 
			
		||||
func (b *Builder) AddDir(dir string) error {
 | 
			
		||||
	_, err := b.importPackage(dir, true)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddDirRecursive is just like AddDir, but it also recursively adds
 | 
			
		||||
// subdirectories; it returns an error only if the path couldn't be resolved;
 | 
			
		||||
// any directories recursed into without go source are ignored.
 | 
			
		||||
func (b *Builder) AddDirRecursive(dir string) error {
 | 
			
		||||
	// Add the root.
 | 
			
		||||
	if _, err := b.importPackage(dir, true); err != nil {
 | 
			
		||||
		klog.Warningf("Ignoring directory %v: %v", dir, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// filepath.Walk does not follow symlinks. We therefore evaluate symlinks and use that with
 | 
			
		||||
	// filepath.Walk.
 | 
			
		||||
	buildPkg, ok := b.getLoadedBuildPackage(dir)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return fmt.Errorf("no loaded build package for %s", dir)
 | 
			
		||||
	}
 | 
			
		||||
	realPath, err := filepath.EvalSymlinks(buildPkg.Dir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn := func(filePath string, info os.FileInfo, err error) error {
 | 
			
		||||
		if info != nil && info.IsDir() {
 | 
			
		||||
			rel := filepath.ToSlash(strings.TrimPrefix(filePath, realPath))
 | 
			
		||||
			if rel != "" {
 | 
			
		||||
				// Make a pkg path.
 | 
			
		||||
				buildPkg, ok := b.getLoadedBuildPackage(dir)
 | 
			
		||||
				if !ok {
 | 
			
		||||
					return fmt.Errorf("no loaded build package for %s", dir)
 | 
			
		||||
				}
 | 
			
		||||
				pkg := path.Join(string(canonicalizeImportPath(buildPkg.ImportPath)), rel)
 | 
			
		||||
 | 
			
		||||
				// Add it.
 | 
			
		||||
				if _, err := b.importPackage(pkg, true); err != nil {
 | 
			
		||||
					klog.Warningf("Ignoring child directory %v: %v", pkg, err)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	if err := filepath.Walk(realPath, fn); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddDirTo adds an entire directory to a given Universe. Unlike AddDir, this
 | 
			
		||||
// processes the package immediately, which makes it safe to use from within a
 | 
			
		||||
// generator (rather than just at init time. 'dir' must be a single go package.
 | 
			
		||||
// GOPATH, GOROOT, and the location of your go binary (`which go`) will all be
 | 
			
		||||
// searched if dir doesn't literally resolve.
 | 
			
		||||
// Deprecated. Please use AddDirectoryTo.
 | 
			
		||||
func (b *Builder) AddDirTo(dir string, u *types.Universe) error {
 | 
			
		||||
	// We want all types from this package, as if they were directly added
 | 
			
		||||
	// by the user.  They WERE added by the user, in effect.
 | 
			
		||||
	if _, err := b.importPackage(dir, true); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	pkg, ok := b.getLoadedBuildPackage(dir)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return fmt.Errorf("no such package: %q", dir)
 | 
			
		||||
	}
 | 
			
		||||
	return b.findTypesIn(canonicalizeImportPath(pkg.ImportPath), u)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddDirectoryTo adds an entire directory to a given Universe. Unlike AddDir,
 | 
			
		||||
// this processes the package immediately, which makes it safe to use from
 | 
			
		||||
// within a generator (rather than just at init time. 'dir' must be a single go
 | 
			
		||||
// package. GOPATH, GOROOT, and the location of your go binary (`which go`)
 | 
			
		||||
// will all be searched if dir doesn't literally resolve.
 | 
			
		||||
func (b *Builder) AddDirectoryTo(dir string, u *types.Universe) (*types.Package, error) {
 | 
			
		||||
	// We want all types from this package, as if they were directly added
 | 
			
		||||
	// by the user.  They WERE added by the user, in effect.
 | 
			
		||||
	if _, err := b.importPackage(dir, true); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	pkg, ok := b.getLoadedBuildPackage(dir)
 | 
			
		||||
	if !ok || pkg == nil {
 | 
			
		||||
		return nil, fmt.Errorf("no such package: %q", dir)
 | 
			
		||||
	}
 | 
			
		||||
	path := canonicalizeImportPath(pkg.ImportPath)
 | 
			
		||||
	if err := b.findTypesIn(path, u); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return u.Package(string(path)), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The implementation of AddDir. A flag indicates whether this directory was
 | 
			
		||||
// user-requested or just from following the import graph.
 | 
			
		||||
func (b *Builder) addDir(dir string, userRequested bool) error {
 | 
			
		||||
	klog.V(5).Infof("addDir %s", dir)
 | 
			
		||||
	buildPkg, err := b.importBuildPackage(dir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	canonicalPackage := canonicalizeImportPath(buildPkg.ImportPath)
 | 
			
		||||
	pkgPath := canonicalPackage
 | 
			
		||||
	if dir != string(canonicalPackage) {
 | 
			
		||||
		klog.V(5).Infof("addDir %s, canonical path is %s", dir, pkgPath)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Sanity check the pkg dir has not changed.
 | 
			
		||||
	if prev, found := b.absPaths[pkgPath]; found {
 | 
			
		||||
		if buildPkg.Dir != prev {
 | 
			
		||||
			return fmt.Errorf("package %q (%s) previously resolved to %s", pkgPath, buildPkg.Dir, prev)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		b.absPaths[pkgPath] = buildPkg.Dir
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	files := []string{}
 | 
			
		||||
	files = append(files, buildPkg.GoFiles...)
 | 
			
		||||
	if b.IncludeTestFiles {
 | 
			
		||||
		files = append(files, buildPkg.TestGoFiles...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, file := range files {
 | 
			
		||||
		if !strings.HasSuffix(file, ".go") {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		absPath := filepath.Join(buildPkg.Dir, file)
 | 
			
		||||
		data, err := ioutil.ReadFile(absPath)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("while loading %q: %v", absPath, err)
 | 
			
		||||
		}
 | 
			
		||||
		err = b.addFile(pkgPath, absPath, data, userRequested)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("while parsing %q: %v", absPath, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// regexErrPackageNotFound helps test the expected error for not finding a package.
 | 
			
		||||
var regexErrPackageNotFound = regexp.MustCompile(`^unable to import ".*?":.*`)
 | 
			
		||||
 | 
			
		||||
func isErrPackageNotFound(err error) bool {
 | 
			
		||||
	return regexErrPackageNotFound.MatchString(err.Error())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// importPackage is a function that will be called by the type check package when it
 | 
			
		||||
// needs to import a go package. 'path' is the import path.
 | 
			
		||||
func (b *Builder) importPackage(dir string, userRequested bool) (*tc.Package, error) {
 | 
			
		||||
	klog.V(5).Infof("importPackage %s", dir)
 | 
			
		||||
 | 
			
		||||
	var pkgPath = importPathString(dir)
 | 
			
		||||
 | 
			
		||||
	// Get the canonical path if we can.
 | 
			
		||||
	if buildPkg, _ := b.getLoadedBuildPackage(dir); buildPkg != nil {
 | 
			
		||||
		canonicalPackage := canonicalizeImportPath(buildPkg.ImportPath)
 | 
			
		||||
		klog.V(5).Infof("importPackage %s, canonical path is %s", dir, canonicalPackage)
 | 
			
		||||
		pkgPath = canonicalPackage
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If we have not seen this before, process it now.
 | 
			
		||||
	ignoreError := false
 | 
			
		||||
	if _, found := b.parsed[pkgPath]; !found {
 | 
			
		||||
		// Ignore errors in paths that we're importing solely because
 | 
			
		||||
		// they're referenced by other packages.
 | 
			
		||||
		ignoreError = true
 | 
			
		||||
 | 
			
		||||
		// Add it.
 | 
			
		||||
		if err := b.addDir(dir, userRequested); err != nil {
 | 
			
		||||
			if isErrPackageNotFound(err) {
 | 
			
		||||
				klog.V(6).Info(err)
 | 
			
		||||
				return nil, nil
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Get the canonical path now that it has been added.
 | 
			
		||||
		if buildPkg, _ := b.getLoadedBuildPackage(dir); buildPkg != nil {
 | 
			
		||||
			canonicalPackage := canonicalizeImportPath(buildPkg.ImportPath)
 | 
			
		||||
			klog.V(5).Infof("importPackage %s, canonical path is %s", dir, canonicalPackage)
 | 
			
		||||
			pkgPath = canonicalPackage
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If it was previously known, just check that the user-requestedness hasn't
 | 
			
		||||
	// changed.
 | 
			
		||||
	b.userRequested[pkgPath] = userRequested || b.userRequested[pkgPath]
 | 
			
		||||
 | 
			
		||||
	// Run the type checker.  We may end up doing this to pkgs that are already
 | 
			
		||||
	// done, or are in the queue to be done later, but it will short-circuit,
 | 
			
		||||
	// and we can't miss pkgs that are only depended on.
 | 
			
		||||
	pkg, err := b.typeCheckPackage(pkgPath, !ignoreError)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		switch {
 | 
			
		||||
		case ignoreError && pkg != nil:
 | 
			
		||||
			klog.V(4).Infof("type checking encountered some issues in %q, but ignoring.\n", pkgPath)
 | 
			
		||||
		case !ignoreError && pkg != nil:
 | 
			
		||||
			klog.V(3).Infof("type checking encountered some errors in %q\n", pkgPath)
 | 
			
		||||
			return nil, err
 | 
			
		||||
		default:
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pkg, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type importAdapter struct {
 | 
			
		||||
	b *Builder
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a importAdapter) Import(path string) (*tc.Package, error) {
 | 
			
		||||
	return a.b.importPackage(path, false)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// typeCheckPackage will attempt to return the package even if there are some
 | 
			
		||||
// errors, so you may check whether the package is nil or not even if you get
 | 
			
		||||
// an error.
 | 
			
		||||
func (b *Builder) typeCheckPackage(pkgPath importPathString, logErr bool) (*tc.Package, error) {
 | 
			
		||||
	klog.V(5).Infof("typeCheckPackage %s", pkgPath)
 | 
			
		||||
	if pkg, ok := b.typeCheckedPackages[pkgPath]; ok {
 | 
			
		||||
		if pkg != nil {
 | 
			
		||||
			klog.V(6).Infof("typeCheckPackage %s already done", pkgPath)
 | 
			
		||||
			return pkg, nil
 | 
			
		||||
		}
 | 
			
		||||
		// We store a nil right before starting work on a package. So
 | 
			
		||||
		// if we get here and it's present and nil, that means there's
 | 
			
		||||
		// another invocation of this function on the call stack
 | 
			
		||||
		// already processing this package.
 | 
			
		||||
		return nil, fmt.Errorf("circular dependency for %q", pkgPath)
 | 
			
		||||
	}
 | 
			
		||||
	parsedFiles, ok := b.parsed[pkgPath]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("No files for pkg %q", pkgPath)
 | 
			
		||||
	}
 | 
			
		||||
	files := make([]*ast.File, len(parsedFiles))
 | 
			
		||||
	for i := range parsedFiles {
 | 
			
		||||
		files[i] = parsedFiles[i].file
 | 
			
		||||
	}
 | 
			
		||||
	b.typeCheckedPackages[pkgPath] = nil
 | 
			
		||||
	c := tc.Config{
 | 
			
		||||
		IgnoreFuncBodies: true,
 | 
			
		||||
		// Note that importAdapter can call b.importPackage which calls this
 | 
			
		||||
		// method. So there can't be cycles in the import graph.
 | 
			
		||||
		Importer: importAdapter{b},
 | 
			
		||||
		Error: func(err error) {
 | 
			
		||||
			if logErr {
 | 
			
		||||
				klog.V(2).Infof("type checker: %v\n", err)
 | 
			
		||||
			} else {
 | 
			
		||||
				klog.V(3).Infof("type checker: %v\n", err)
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	pkg, err := c.Check(string(pkgPath), b.fset, files, nil)
 | 
			
		||||
	b.typeCheckedPackages[pkgPath] = pkg // record the result whether or not there was an error
 | 
			
		||||
	return pkg, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindPackages fetches a list of the user-imported packages.
 | 
			
		||||
// Note that you need to call b.FindTypes() first.
 | 
			
		||||
func (b *Builder) FindPackages() []string {
 | 
			
		||||
	// Iterate packages in a predictable order.
 | 
			
		||||
	pkgPaths := []string{}
 | 
			
		||||
	for k := range b.typeCheckedPackages {
 | 
			
		||||
		pkgPaths = append(pkgPaths, string(k))
 | 
			
		||||
	}
 | 
			
		||||
	sort.Strings(pkgPaths)
 | 
			
		||||
 | 
			
		||||
	result := []string{}
 | 
			
		||||
	for _, pkgPath := range pkgPaths {
 | 
			
		||||
		if b.userRequested[importPathString(pkgPath)] {
 | 
			
		||||
			// Since walkType is recursive, all types that are in packages that
 | 
			
		||||
			// were directly mentioned will be included.  We don't need to
 | 
			
		||||
			// include all types in all transitive packages, though.
 | 
			
		||||
			result = append(result, pkgPath)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindTypes finalizes the package imports, and searches through all the
 | 
			
		||||
// packages for types.
 | 
			
		||||
func (b *Builder) FindTypes() (types.Universe, error) {
 | 
			
		||||
	// Take a snapshot of pkgs to iterate, since this will recursively mutate
 | 
			
		||||
	// b.parsed. Iterate in a predictable order.
 | 
			
		||||
	pkgPaths := []string{}
 | 
			
		||||
	for pkgPath := range b.parsed {
 | 
			
		||||
		pkgPaths = append(pkgPaths, string(pkgPath))
 | 
			
		||||
	}
 | 
			
		||||
	sort.Strings(pkgPaths)
 | 
			
		||||
 | 
			
		||||
	u := types.Universe{}
 | 
			
		||||
	for _, pkgPath := range pkgPaths {
 | 
			
		||||
		if err := b.findTypesIn(importPathString(pkgPath), &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 (b *Builder) addCommentsToType(obj tc.Object, t *types.Type) {
 | 
			
		||||
	c1 := b.priorCommentLines(obj.Pos(), 1)
 | 
			
		||||
	// c1.Text() is safe if c1 is nil
 | 
			
		||||
	t.CommentLines = splitLines(c1.Text())
 | 
			
		||||
	if c1 == nil {
 | 
			
		||||
		t.SecondClosestCommentLines = splitLines(b.priorCommentLines(obj.Pos(), 2).Text())
 | 
			
		||||
	} else {
 | 
			
		||||
		t.SecondClosestCommentLines = splitLines(b.priorCommentLines(c1.List[0].Slash, 2).Text())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// findTypesIn finalizes the package import and searches through the package
 | 
			
		||||
// for types.
 | 
			
		||||
func (b *Builder) findTypesIn(pkgPath importPathString, u *types.Universe) error {
 | 
			
		||||
	klog.V(5).Infof("findTypesIn %s", pkgPath)
 | 
			
		||||
	pkg := b.typeCheckedPackages[pkgPath]
 | 
			
		||||
	if pkg == nil {
 | 
			
		||||
		return fmt.Errorf("findTypesIn(%s): package is not known", pkgPath)
 | 
			
		||||
	}
 | 
			
		||||
	if !b.userRequested[pkgPath] {
 | 
			
		||||
		// Since walkType is recursive, all types that the
 | 
			
		||||
		// packages they asked for depend on will be included.
 | 
			
		||||
		// But we don't need to include all types in all
 | 
			
		||||
		// *packages* they depend on.
 | 
			
		||||
		klog.V(5).Infof("findTypesIn %s: package is not user requested", pkgPath)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We're keeping this package.  This call will create the record.
 | 
			
		||||
	u.Package(string(pkgPath)).Name = pkg.Name()
 | 
			
		||||
	u.Package(string(pkgPath)).Path = pkg.Path()
 | 
			
		||||
	u.Package(string(pkgPath)).SourcePath = b.absPaths[pkgPath]
 | 
			
		||||
 | 
			
		||||
	for _, f := range b.parsed[pkgPath] {
 | 
			
		||||
		if _, fileName := filepath.Split(f.name); fileName == "doc.go" {
 | 
			
		||||
			tp := u.Package(string(pkgPath))
 | 
			
		||||
			// findTypesIn might be called multiple times. Clean up tp.Comments
 | 
			
		||||
			// to avoid repeatedly fill same comments to it.
 | 
			
		||||
			tp.Comments = []string{}
 | 
			
		||||
			for i := range f.file.Comments {
 | 
			
		||||
				tp.Comments = append(tp.Comments, splitLines(f.file.Comments[i].Text())...)
 | 
			
		||||
			}
 | 
			
		||||
			if f.file.Doc != nil {
 | 
			
		||||
				tp.DocComments = splitLines(f.file.Doc.Text())
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s := pkg.Scope()
 | 
			
		||||
	for _, n := range s.Names() {
 | 
			
		||||
		obj := s.Lookup(n)
 | 
			
		||||
		tn, ok := obj.(*tc.TypeName)
 | 
			
		||||
		if ok {
 | 
			
		||||
			t := b.walkType(*u, nil, tn.Type())
 | 
			
		||||
			b.addCommentsToType(obj, t)
 | 
			
		||||
		}
 | 
			
		||||
		tf, ok := obj.(*tc.Func)
 | 
			
		||||
		// We only care about functions, not concrete/abstract methods.
 | 
			
		||||
		if ok && tf.Type() != nil && tf.Type().(*tc.Signature).Recv() == nil {
 | 
			
		||||
			t := b.addFunction(*u, nil, tf)
 | 
			
		||||
			b.addCommentsToType(obj, t)
 | 
			
		||||
		}
 | 
			
		||||
		tv, ok := obj.(*tc.Var)
 | 
			
		||||
		if ok && !tv.IsField() {
 | 
			
		||||
			t := b.addVariable(*u, nil, tv)
 | 
			
		||||
			b.addCommentsToType(obj, t)
 | 
			
		||||
		}
 | 
			
		||||
		tconst, ok := obj.(*tc.Const)
 | 
			
		||||
		if ok {
 | 
			
		||||
			t := b.addConstant(*u, nil, tconst)
 | 
			
		||||
			b.addCommentsToType(obj, t)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	importedPkgs := []string{}
 | 
			
		||||
	for k := range b.importGraph[pkgPath] {
 | 
			
		||||
		importedPkgs = append(importedPkgs, string(k))
 | 
			
		||||
	}
 | 
			
		||||
	sort.Strings(importedPkgs)
 | 
			
		||||
	for _, p := range importedPkgs {
 | 
			
		||||
		u.AddImports(string(pkgPath), p)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *Builder) importWithMode(dir string, mode build.ImportMode) (*build.Package, error) {
 | 
			
		||||
	// This is a bit of a hack.  The srcDir argument to Import() should
 | 
			
		||||
	// properly be the dir of the file which depends on the package to be
 | 
			
		||||
	// imported, so that vendoring can work properly and local paths can
 | 
			
		||||
	// resolve.  We assume that there is only one level of vendoring, and that
 | 
			
		||||
	// the CWD is inside the GOPATH, so this should be safe. Nobody should be
 | 
			
		||||
	// using local (relative) paths except on the CLI, so CWD is also
 | 
			
		||||
	// sufficient.
 | 
			
		||||
	cwd, err := os.Getwd()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("unable to get current directory: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// normalize to drop /vendor/ if present
 | 
			
		||||
	dir = string(canonicalizeImportPath(dir))
 | 
			
		||||
 | 
			
		||||
	buildPkg, err := b.context.Import(filepath.ToSlash(dir), cwd, mode)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return buildPkg, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// if there's a comment on the line `lines` before pos, return its text, otherwise "".
 | 
			
		||||
func (b *Builder) priorCommentLines(pos token.Pos, lines int) *ast.CommentGroup {
 | 
			
		||||
	position := b.fset.Position(pos)
 | 
			
		||||
	key := fileLine{position.Filename, position.Line - lines}
 | 
			
		||||
	return b.endLineToCommentGroup[key]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func splitLines(str string) []string {
 | 
			
		||||
	return strings.Split(strings.TrimRight(str, "\n"), "\n")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func tcFuncNameToName(in string) types.Name {
 | 
			
		||||
	name := strings.TrimPrefix(in, "func ")
 | 
			
		||||
	nameParts := strings.Split(name, "(")
 | 
			
		||||
	return tcNameToName(nameParts[0])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func tcVarNameToName(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 tcNameToName(nameParts[1])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func tcNameToName(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}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Otherwise, if there are '.' characters present, the name has a
 | 
			
		||||
	// package path in front.
 | 
			
		||||
	nameParts := strings.Split(in, ".")
 | 
			
		||||
	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]
 | 
			
		||||
	}
 | 
			
		||||
	return name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *Builder) convertSignature(u types.Universe, t *tc.Signature) *types.Signature {
 | 
			
		||||
	signature := &types.Signature{}
 | 
			
		||||
	for i := 0; i < t.Params().Len(); i++ {
 | 
			
		||||
		signature.Parameters = append(signature.Parameters, b.walkType(u, nil, t.Params().At(i).Type()))
 | 
			
		||||
		signature.ParameterNames = append(signature.ParameterNames, t.Params().At(i).Name())
 | 
			
		||||
	}
 | 
			
		||||
	for i := 0; i < t.Results().Len(); i++ {
 | 
			
		||||
		signature.Results = append(signature.Results, b.walkType(u, nil, t.Results().At(i).Type()))
 | 
			
		||||
		signature.ResultNames = append(signature.ResultNames, t.Results().At(i).Name())
 | 
			
		||||
	}
 | 
			
		||||
	if r := t.Recv(); r != nil {
 | 
			
		||||
		signature.Receiver = b.walkType(u, nil, r.Type())
 | 
			
		||||
	}
 | 
			
		||||
	signature.Variadic = t.Variadic()
 | 
			
		||||
	return signature
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// walkType adds the type, and any necessary child types.
 | 
			
		||||
func (b *Builder) walkType(u types.Universe, useName *types.Name, in tc.Type) *types.Type {
 | 
			
		||||
	// Most of the cases are underlying types of the named type.
 | 
			
		||||
	name := tcNameToName(in.String())
 | 
			
		||||
	if useName != nil {
 | 
			
		||||
		name = *useName
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch t := in.(type) {
 | 
			
		||||
	case *tc.Struct:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		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:         b.walkType(u, nil, f.Type()),
 | 
			
		||||
				CommentLines: splitLines(b.priorCommentLines(f.Pos(), 1).Text()),
 | 
			
		||||
			}
 | 
			
		||||
			out.Members = append(out.Members, m)
 | 
			
		||||
		}
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Map:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		if out.Kind != types.Unknown {
 | 
			
		||||
			return out
 | 
			
		||||
		}
 | 
			
		||||
		out.Kind = types.Map
 | 
			
		||||
		out.Elem = b.walkType(u, nil, t.Elem())
 | 
			
		||||
		out.Key = b.walkType(u, nil, t.Key())
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Pointer:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		if out.Kind != types.Unknown {
 | 
			
		||||
			return out
 | 
			
		||||
		}
 | 
			
		||||
		out.Kind = types.Pointer
 | 
			
		||||
		out.Elem = b.walkType(u, nil, t.Elem())
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Slice:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		if out.Kind != types.Unknown {
 | 
			
		||||
			return out
 | 
			
		||||
		}
 | 
			
		||||
		out.Kind = types.Slice
 | 
			
		||||
		out.Elem = b.walkType(u, nil, t.Elem())
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Array:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		if out.Kind != types.Unknown {
 | 
			
		||||
			return out
 | 
			
		||||
		}
 | 
			
		||||
		out.Kind = types.Array
 | 
			
		||||
		out.Elem = b.walkType(u, nil, t.Elem())
 | 
			
		||||
		out.Len = in.(*tc.Array).Len()
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Chan:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		if out.Kind != types.Unknown {
 | 
			
		||||
			return out
 | 
			
		||||
		}
 | 
			
		||||
		out.Kind = types.Chan
 | 
			
		||||
		out.Elem = b.walkType(u, nil, t.Elem())
 | 
			
		||||
		// TODO: need to store direction, otherwise raw type name
 | 
			
		||||
		// cannot be properly written.
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Basic:
 | 
			
		||||
		out := u.Type(types.Name{
 | 
			
		||||
			Package: "",
 | 
			
		||||
			Name:    t.Name(),
 | 
			
		||||
		})
 | 
			
		||||
		if out.Kind != types.Unknown {
 | 
			
		||||
			return out
 | 
			
		||||
		}
 | 
			
		||||
		out.Kind = types.Unsupported
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Signature:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		if out.Kind != types.Unknown {
 | 
			
		||||
			return out
 | 
			
		||||
		}
 | 
			
		||||
		out.Kind = types.Func
 | 
			
		||||
		out.Signature = b.convertSignature(u, t)
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Interface:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		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 := tcNameToName(method.String())
 | 
			
		||||
			mt := b.walkType(u, &name, method.Type())
 | 
			
		||||
			mt.CommentLines = splitLines(b.priorCommentLines(method.Pos(), 1).Text())
 | 
			
		||||
			out.Methods[method.Name()] = mt
 | 
			
		||||
		}
 | 
			
		||||
		return out
 | 
			
		||||
	case *tc.Named:
 | 
			
		||||
		var out *types.Type
 | 
			
		||||
		switch t.Underlying().(type) {
 | 
			
		||||
		case *tc.Named, *tc.Basic, *tc.Map, *tc.Slice:
 | 
			
		||||
			name := tcNameToName(t.String())
 | 
			
		||||
			out = u.Type(name)
 | 
			
		||||
			if out.Kind != types.Unknown {
 | 
			
		||||
				return out
 | 
			
		||||
			}
 | 
			
		||||
			out.Kind = types.Alias
 | 
			
		||||
			out.Underlying = b.walkType(u, nil, t.Underlying())
 | 
			
		||||
		default:
 | 
			
		||||
			// tc package makes everything "named" with an
 | 
			
		||||
			// underlying anonymous type--we remove that annoying
 | 
			
		||||
			// "feature" for users. This flattens those types
 | 
			
		||||
			// together.
 | 
			
		||||
			name := tcNameToName(t.String())
 | 
			
		||||
			if out := u.Type(name); out.Kind != types.Unknown {
 | 
			
		||||
				return out // short circuit if we've already made this.
 | 
			
		||||
			}
 | 
			
		||||
			out = b.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 := tcNameToName(method.String())
 | 
			
		||||
				mt := b.walkType(u, &name, method.Type())
 | 
			
		||||
				mt.CommentLines = splitLines(b.priorCommentLines(method.Pos(), 1).Text())
 | 
			
		||||
				out.Methods[method.Name()] = mt
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return out
 | 
			
		||||
	default:
 | 
			
		||||
		out := u.Type(name)
 | 
			
		||||
		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 (b *Builder) addFunction(u types.Universe, useName *types.Name, in *tc.Func) *types.Type {
 | 
			
		||||
	name := tcFuncNameToName(in.String())
 | 
			
		||||
	if useName != nil {
 | 
			
		||||
		name = *useName
 | 
			
		||||
	}
 | 
			
		||||
	out := u.Function(name)
 | 
			
		||||
	out.Kind = types.DeclarationOf
 | 
			
		||||
	out.Underlying = b.walkType(u, nil, in.Type())
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *Builder) addVariable(u types.Universe, useName *types.Name, in *tc.Var) *types.Type {
 | 
			
		||||
	name := tcVarNameToName(in.String())
 | 
			
		||||
	if useName != nil {
 | 
			
		||||
		name = *useName
 | 
			
		||||
	}
 | 
			
		||||
	out := u.Variable(name)
 | 
			
		||||
	out.Kind = types.DeclarationOf
 | 
			
		||||
	out.Underlying = b.walkType(u, nil, in.Type())
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *Builder) addConstant(u types.Universe, useName *types.Name, in *tc.Const) *types.Type {
 | 
			
		||||
	name := tcVarNameToName(in.String())
 | 
			
		||||
	if useName != nil {
 | 
			
		||||
		name = *useName
 | 
			
		||||
	}
 | 
			
		||||
	out := u.Constant(name)
 | 
			
		||||
	out.Kind = types.DeclarationOf
 | 
			
		||||
	out.Underlying = b.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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// canonicalizeImportPath takes an import path and returns the actual package.
 | 
			
		||||
// It doesn't support nested vendoring.
 | 
			
		||||
func canonicalizeImportPath(importPath string) importPathString {
 | 
			
		||||
	if !strings.Contains(importPath, "/vendor/") {
 | 
			
		||||
		return importPathString(importPath)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return importPathString(importPath[strings.Index(importPath, "/vendor/")+len("/vendor/"):])
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										82
									
								
								vendor/k8s.io/gengo/types/comments.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								vendor/k8s.io/gengo/types/comments.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,82 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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 (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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"}}
 | 
			
		||||
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
 | 
			
		||||
		}
 | 
			
		||||
		// TODO: we could support multiple values per key if we split on spaces
 | 
			
		||||
		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.
 | 
			
		||||
func ExtractSingleBoolCommentTag(marker string, key string, defaultVal bool, lines []string) (bool, error) {
 | 
			
		||||
	values := ExtractCommentTags(marker, lines)[key]
 | 
			
		||||
	if values == nil {
 | 
			
		||||
		return defaultVal, nil
 | 
			
		||||
	}
 | 
			
		||||
	if values[0] == "true" {
 | 
			
		||||
		return true, nil
 | 
			
		||||
	}
 | 
			
		||||
	if values[0] == "false" {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
	return false, fmt.Errorf("tag value for %q is not boolean: %q", key, values[0])
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/k8s.io/gengo/types/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/k8s.io/gengo/types/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,19 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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/types"
 | 
			
		||||
							
								
								
									
										57
									
								
								vendor/k8s.io/gengo/types/flatten.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										57
									
								
								vendor/k8s.io/gengo/types/flatten.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,57 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
// FlattenMembers recursively takes any embedded members and puts them in the
 | 
			
		||||
// top level, correctly hiding them if the top level hides them. There must not
 | 
			
		||||
// be a cycle-- that implies infinite members.
 | 
			
		||||
//
 | 
			
		||||
// This is useful for e.g. computing all the valid keys in a json struct,
 | 
			
		||||
// properly considering any configuration of embedded structs.
 | 
			
		||||
func FlattenMembers(m []Member) []Member {
 | 
			
		||||
	embedded := []Member{}
 | 
			
		||||
	normal := []Member{}
 | 
			
		||||
	type nameInfo struct {
 | 
			
		||||
		top bool
 | 
			
		||||
		i   int
 | 
			
		||||
	}
 | 
			
		||||
	names := map[string]nameInfo{}
 | 
			
		||||
	for i := range m {
 | 
			
		||||
		if m[i].Embedded && m[i].Type.Kind == Struct {
 | 
			
		||||
			embedded = append(embedded, m[i])
 | 
			
		||||
		} else {
 | 
			
		||||
			normal = append(normal, m[i])
 | 
			
		||||
			names[m[i].Name] = nameInfo{true, len(normal) - 1}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for i := range embedded {
 | 
			
		||||
		for _, e := range FlattenMembers(embedded[i].Type.Members) {
 | 
			
		||||
			if info, found := names[e.Name]; found {
 | 
			
		||||
				if info.top {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				if n := normal[info.i]; n.Name == e.Name && n.Type == e.Type {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				panic("conflicting members")
 | 
			
		||||
			}
 | 
			
		||||
			normal = append(normal, e)
 | 
			
		||||
			names[e.Name] = nameInfo{false, len(normal) - 1}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return normal
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										537
									
								
								vendor/k8s.io/gengo/types/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										537
									
								
								vendor/k8s.io/gengo/types/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,537 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
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 "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"
 | 
			
		||||
 | 
			
		||||
	// 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 name of this package-- its path.
 | 
			
		||||
	Path string
 | 
			
		||||
 | 
			
		||||
	// The location this package was loaded from
 | 
			
		||||
	SourcePath string
 | 
			
		||||
 | 
			
		||||
	// Short name of this package; the name that appears 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 == 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns the name of the type.
 | 
			
		||||
func (t *Type) String() string {
 | 
			
		||||
	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())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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     []*Type
 | 
			
		||||
	ParameterNames []string
 | 
			
		||||
	Results        []*Type
 | 
			
		||||
	ResultNames    []string
 | 
			
		||||
 | 
			
		||||
	// 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 (
 | 
			
		||||
	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{
 | 
			
		||||
			"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 IsInteger(t *Type) bool {
 | 
			
		||||
	switch t {
 | 
			
		||||
	case Int, Int64, Int32, Int16, Uint, Uint64, Uint32, Uint16, Byte:
 | 
			
		||||
		return true
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -1215,18 +1215,6 @@ gopkg.in/yaml.v3
 | 
			
		||||
## explicit; go 1.22.0
 | 
			
		||||
# k8s.io/endpointslice v0.0.0 => ./staging/src/k8s.io/endpointslice
 | 
			
		||||
## explicit; go 1.22.0
 | 
			
		||||
# k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01
 | 
			
		||||
## explicit; go 1.13
 | 
			
		||||
k8s.io/gengo/args
 | 
			
		||||
k8s.io/gengo/examples/deepcopy-gen/generators
 | 
			
		||||
k8s.io/gengo/examples/defaulter-gen/generators
 | 
			
		||||
k8s.io/gengo/examples/import-boss/generators
 | 
			
		||||
k8s.io/gengo/examples/set-gen/generators
 | 
			
		||||
k8s.io/gengo/examples/set-gen/sets
 | 
			
		||||
k8s.io/gengo/generator
 | 
			
		||||
k8s.io/gengo/namer
 | 
			
		||||
k8s.io/gengo/parser
 | 
			
		||||
k8s.io/gengo/types
 | 
			
		||||
# k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70
 | 
			
		||||
## explicit; go 1.20
 | 
			
		||||
k8s.io/gengo/v2
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user