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
	 Tim Hockin
					Tim Hockin