mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Update kubectl kustomize to kyaml/v0.18.1, cmd/config/v0.15.0, api/v0.18.0, kustomize/v5.5.0
This commit is contained in:
		
							
								
								
									
										33
									
								
								LICENSES/vendor/go.starlark.net/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								LICENSES/vendor/go.starlark.net/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,33 +0,0 @@
 | 
			
		||||
= vendor/go.starlark.net licensed under: =
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2017 The Bazel Authors.  All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are
 | 
			
		||||
met:
 | 
			
		||||
 | 
			
		||||
1. Redistributions of source code must retain the above copyright
 | 
			
		||||
   notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 | 
			
		||||
2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
   notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
   documentation and/or other materials provided with the
 | 
			
		||||
   distribution.
 | 
			
		||||
 | 
			
		||||
3. Neither the name of the copyright holder nor the names of its
 | 
			
		||||
   contributors may be used to endorse or promote products derived
 | 
			
		||||
   from this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
= vendor/go.starlark.net/LICENSE 30237ff6085f287d7c65ec084235a89e
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2018 QRI, Inc.
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
in the Software without restriction, including without limitation the rights
 | 
			
		||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in
 | 
			
		||||
all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										7
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								go.mod
									
									
									
									
									
								
							@@ -212,7 +212,6 @@ require (
 | 
			
		||||
	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
 | 
			
		||||
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
 | 
			
		||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
 | 
			
		||||
	go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
 | 
			
		||||
	go.uber.org/multierr v1.11.0 // indirect
 | 
			
		||||
	golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
 | 
			
		||||
	golang.org/x/mod v0.20.0 // indirect
 | 
			
		||||
@@ -224,9 +223,9 @@ require (
 | 
			
		||||
	k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 // indirect
 | 
			
		||||
	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect
 | 
			
		||||
	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/api v0.17.2 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/kustomize/v5 v5.4.2 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/api v0.18.0 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								go.sum
									
									
									
									
									
								
							@@ -176,10 +176,7 @@ github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNS
 | 
			
		||||
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
 | 
			
		||||
github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8=
 | 
			
		||||
github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 | 
			
		||||
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
 | 
			
		||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
			
		||||
github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y=
 | 
			
		||||
github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
@@ -344,7 +341,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 | 
			
		||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.3/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=
 | 
			
		||||
@@ -600,8 +596,6 @@ go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+
 | 
			
		||||
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
 | 
			
		||||
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
 | 
			
		||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
 | 
			
		||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
 | 
			
		||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
 | 
			
		||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
			
		||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 | 
			
		||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 | 
			
		||||
@@ -667,7 +661,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
@@ -678,7 +671,6 @@ golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
 | 
			
		||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
 | 
			
		||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
@@ -777,13 +769,13 @@ 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/knftables v0.0.17 h1:wGchTyRF/iGTIjd+vRaR1m676HM7jB8soFtyr/148ic=
 | 
			
		||||
sigs.k8s.io/knftables v0.0.17/go.mod h1:f/5ZLKYEUPUhVjUCg6l80ACdL7CIIyeL0DxfgojGRTk=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
 | 
			
		||||
sigs.k8s.io/kustomize/cmd/config v0.14.1/go.mod h1:Sw1cPsFqh4uYczCWKlidPgMrsffLPCAB+7ytYLlauY4=
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2 h1:9Zl5Gqg3XMdBEvkR54pVLCBj7FVO7W+VPNDDEzD6AyE=
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2/go.mod h1:5ypfJVYlPb2MKKeoGknVLxvHemDlQT+szI4+KOhnD6k=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
 | 
			
		||||
sigs.k8s.io/kustomize/cmd/config v0.15.0/go.mod h1:Jq57b0nPaoYUlOqg//0JtAh6iibboqMcfbtCYoWPM00=
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 h1:o1mtt6vpxsxDYaZKrw3BnEtc+pAjLz7UffnIvHNbvW0=
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0/go.mod h1:AeFCmgCrXzmvjWWaeZCyBp6XzG1Y0w1svYus8GhJEOE=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
 | 
			
		||||
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.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 | 
			
		||||
 
 | 
			
		||||
@@ -933,4 +933,5 @@ rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY=
 | 
			
		||||
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
 | 
			
		||||
sigs.k8s.io/kustomize/cmd/config v0.11.2 h1:YyoHHbxxsLUts/gWLGgIQkdT82ekp3zautbpcml54vc=
 | 
			
		||||
sigs.k8s.io/kustomize/cmd/config v0.14.1 h1:r1gRhgfPmnt7VYf4uxO8M27GX406n9kOOeScOH9IQds=
 | 
			
		||||
sigs.k8s.io/kustomize/cmd/config v0.15.0 h1:WkdY8V2+8J+W00YbImXa2ke9oegfrHH79e+kywW7EdU=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
 
 | 
			
		||||
@@ -25,8 +25,8 @@ require (
 | 
			
		||||
	k8s.io/klog/v2 v2.130.1
 | 
			
		||||
	k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2
 | 
			
		||||
	k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
 | 
			
		||||
	sigs.k8s.io/kustomize/api v0.17.2
 | 
			
		||||
	sigs.k8s.io/kustomize/kyaml v0.17.1
 | 
			
		||||
	sigs.k8s.io/kustomize/api v0.18.0
 | 
			
		||||
	sigs.k8s.io/kustomize/kyaml v0.18.1
 | 
			
		||||
	sigs.k8s.io/yaml v1.4.0
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -60,7 +60,6 @@ require (
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 | 
			
		||||
	github.com/x448/float16 v0.8.4 // indirect
 | 
			
		||||
	github.com/xlab/treeprint v1.2.0 // indirect
 | 
			
		||||
	go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
 | 
			
		||||
	golang.org/x/net v0.28.0 // indirect
 | 
			
		||||
	golang.org/x/oauth2 v0.21.0 // indirect
 | 
			
		||||
	golang.org/x/sys v0.23.0 // indirect
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										73
									
								
								staging/src/k8s.io/cli-runtime/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										73
									
								
								staging/src/k8s.io/cli-runtime/go.sum
									
									
									
										generated
									
									
									
								
							@@ -1,18 +1,11 @@
 | 
			
		||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
			
		||||
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
 | 
			
		||||
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 | 
			
		||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 | 
			
		||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
			
		||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
 | 
			
		||||
@@ -23,8 +16,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
 | 
			
		||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/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/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
			
		||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 | 
			
		||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
 | 
			
		||||
@@ -43,29 +34,13 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
 | 
			
		||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 | 
			
		||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
			
		||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
			
		||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
			
		||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 | 
			
		||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 | 
			
		||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 | 
			
		||||
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
 | 
			
		||||
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.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
			
		||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.1/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=
 | 
			
		||||
@@ -124,7 +99,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
@@ -152,51 +126,34 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
 | 
			
		||||
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
 | 
			
		||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
 | 
			
		||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
 | 
			
		||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 | 
			
		||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
			
		||||
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.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 | 
			
		||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
 | 
			
		||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
			
		||||
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
 | 
			
		||||
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
 | 
			
		||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
 | 
			
		||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
 | 
			
		||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
@@ -206,10 +163,6 @@ golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 | 
			
		||||
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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
			
		||||
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-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
@@ -219,22 +172,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
			
		||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 | 
			
		||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
			
		||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
			
		||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
			
		||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 | 
			
		||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
			
		||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
			
		||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
 | 
			
		||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
@@ -250,8 +187,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=
 | 
			
		||||
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/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
 | 
			
		||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 | 
			
		||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 | 
			
		||||
@@ -261,10 +196,10 @@ k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1
 | 
			
		||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 | 
			
		||||
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/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
 | 
			
		||||
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.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 | 
			
		||||
 
 | 
			
		||||
@@ -42,8 +42,8 @@ require (
 | 
			
		||||
	k8s.io/metrics v0.0.0
 | 
			
		||||
	k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
 | 
			
		||||
	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd
 | 
			
		||||
	sigs.k8s.io/kustomize/kustomize/v5 v5.4.2
 | 
			
		||||
	sigs.k8s.io/kustomize/kyaml v0.17.1
 | 
			
		||||
	sigs.k8s.io/kustomize/kustomize/v5 v5.5.0
 | 
			
		||||
	sigs.k8s.io/kustomize/kyaml v0.18.1
 | 
			
		||||
	sigs.k8s.io/structured-merge-diff/v4 v4.4.1
 | 
			
		||||
	sigs.k8s.io/yaml v1.4.0
 | 
			
		||||
)
 | 
			
		||||
@@ -83,7 +83,6 @@ require (
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 | 
			
		||||
	github.com/x448/float16 v0.8.4 // indirect
 | 
			
		||||
	github.com/xlab/treeprint v1.2.0 // indirect
 | 
			
		||||
	go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
 | 
			
		||||
	golang.org/x/net v0.28.0 // indirect
 | 
			
		||||
	golang.org/x/oauth2 v0.21.0 // indirect
 | 
			
		||||
	golang.org/x/sync v0.8.0 // indirect
 | 
			
		||||
@@ -94,7 +93,7 @@ require (
 | 
			
		||||
	google.golang.org/protobuf v1.34.2 // indirect
 | 
			
		||||
	gopkg.in/inf.v0 v0.9.1 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/api v0.17.2 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/api v0.18.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										79
									
								
								staging/src/k8s.io/kubectl/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										79
									
								
								staging/src/k8s.io/kubectl/go.sum
									
									
									
										generated
									
									
									
								
							@@ -1,8 +1,6 @@
 | 
			
		||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
			
		||||
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
 | 
			
		||||
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
 | 
			
		||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
 | 
			
		||||
@@ -13,15 +11,10 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
 | 
			
		||||
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
 | 
			
		||||
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
 | 
			
		||||
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk=
 | 
			
		||||
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 | 
			
		||||
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
 | 
			
		||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 | 
			
		||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
			
		||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
 | 
			
		||||
@@ -36,8 +29,6 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr
 | 
			
		||||
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
 | 
			
		||||
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/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
			
		||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
			
		||||
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM=
 | 
			
		||||
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=
 | 
			
		||||
github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8=
 | 
			
		||||
@@ -63,17 +54,7 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
 | 
			
		||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 | 
			
		||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
			
		||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
			
		||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
			
		||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 | 
			
		||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 | 
			
		||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 | 
			
		||||
github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho=
 | 
			
		||||
@@ -85,12 +66,6 @@ github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
 | 
			
		||||
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.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
			
		||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.1/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=
 | 
			
		||||
@@ -163,7 +138,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
			
		||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
 | 
			
		||||
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
 | 
			
		||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
 | 
			
		||||
@@ -204,8 +178,6 @@ go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUis
 | 
			
		||||
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
 | 
			
		||||
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
 | 
			
		||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
 | 
			
		||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
 | 
			
		||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
 | 
			
		||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 | 
			
		||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 | 
			
		||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
 | 
			
		||||
@@ -214,44 +186,29 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
			
		||||
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.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 | 
			
		||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
 | 
			
		||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
			
		||||
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
 | 
			
		||||
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
 | 
			
		||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
 | 
			
		||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
 | 
			
		||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
 | 
			
		||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
@@ -261,10 +218,6 @@ golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 | 
			
		||||
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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
			
		||||
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-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
@@ -274,25 +227,9 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
			
		||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 | 
			
		||||
google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU=
 | 
			
		||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
 | 
			
		||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
			
		||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
			
		||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
			
		||||
google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
			
		||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 | 
			
		||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
			
		||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
			
		||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
 | 
			
		||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
@@ -308,8 +245,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=
 | 
			
		||||
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/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
 | 
			
		||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 | 
			
		||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 | 
			
		||||
@@ -319,13 +254,13 @@ k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1
 | 
			
		||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 | 
			
		||||
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/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
 | 
			
		||||
sigs.k8s.io/kustomize/cmd/config v0.14.1/go.mod h1:Sw1cPsFqh4uYczCWKlidPgMrsffLPCAB+7ytYLlauY4=
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2 h1:9Zl5Gqg3XMdBEvkR54pVLCBj7FVO7W+VPNDDEzD6AyE=
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2/go.mod h1:5ypfJVYlPb2MKKeoGknVLxvHemDlQT+szI4+KOhnD6k=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
 | 
			
		||||
sigs.k8s.io/kustomize/cmd/config v0.15.0/go.mod h1:Jq57b0nPaoYUlOqg//0JtAh6iibboqMcfbtCYoWPM00=
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 h1:o1mtt6vpxsxDYaZKrw3BnEtc+pAjLz7UffnIvHNbvW0=
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0/go.mod h1:AeFCmgCrXzmvjWWaeZCyBp6XzG1Y0w1svYus8GhJEOE=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
 | 
			
		||||
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.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TODO(knverey): remove this hardcoding once kubectl being built with module support makes BuildInfo available.
 | 
			
		||||
const kustomizeVersion = "v5.4.2"
 | 
			
		||||
const kustomizeVersion = "v5.5.0"
 | 
			
		||||
 | 
			
		||||
// Version is a struct for version information
 | 
			
		||||
type Version struct {
 | 
			
		||||
 
 | 
			
		||||
@@ -45,10 +45,8 @@ require (
 | 
			
		||||
	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 | 
			
		||||
	github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
 | 
			
		||||
	github.com/pkg/errors v0.9.1 // indirect
 | 
			
		||||
	github.com/stretchr/objx v0.5.2 // indirect
 | 
			
		||||
	github.com/x448/float16 v0.8.4 // indirect
 | 
			
		||||
	github.com/xlab/treeprint v1.2.0 // indirect
 | 
			
		||||
	go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
 | 
			
		||||
	golang.org/x/net v0.28.0 // indirect
 | 
			
		||||
	golang.org/x/oauth2 v0.21.0 // indirect
 | 
			
		||||
	golang.org/x/sync v0.8.0 // indirect
 | 
			
		||||
@@ -67,8 +65,8 @@ require (
 | 
			
		||||
	k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 // indirect
 | 
			
		||||
	k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
 | 
			
		||||
	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/api v0.17.2 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/api v0.18.0 // indirect
 | 
			
		||||
	sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
 | 
			
		||||
	sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
 | 
			
		||||
	sigs.k8s.io/yaml v1.4.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										73
									
								
								staging/src/k8s.io/sample-cli-plugin/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										73
									
								
								staging/src/k8s.io/sample-cli-plugin/go.sum
									
									
									
										generated
									
									
									
								
							@@ -1,18 +1,11 @@
 | 
			
		||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
			
		||||
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
 | 
			
		||||
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 | 
			
		||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 | 
			
		||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
			
		||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
 | 
			
		||||
@@ -23,8 +16,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
 | 
			
		||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/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/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
			
		||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 | 
			
		||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
 | 
			
		||||
@@ -43,29 +34,13 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
 | 
			
		||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 | 
			
		||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
			
		||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
			
		||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
			
		||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 | 
			
		||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 | 
			
		||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 | 
			
		||||
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
 | 
			
		||||
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.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
			
		||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.1/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=
 | 
			
		||||
@@ -124,7 +99,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
@@ -152,51 +126,34 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
 | 
			
		||||
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
 | 
			
		||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
 | 
			
		||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
 | 
			
		||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 | 
			
		||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
			
		||||
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.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 | 
			
		||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
 | 
			
		||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
			
		||||
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
 | 
			
		||||
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
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=
 | 
			
		||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
 | 
			
		||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
 | 
			
		||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
 | 
			
		||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
@@ -206,10 +163,6 @@ golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 | 
			
		||||
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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
			
		||||
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-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
@@ -219,22 +172,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
			
		||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 | 
			
		||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
			
		||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
			
		||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
			
		||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 | 
			
		||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
			
		||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
			
		||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
 | 
			
		||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
@@ -250,8 +187,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=
 | 
			
		||||
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/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
 | 
			
		||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 | 
			
		||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 | 
			
		||||
@@ -261,10 +196,10 @@ k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1
 | 
			
		||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 | 
			
		||||
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/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
 | 
			
		||||
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
 | 
			
		||||
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.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								vendor/go.starlark.net/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/go.starlark.net/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,29 +0,0 @@
 | 
			
		||||
Copyright (c) 2017 The Bazel Authors.  All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are
 | 
			
		||||
met:
 | 
			
		||||
 | 
			
		||||
1. Redistributions of source code must retain the above copyright
 | 
			
		||||
   notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 | 
			
		||||
2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
   notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
   documentation and/or other materials provided with the
 | 
			
		||||
   distribution.
 | 
			
		||||
 | 
			
		||||
3. Neither the name of the copyright holder nor the names of its
 | 
			
		||||
   contributors may be used to endorse or promote products derived
 | 
			
		||||
   from this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
							
								
								
									
										1924
									
								
								vendor/go.starlark.net/internal/compile/compile.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1924
									
								
								vendor/go.starlark.net/internal/compile/compile.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										395
									
								
								vendor/go.starlark.net/internal/compile/serial.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										395
									
								
								vendor/go.starlark.net/internal/compile/serial.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,395 +0,0 @@
 | 
			
		||||
package compile
 | 
			
		||||
 | 
			
		||||
// This file defines functions to read and write a compile.Program to a file.
 | 
			
		||||
//
 | 
			
		||||
// It is the client's responsibility to avoid version skew between the
 | 
			
		||||
// compiler used to produce a file and the interpreter that consumes it.
 | 
			
		||||
// The version number is provided as a constant.
 | 
			
		||||
// Incompatible protocol changes should also increment the version number.
 | 
			
		||||
//
 | 
			
		||||
// Encoding
 | 
			
		||||
//
 | 
			
		||||
// Program:
 | 
			
		||||
//	"sky!"		[4]byte		# magic number
 | 
			
		||||
//	str		uint32le	# offset of <strings> section
 | 
			
		||||
//	version		varint		# must match Version
 | 
			
		||||
//	filename	string
 | 
			
		||||
//	numloads	varint
 | 
			
		||||
//	loads		[]Ident
 | 
			
		||||
//	numnames	varint
 | 
			
		||||
//	names		[]string
 | 
			
		||||
//	numconsts	varint
 | 
			
		||||
//	consts		[]Constant
 | 
			
		||||
//	numglobals	varint
 | 
			
		||||
//	globals		[]Ident
 | 
			
		||||
//	toplevel	Funcode
 | 
			
		||||
//	numfuncs	varint
 | 
			
		||||
//	funcs		[]Funcode
 | 
			
		||||
//	<strings>	[]byte		# concatenation of all referenced strings
 | 
			
		||||
//	EOF
 | 
			
		||||
//
 | 
			
		||||
// Funcode:
 | 
			
		||||
//	id		Ident
 | 
			
		||||
//	code		[]byte
 | 
			
		||||
//	pclinetablen	varint
 | 
			
		||||
//	pclinetab	[]varint
 | 
			
		||||
//	numlocals	varint
 | 
			
		||||
//	locals		[]Ident
 | 
			
		||||
//	numcells	varint
 | 
			
		||||
//	cells		[]int
 | 
			
		||||
//	numfreevars	varint
 | 
			
		||||
//	freevar		[]Ident
 | 
			
		||||
//	maxstack	varint
 | 
			
		||||
//	numparams	varint
 | 
			
		||||
//	numkwonlyparams	varint
 | 
			
		||||
//	hasvarargs	varint (0 or 1)
 | 
			
		||||
//	haskwargs	varint (0 or 1)
 | 
			
		||||
//
 | 
			
		||||
// Ident:
 | 
			
		||||
//	filename	string
 | 
			
		||||
//	line, col	varint
 | 
			
		||||
//
 | 
			
		||||
// Constant:                            # type      data
 | 
			
		||||
//      type            varint          # 0=string  string
 | 
			
		||||
//      data            ...             # 1=bytes   string
 | 
			
		||||
//                                      # 2=int     varint
 | 
			
		||||
//                                      # 3=float   varint (bits as uint64)
 | 
			
		||||
//                                      # 4=bigint  string (decimal ASCII text)
 | 
			
		||||
//
 | 
			
		||||
// The encoding starts with a four-byte magic number.
 | 
			
		||||
// The next four bytes are a little-endian uint32
 | 
			
		||||
// that provides the offset of the string section
 | 
			
		||||
// at the end of the file, which contains the ordered
 | 
			
		||||
// concatenation of all strings referenced by the
 | 
			
		||||
// program. This design permits the decoder to read
 | 
			
		||||
// the first and second parts of the file into different
 | 
			
		||||
// memory allocations: the first (the encoded program)
 | 
			
		||||
// is transient, but the second (the strings) persists
 | 
			
		||||
// for the life of the Program.
 | 
			
		||||
//
 | 
			
		||||
// Within the encoded program, all strings are referred
 | 
			
		||||
// to by their length. As the encoder and decoder process
 | 
			
		||||
// the entire file sequentially, they are in lock step,
 | 
			
		||||
// so the start offset of each string is implicit.
 | 
			
		||||
//
 | 
			
		||||
// Program.Code is represented as a []byte slice to permit
 | 
			
		||||
// modification when breakpoints are set. All other strings
 | 
			
		||||
// are represented as strings. They all (unsafely) share the
 | 
			
		||||
// same backing byte slice.
 | 
			
		||||
//
 | 
			
		||||
// Aside from the str field, all integers are encoded as varints.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	debugpkg "runtime/debug"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/syntax"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const magic = "!sky"
 | 
			
		||||
 | 
			
		||||
// Encode encodes a compiled Starlark program.
 | 
			
		||||
func (prog *Program) Encode() []byte {
 | 
			
		||||
	var e encoder
 | 
			
		||||
	e.p = append(e.p, magic...)
 | 
			
		||||
	e.p = append(e.p, "????"...) // string data offset; filled in later
 | 
			
		||||
	e.int(Version)
 | 
			
		||||
	e.string(prog.Toplevel.Pos.Filename())
 | 
			
		||||
	e.bindings(prog.Loads)
 | 
			
		||||
	e.int(len(prog.Names))
 | 
			
		||||
	for _, name := range prog.Names {
 | 
			
		||||
		e.string(name)
 | 
			
		||||
	}
 | 
			
		||||
	e.int(len(prog.Constants))
 | 
			
		||||
	for _, c := range prog.Constants {
 | 
			
		||||
		switch c := c.(type) {
 | 
			
		||||
		case string:
 | 
			
		||||
			e.int(0)
 | 
			
		||||
			e.string(c)
 | 
			
		||||
		case Bytes:
 | 
			
		||||
			e.int(1)
 | 
			
		||||
			e.string(string(c))
 | 
			
		||||
		case int64:
 | 
			
		||||
			e.int(2)
 | 
			
		||||
			e.int64(c)
 | 
			
		||||
		case float64:
 | 
			
		||||
			e.int(3)
 | 
			
		||||
			e.uint64(math.Float64bits(c))
 | 
			
		||||
		case *big.Int:
 | 
			
		||||
			e.int(4)
 | 
			
		||||
			e.string(c.Text(10))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	e.bindings(prog.Globals)
 | 
			
		||||
	e.function(prog.Toplevel)
 | 
			
		||||
	e.int(len(prog.Functions))
 | 
			
		||||
	for _, fn := range prog.Functions {
 | 
			
		||||
		e.function(fn)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Patch in the offset of the string data section.
 | 
			
		||||
	binary.LittleEndian.PutUint32(e.p[4:8], uint32(len(e.p)))
 | 
			
		||||
 | 
			
		||||
	return append(e.p, e.s...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type encoder struct {
 | 
			
		||||
	p   []byte // encoded program
 | 
			
		||||
	s   []byte // strings
 | 
			
		||||
	tmp [binary.MaxVarintLen64]byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *encoder) int(x int) {
 | 
			
		||||
	e.int64(int64(x))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *encoder) int64(x int64) {
 | 
			
		||||
	n := binary.PutVarint(e.tmp[:], x)
 | 
			
		||||
	e.p = append(e.p, e.tmp[:n]...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *encoder) uint64(x uint64) {
 | 
			
		||||
	n := binary.PutUvarint(e.tmp[:], x)
 | 
			
		||||
	e.p = append(e.p, e.tmp[:n]...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *encoder) string(s string) {
 | 
			
		||||
	e.int(len(s))
 | 
			
		||||
	e.s = append(e.s, s...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *encoder) bytes(b []byte) {
 | 
			
		||||
	e.int(len(b))
 | 
			
		||||
	e.s = append(e.s, b...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *encoder) binding(bind Binding) {
 | 
			
		||||
	e.string(bind.Name)
 | 
			
		||||
	e.int(int(bind.Pos.Line))
 | 
			
		||||
	e.int(int(bind.Pos.Col))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *encoder) bindings(binds []Binding) {
 | 
			
		||||
	e.int(len(binds))
 | 
			
		||||
	for _, bind := range binds {
 | 
			
		||||
		e.binding(bind)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *encoder) function(fn *Funcode) {
 | 
			
		||||
	e.binding(Binding{fn.Name, fn.Pos})
 | 
			
		||||
	e.string(fn.Doc)
 | 
			
		||||
	e.bytes(fn.Code)
 | 
			
		||||
	e.int(len(fn.pclinetab))
 | 
			
		||||
	for _, x := range fn.pclinetab {
 | 
			
		||||
		e.int64(int64(x))
 | 
			
		||||
	}
 | 
			
		||||
	e.bindings(fn.Locals)
 | 
			
		||||
	e.int(len(fn.Cells))
 | 
			
		||||
	for _, index := range fn.Cells {
 | 
			
		||||
		e.int(index)
 | 
			
		||||
	}
 | 
			
		||||
	e.bindings(fn.Freevars)
 | 
			
		||||
	e.int(fn.MaxStack)
 | 
			
		||||
	e.int(fn.NumParams)
 | 
			
		||||
	e.int(fn.NumKwonlyParams)
 | 
			
		||||
	e.int(b2i(fn.HasVarargs))
 | 
			
		||||
	e.int(b2i(fn.HasKwargs))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func b2i(b bool) int {
 | 
			
		||||
	if b {
 | 
			
		||||
		return 1
 | 
			
		||||
	} else {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeProgram decodes a compiled Starlark program from data.
 | 
			
		||||
func DecodeProgram(data []byte) (_ *Program, err error) {
 | 
			
		||||
	if len(data) < len(magic) {
 | 
			
		||||
		return nil, fmt.Errorf("not a compiled module: no magic number")
 | 
			
		||||
	}
 | 
			
		||||
	if got := string(data[:4]); got != magic {
 | 
			
		||||
		return nil, fmt.Errorf("not a compiled module: got magic number %q, want %q",
 | 
			
		||||
			got, magic)
 | 
			
		||||
	}
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if x := recover(); x != nil {
 | 
			
		||||
			debugpkg.PrintStack()
 | 
			
		||||
			err = fmt.Errorf("internal error while decoding program: %v", x)
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	offset := binary.LittleEndian.Uint32(data[4:8])
 | 
			
		||||
	d := decoder{
 | 
			
		||||
		p: data[8:offset],
 | 
			
		||||
		s: append([]byte(nil), data[offset:]...), // allocate a copy, which will persist
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if v := d.int(); v != Version {
 | 
			
		||||
		return nil, fmt.Errorf("version mismatch: read %d, want %d", v, Version)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	filename := d.string()
 | 
			
		||||
	d.filename = &filename
 | 
			
		||||
 | 
			
		||||
	loads := d.bindings()
 | 
			
		||||
 | 
			
		||||
	names := make([]string, d.int())
 | 
			
		||||
	for i := range names {
 | 
			
		||||
		names[i] = d.string()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// constants
 | 
			
		||||
	constants := make([]interface{}, d.int())
 | 
			
		||||
	for i := range constants {
 | 
			
		||||
		var c interface{}
 | 
			
		||||
		switch d.int() {
 | 
			
		||||
		case 0:
 | 
			
		||||
			c = d.string()
 | 
			
		||||
		case 1:
 | 
			
		||||
			c = Bytes(d.string())
 | 
			
		||||
		case 2:
 | 
			
		||||
			c = d.int64()
 | 
			
		||||
		case 3:
 | 
			
		||||
			c = math.Float64frombits(d.uint64())
 | 
			
		||||
		case 4:
 | 
			
		||||
			c, _ = new(big.Int).SetString(d.string(), 10)
 | 
			
		||||
		}
 | 
			
		||||
		constants[i] = c
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	globals := d.bindings()
 | 
			
		||||
	toplevel := d.function()
 | 
			
		||||
	funcs := make([]*Funcode, d.int())
 | 
			
		||||
	for i := range funcs {
 | 
			
		||||
		funcs[i] = d.function()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	prog := &Program{
 | 
			
		||||
		Loads:     loads,
 | 
			
		||||
		Names:     names,
 | 
			
		||||
		Constants: constants,
 | 
			
		||||
		Globals:   globals,
 | 
			
		||||
		Functions: funcs,
 | 
			
		||||
		Toplevel:  toplevel,
 | 
			
		||||
	}
 | 
			
		||||
	toplevel.Prog = prog
 | 
			
		||||
	for _, f := range funcs {
 | 
			
		||||
		f.Prog = prog
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(d.p)+len(d.s) > 0 {
 | 
			
		||||
		return nil, fmt.Errorf("internal error: unconsumed data during decoding")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return prog, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type decoder struct {
 | 
			
		||||
	p        []byte  // encoded program
 | 
			
		||||
	s        []byte  // strings
 | 
			
		||||
	filename *string // (indirect to avoid keeping decoder live)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) int() int {
 | 
			
		||||
	return int(d.int64())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) int64() int64 {
 | 
			
		||||
	x, len := binary.Varint(d.p[:])
 | 
			
		||||
	d.p = d.p[len:]
 | 
			
		||||
	return x
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) uint64() uint64 {
 | 
			
		||||
	x, len := binary.Uvarint(d.p[:])
 | 
			
		||||
	d.p = d.p[len:]
 | 
			
		||||
	return x
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) string() (s string) {
 | 
			
		||||
	if slice := d.bytes(); len(slice) > 0 {
 | 
			
		||||
		// Avoid a memory allocation for each string
 | 
			
		||||
		// by unsafely aliasing slice.
 | 
			
		||||
		type string struct {
 | 
			
		||||
			data *byte
 | 
			
		||||
			len  int
 | 
			
		||||
		}
 | 
			
		||||
		ptr := (*string)(unsafe.Pointer(&s))
 | 
			
		||||
		ptr.data = &slice[0]
 | 
			
		||||
		ptr.len = len(slice)
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) bytes() []byte {
 | 
			
		||||
	len := d.int()
 | 
			
		||||
	r := d.s[:len:len]
 | 
			
		||||
	d.s = d.s[len:]
 | 
			
		||||
	return r
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) binding() Binding {
 | 
			
		||||
	name := d.string()
 | 
			
		||||
	line := int32(d.int())
 | 
			
		||||
	col := int32(d.int())
 | 
			
		||||
	return Binding{Name: name, Pos: syntax.MakePosition(d.filename, line, col)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) bindings() []Binding {
 | 
			
		||||
	bindings := make([]Binding, d.int())
 | 
			
		||||
	for i := range bindings {
 | 
			
		||||
		bindings[i] = d.binding()
 | 
			
		||||
	}
 | 
			
		||||
	return bindings
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) ints() []int {
 | 
			
		||||
	ints := make([]int, d.int())
 | 
			
		||||
	for i := range ints {
 | 
			
		||||
		ints[i] = d.int()
 | 
			
		||||
	}
 | 
			
		||||
	return ints
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) bool() bool { return d.int() != 0 }
 | 
			
		||||
 | 
			
		||||
func (d *decoder) function() *Funcode {
 | 
			
		||||
	id := d.binding()
 | 
			
		||||
	doc := d.string()
 | 
			
		||||
	code := d.bytes()
 | 
			
		||||
	pclinetab := make([]uint16, d.int())
 | 
			
		||||
	for i := range pclinetab {
 | 
			
		||||
		pclinetab[i] = uint16(d.int())
 | 
			
		||||
	}
 | 
			
		||||
	locals := d.bindings()
 | 
			
		||||
	cells := d.ints()
 | 
			
		||||
	freevars := d.bindings()
 | 
			
		||||
	maxStack := d.int()
 | 
			
		||||
	numParams := d.int()
 | 
			
		||||
	numKwonlyParams := d.int()
 | 
			
		||||
	hasVarargs := d.int() != 0
 | 
			
		||||
	hasKwargs := d.int() != 0
 | 
			
		||||
	return &Funcode{
 | 
			
		||||
		// Prog is filled in later.
 | 
			
		||||
		Pos:             id.Pos,
 | 
			
		||||
		Name:            id.Name,
 | 
			
		||||
		Doc:             doc,
 | 
			
		||||
		Code:            code,
 | 
			
		||||
		pclinetab:       pclinetab,
 | 
			
		||||
		Locals:          locals,
 | 
			
		||||
		Cells:           cells,
 | 
			
		||||
		Freevars:        freevars,
 | 
			
		||||
		MaxStack:        maxStack,
 | 
			
		||||
		NumParams:       numParams,
 | 
			
		||||
		NumKwonlyParams: numKwonlyParams,
 | 
			
		||||
		HasVarargs:      hasVarargs,
 | 
			
		||||
		HasKwargs:       hasKwargs,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										115
									
								
								vendor/go.starlark.net/internal/spell/spell.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										115
									
								
								vendor/go.starlark.net/internal/spell/spell.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,115 +0,0 @@
 | 
			
		||||
// Package spell file defines a simple spelling checker for use in attribute errors
 | 
			
		||||
// such as "no such field .foo; did you mean .food?".
 | 
			
		||||
package spell
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Nearest returns the element of candidates
 | 
			
		||||
// nearest to x using the Levenshtein metric,
 | 
			
		||||
// or "" if none were promising.
 | 
			
		||||
func Nearest(x string, candidates []string) string {
 | 
			
		||||
	// Ignore underscores and case when matching.
 | 
			
		||||
	fold := func(s string) string {
 | 
			
		||||
		return strings.Map(func(r rune) rune {
 | 
			
		||||
			if r == '_' {
 | 
			
		||||
				return -1
 | 
			
		||||
			}
 | 
			
		||||
			return unicode.ToLower(r)
 | 
			
		||||
		}, s)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	x = fold(x)
 | 
			
		||||
 | 
			
		||||
	var best string
 | 
			
		||||
	bestD := (len(x) + 1) / 2 // allow up to 50% typos
 | 
			
		||||
	for _, c := range candidates {
 | 
			
		||||
		d := levenshtein(x, fold(c), bestD)
 | 
			
		||||
		if d < bestD {
 | 
			
		||||
			bestD = d
 | 
			
		||||
			best = c
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return best
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// levenshtein returns the non-negative Levenshtein edit distance
 | 
			
		||||
// between the byte strings x and y.
 | 
			
		||||
//
 | 
			
		||||
// If the computed distance exceeds max,
 | 
			
		||||
// the function may return early with an approximate value > max.
 | 
			
		||||
func levenshtein(x, y string, max int) int {
 | 
			
		||||
	// This implementation is derived from one by Laurent Le Brun in
 | 
			
		||||
	// Bazel that uses the single-row space efficiency trick
 | 
			
		||||
	// described at bitbucket.org/clearer/iosifovich.
 | 
			
		||||
 | 
			
		||||
	// Let x be the shorter string.
 | 
			
		||||
	if len(x) > len(y) {
 | 
			
		||||
		x, y = y, x
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Remove common prefix.
 | 
			
		||||
	for i := 0; i < len(x); i++ {
 | 
			
		||||
		if x[i] != y[i] {
 | 
			
		||||
			x = x[i:]
 | 
			
		||||
			y = y[i:]
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if x == "" {
 | 
			
		||||
		return len(y)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if d := abs(len(x) - len(y)); d > max {
 | 
			
		||||
		return d // excessive length divergence
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	row := make([]int, len(y)+1)
 | 
			
		||||
	for i := range row {
 | 
			
		||||
		row[i] = i
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 1; i <= len(x); i++ {
 | 
			
		||||
		row[0] = i
 | 
			
		||||
		best := i
 | 
			
		||||
		prev := i - 1
 | 
			
		||||
		for j := 1; j <= len(y); j++ {
 | 
			
		||||
			a := prev + b2i(x[i-1] != y[j-1]) // substitution
 | 
			
		||||
			b := 1 + row[j-1]                 // deletion
 | 
			
		||||
			c := 1 + row[j]                   // insertion
 | 
			
		||||
			k := min(a, min(b, c))
 | 
			
		||||
			prev, row[j] = row[j], k
 | 
			
		||||
			best = min(best, k)
 | 
			
		||||
		}
 | 
			
		||||
		if best > max {
 | 
			
		||||
			return best
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return row[len(y)]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func b2i(b bool) int {
 | 
			
		||||
	if b {
 | 
			
		||||
		return 1
 | 
			
		||||
	} else {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func min(x, y int) int {
 | 
			
		||||
	if x < y {
 | 
			
		||||
		return x
 | 
			
		||||
	} else {
 | 
			
		||||
		return y
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func abs(x int) int {
 | 
			
		||||
	if x >= 0 {
 | 
			
		||||
		return x
 | 
			
		||||
	} else {
 | 
			
		||||
		return -x
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								vendor/go.starlark.net/resolve/binding.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										74
									
								
								vendor/go.starlark.net/resolve/binding.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,74 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package resolve
 | 
			
		||||
 | 
			
		||||
import "go.starlark.net/syntax"
 | 
			
		||||
 | 
			
		||||
// This file defines resolver data types saved in the syntax tree.
 | 
			
		||||
// We cannot guarantee API stability for these types
 | 
			
		||||
// as they are closely tied to the implementation.
 | 
			
		||||
 | 
			
		||||
// A Binding contains resolver information about an identifer.
 | 
			
		||||
// The resolver populates the Binding field of each syntax.Identifier.
 | 
			
		||||
// The Binding ties together all identifiers that denote the same variable.
 | 
			
		||||
type Binding struct {
 | 
			
		||||
	Scope Scope
 | 
			
		||||
 | 
			
		||||
	// Index records the index into the enclosing
 | 
			
		||||
	// - {DefStmt,File}.Locals, if Scope==Local
 | 
			
		||||
	// - DefStmt.FreeVars,      if Scope==Free
 | 
			
		||||
	// - File.Globals,          if Scope==Global.
 | 
			
		||||
	// It is zero if Scope is Predeclared, Universal, or Undefined.
 | 
			
		||||
	Index int
 | 
			
		||||
 | 
			
		||||
	First *syntax.Ident // first binding use (iff Scope==Local/Free/Global)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The Scope of Binding indicates what kind of scope it has.
 | 
			
		||||
type Scope uint8
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	Undefined   Scope = iota // name is not defined
 | 
			
		||||
	Local                    // name is local to its function or file
 | 
			
		||||
	Cell                     // name is function-local but shared with a nested function
 | 
			
		||||
	Free                     // name is cell of some enclosing function
 | 
			
		||||
	Global                   // name is global to module
 | 
			
		||||
	Predeclared              // name is predeclared for this module (e.g. glob)
 | 
			
		||||
	Universal                // name is universal (e.g. len)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var scopeNames = [...]string{
 | 
			
		||||
	Undefined:   "undefined",
 | 
			
		||||
	Local:       "local",
 | 
			
		||||
	Cell:        "cell",
 | 
			
		||||
	Free:        "free",
 | 
			
		||||
	Global:      "global",
 | 
			
		||||
	Predeclared: "predeclared",
 | 
			
		||||
	Universal:   "universal",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (scope Scope) String() string { return scopeNames[scope] }
 | 
			
		||||
 | 
			
		||||
// A Module contains resolver information about a file.
 | 
			
		||||
// The resolver populates the Module field of each syntax.File.
 | 
			
		||||
type Module struct {
 | 
			
		||||
	Locals  []*Binding // the file's (comprehension-)local variables
 | 
			
		||||
	Globals []*Binding // the file's global variables
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Function contains resolver information about a named or anonymous function.
 | 
			
		||||
// The resolver populates the Function field of each syntax.DefStmt and syntax.LambdaExpr.
 | 
			
		||||
type Function struct {
 | 
			
		||||
	Pos    syntax.Position // of DEF or LAMBDA
 | 
			
		||||
	Name   string          // name of def, or "lambda"
 | 
			
		||||
	Params []syntax.Expr   // param = ident | ident=expr | * | *ident | **ident
 | 
			
		||||
	Body   []syntax.Stmt   // contains synthetic 'return expr' for lambda
 | 
			
		||||
 | 
			
		||||
	HasVarargs      bool       // whether params includes *args (convenience)
 | 
			
		||||
	HasKwargs       bool       // whether params includes **kwargs (convenience)
 | 
			
		||||
	NumKwonlyParams int        // number of keyword-only optional parameters
 | 
			
		||||
	Locals          []*Binding // this function's local/cell variables, parameters first
 | 
			
		||||
	FreeVars        []*Binding // enclosing cells to capture in closure
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										969
									
								
								vendor/go.starlark.net/resolve/resolve.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										969
									
								
								vendor/go.starlark.net/resolve/resolve.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,969 +0,0 @@
 | 
			
		||||
// Copyright 2017 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package resolve defines a name-resolution pass for Starlark abstract
 | 
			
		||||
// syntax trees.
 | 
			
		||||
//
 | 
			
		||||
// The resolver sets the Locals and FreeVars arrays of each DefStmt and
 | 
			
		||||
// the LocalIndex field of each syntax.Ident that refers to a local or
 | 
			
		||||
// free variable.  It also sets the Locals array of a File for locals
 | 
			
		||||
// bound by top-level comprehensions and load statements.
 | 
			
		||||
// Identifiers for global variables do not get an index.
 | 
			
		||||
package resolve // import "go.starlark.net/resolve"
 | 
			
		||||
 | 
			
		||||
// All references to names are statically resolved.  Names may be
 | 
			
		||||
// predeclared, global, or local to a function or file.
 | 
			
		||||
// File-local variables include those bound by top-level comprehensions
 | 
			
		||||
// and by load statements. ("Top-level" means "outside of any function".)
 | 
			
		||||
// The resolver maps each global name to a small integer and each local
 | 
			
		||||
// name to a small integer; these integers enable a fast and compact
 | 
			
		||||
// representation of globals and locals in the evaluator.
 | 
			
		||||
//
 | 
			
		||||
// As an optimization, the resolver classifies each predeclared name as
 | 
			
		||||
// either universal (e.g. None, len) or per-module (e.g. glob in Bazel's
 | 
			
		||||
// build language), enabling the evaluator to share the representation
 | 
			
		||||
// of the universal environment across all modules.
 | 
			
		||||
//
 | 
			
		||||
// The lexical environment is a tree of blocks with the file block at
 | 
			
		||||
// its root. The file's child blocks may be of two kinds: functions
 | 
			
		||||
// and comprehensions, and these may have further children of either
 | 
			
		||||
// kind.
 | 
			
		||||
//
 | 
			
		||||
// Python-style resolution requires multiple passes because a name is
 | 
			
		||||
// determined to be local to a function only if the function contains a
 | 
			
		||||
// "binding" use of it; similarly, a name is determined to be global (as
 | 
			
		||||
// opposed to predeclared) if the module contains a top-level binding use.
 | 
			
		||||
// Unlike ordinary top-level assignments, the bindings created by load
 | 
			
		||||
// statements are local to the file block.
 | 
			
		||||
// A non-binding use may lexically precede the binding to which it is resolved.
 | 
			
		||||
// In the first pass, we inspect each function, recording in
 | 
			
		||||
// 'uses' each identifier and the environment block in which it occurs.
 | 
			
		||||
// If a use of a name is binding, such as a function parameter or
 | 
			
		||||
// assignment, we add the name to the block's bindings mapping and add a
 | 
			
		||||
// local variable to the enclosing function.
 | 
			
		||||
//
 | 
			
		||||
// As we finish resolving each function, we inspect all the uses within
 | 
			
		||||
// that function and discard ones that were found to be function-local. The
 | 
			
		||||
// remaining ones must be either free (local to some lexically enclosing
 | 
			
		||||
// function), or top-level (global, predeclared, or file-local), but we cannot tell
 | 
			
		||||
// which until we have finished inspecting the outermost enclosing
 | 
			
		||||
// function. At that point, we can distinguish local from top-level names
 | 
			
		||||
// (and this is when Python would compute free variables).
 | 
			
		||||
//
 | 
			
		||||
// However, Starlark additionally requires that all references to global
 | 
			
		||||
// names are satisfied by some declaration in the current module;
 | 
			
		||||
// Starlark permits a function to forward-reference a global or file-local
 | 
			
		||||
// that has not
 | 
			
		||||
// been declared yet so long as it is declared before the end of the
 | 
			
		||||
// module.  So, instead of re-resolving the unresolved references after
 | 
			
		||||
// each top-level function, we defer this until the end of the module
 | 
			
		||||
// and ensure that all such references are satisfied by some definition.
 | 
			
		||||
//
 | 
			
		||||
// At the end of the module, we visit each of the nested function blocks
 | 
			
		||||
// in bottom-up order, doing a recursive lexical lookup for each
 | 
			
		||||
// unresolved name.  If the name is found to be local to some enclosing
 | 
			
		||||
// function, we must create a DefStmt.FreeVar (capture) parameter for
 | 
			
		||||
// each intervening function.  We enter these synthetic bindings into
 | 
			
		||||
// the bindings map so that we create at most one freevar per name.  If
 | 
			
		||||
// the name was not local, we check that it was defined at module level.
 | 
			
		||||
//
 | 
			
		||||
// We resolve all uses of locals in the module (due to load statements
 | 
			
		||||
// and comprehensions) in a similar way and compute the file's set of
 | 
			
		||||
// local variables.
 | 
			
		||||
//
 | 
			
		||||
// Starlark enforces that all global names are assigned at most once on
 | 
			
		||||
// all control flow paths by forbidding if/else statements and loops at
 | 
			
		||||
// top level. A global may be used before it is defined, leading to a
 | 
			
		||||
// dynamic error. However, the AllowGlobalReassign flag (really: allow
 | 
			
		||||
// top-level reassign) makes the resolver allow multiple to a variable
 | 
			
		||||
// at top-level. It also allows if-, for-, and while-loops at top-level,
 | 
			
		||||
// which in turn may make the evaluator dynamically assign multiple
 | 
			
		||||
// values to a variable at top-level. (These two roles should be separated.)
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/internal/spell"
 | 
			
		||||
	"go.starlark.net/syntax"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const debug = false
 | 
			
		||||
const doesnt = "this Starlark dialect does not "
 | 
			
		||||
 | 
			
		||||
// global options
 | 
			
		||||
// These features are either not standard Starlark (yet), or deprecated
 | 
			
		||||
// features of the BUILD language, so we put them behind flags.
 | 
			
		||||
var (
 | 
			
		||||
	AllowSet            = false // allow the 'set' built-in
 | 
			
		||||
	AllowGlobalReassign = false // allow reassignment to top-level names; also, allow if/for/while at top-level
 | 
			
		||||
	AllowRecursion      = false // allow while statements and recursive functions
 | 
			
		||||
	LoadBindsGlobally   = false // load creates global not file-local bindings (deprecated)
 | 
			
		||||
 | 
			
		||||
	// obsolete flags for features that are now standard. No effect.
 | 
			
		||||
	AllowNestedDef = true
 | 
			
		||||
	AllowLambda    = true
 | 
			
		||||
	AllowFloat     = true
 | 
			
		||||
	AllowBitwise   = true
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// File resolves the specified file and records information about the
 | 
			
		||||
// module in file.Module.
 | 
			
		||||
//
 | 
			
		||||
// The isPredeclared and isUniversal predicates report whether a name is
 | 
			
		||||
// a pre-declared identifier (visible in the current module) or a
 | 
			
		||||
// universal identifier (visible in every module).
 | 
			
		||||
// Clients should typically pass predeclared.Has for the first and
 | 
			
		||||
// starlark.Universe.Has for the second, where predeclared is the
 | 
			
		||||
// module's StringDict of predeclared names and starlark.Universe is the
 | 
			
		||||
// standard set of built-ins.
 | 
			
		||||
// The isUniverse predicate is supplied a parameter to avoid a cyclic
 | 
			
		||||
// dependency upon starlark.Universe, not because users should ever need
 | 
			
		||||
// to redefine it.
 | 
			
		||||
func File(file *syntax.File, isPredeclared, isUniversal func(name string) bool) error {
 | 
			
		||||
	return REPLChunk(file, nil, isPredeclared, isUniversal)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// REPLChunk is a generalization of the File function that supports a
 | 
			
		||||
// non-empty initial global block, as occurs in a REPL.
 | 
			
		||||
func REPLChunk(file *syntax.File, isGlobal, isPredeclared, isUniversal func(name string) bool) error {
 | 
			
		||||
	r := newResolver(isGlobal, isPredeclared, isUniversal)
 | 
			
		||||
	r.stmts(file.Stmts)
 | 
			
		||||
 | 
			
		||||
	r.env.resolveLocalUses()
 | 
			
		||||
 | 
			
		||||
	// At the end of the module, resolve all non-local variable references,
 | 
			
		||||
	// computing closures.
 | 
			
		||||
	// Function bodies may contain forward references to later global declarations.
 | 
			
		||||
	r.resolveNonLocalUses(r.env)
 | 
			
		||||
 | 
			
		||||
	file.Module = &Module{
 | 
			
		||||
		Locals:  r.moduleLocals,
 | 
			
		||||
		Globals: r.moduleGlobals,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(r.errors) > 0 {
 | 
			
		||||
		return r.errors
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Expr resolves the specified expression.
 | 
			
		||||
// It returns the local variables bound within the expression.
 | 
			
		||||
//
 | 
			
		||||
// The isPredeclared and isUniversal predicates behave as for the File function.
 | 
			
		||||
func Expr(expr syntax.Expr, isPredeclared, isUniversal func(name string) bool) ([]*Binding, error) {
 | 
			
		||||
	r := newResolver(nil, isPredeclared, isUniversal)
 | 
			
		||||
	r.expr(expr)
 | 
			
		||||
	r.env.resolveLocalUses()
 | 
			
		||||
	r.resolveNonLocalUses(r.env) // globals & universals
 | 
			
		||||
	if len(r.errors) > 0 {
 | 
			
		||||
		return nil, r.errors
 | 
			
		||||
	}
 | 
			
		||||
	return r.moduleLocals, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An ErrorList is a non-empty list of resolver error messages.
 | 
			
		||||
type ErrorList []Error // len > 0
 | 
			
		||||
 | 
			
		||||
func (e ErrorList) Error() string { return e[0].Error() }
 | 
			
		||||
 | 
			
		||||
// An Error describes the nature and position of a resolver error.
 | 
			
		||||
type Error struct {
 | 
			
		||||
	Pos syntax.Position
 | 
			
		||||
	Msg string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e Error) Error() string { return e.Pos.String() + ": " + e.Msg }
 | 
			
		||||
 | 
			
		||||
func newResolver(isGlobal, isPredeclared, isUniversal func(name string) bool) *resolver {
 | 
			
		||||
	file := new(block)
 | 
			
		||||
	return &resolver{
 | 
			
		||||
		file:          file,
 | 
			
		||||
		env:           file,
 | 
			
		||||
		isGlobal:      isGlobal,
 | 
			
		||||
		isPredeclared: isPredeclared,
 | 
			
		||||
		isUniversal:   isUniversal,
 | 
			
		||||
		globals:       make(map[string]*Binding),
 | 
			
		||||
		predeclared:   make(map[string]*Binding),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type resolver struct {
 | 
			
		||||
	// env is the current local environment:
 | 
			
		||||
	// a linked list of blocks, innermost first.
 | 
			
		||||
	// The tail of the list is the file block.
 | 
			
		||||
	env  *block
 | 
			
		||||
	file *block // file block (contains load bindings)
 | 
			
		||||
 | 
			
		||||
	// moduleLocals contains the local variables of the module
 | 
			
		||||
	// (due to load statements and comprehensions outside any function).
 | 
			
		||||
	// moduleGlobals contains the global variables of the module.
 | 
			
		||||
	moduleLocals  []*Binding
 | 
			
		||||
	moduleGlobals []*Binding
 | 
			
		||||
 | 
			
		||||
	// globals maps each global name in the module to its binding.
 | 
			
		||||
	// predeclared does the same for predeclared and universal names.
 | 
			
		||||
	globals     map[string]*Binding
 | 
			
		||||
	predeclared map[string]*Binding
 | 
			
		||||
 | 
			
		||||
	// These predicates report whether a name is
 | 
			
		||||
	// pre-declared, either in this module or universally,
 | 
			
		||||
	// or already declared in the module globals (as in a REPL).
 | 
			
		||||
	// isGlobal may be nil.
 | 
			
		||||
	isGlobal, isPredeclared, isUniversal func(name string) bool
 | 
			
		||||
 | 
			
		||||
	loops   int // number of enclosing for/while loops
 | 
			
		||||
	ifstmts int // number of enclosing if statements loops
 | 
			
		||||
 | 
			
		||||
	errors ErrorList
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// container returns the innermost enclosing "container" block:
 | 
			
		||||
// a function (function != nil) or file (function == nil).
 | 
			
		||||
// Container blocks accumulate local variable bindings.
 | 
			
		||||
func (r *resolver) container() *block {
 | 
			
		||||
	for b := r.env; ; b = b.parent {
 | 
			
		||||
		if b.function != nil || b == r.file {
 | 
			
		||||
			return b
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) push(b *block) {
 | 
			
		||||
	r.env.children = append(r.env.children, b)
 | 
			
		||||
	b.parent = r.env
 | 
			
		||||
	r.env = b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) pop() { r.env = r.env.parent }
 | 
			
		||||
 | 
			
		||||
type block struct {
 | 
			
		||||
	parent *block // nil for file block
 | 
			
		||||
 | 
			
		||||
	// In the file (root) block, both these fields are nil.
 | 
			
		||||
	function *Function             // only for function blocks
 | 
			
		||||
	comp     *syntax.Comprehension // only for comprehension blocks
 | 
			
		||||
 | 
			
		||||
	// bindings maps a name to its binding.
 | 
			
		||||
	// A local binding has an index into its innermost enclosing container's locals array.
 | 
			
		||||
	// A free binding has an index into its innermost enclosing function's freevars array.
 | 
			
		||||
	bindings map[string]*Binding
 | 
			
		||||
 | 
			
		||||
	// children records the child blocks of the current one.
 | 
			
		||||
	children []*block
 | 
			
		||||
 | 
			
		||||
	// uses records all identifiers seen in this container (function or file),
 | 
			
		||||
	// and a reference to the environment in which they appear.
 | 
			
		||||
	// As we leave each container block, we resolve them,
 | 
			
		||||
	// so that only free and global ones remain.
 | 
			
		||||
	// At the end of each top-level function we compute closures.
 | 
			
		||||
	uses []use
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *block) bind(name string, bind *Binding) {
 | 
			
		||||
	if b.bindings == nil {
 | 
			
		||||
		b.bindings = make(map[string]*Binding)
 | 
			
		||||
	}
 | 
			
		||||
	b.bindings[name] = bind
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *block) String() string {
 | 
			
		||||
	if b.function != nil {
 | 
			
		||||
		return "function block at " + fmt.Sprint(b.function.Pos)
 | 
			
		||||
	}
 | 
			
		||||
	if b.comp != nil {
 | 
			
		||||
		return "comprehension block at " + fmt.Sprint(b.comp.Span())
 | 
			
		||||
	}
 | 
			
		||||
	return "file block"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) errorf(posn syntax.Position, format string, args ...interface{}) {
 | 
			
		||||
	r.errors = append(r.errors, Error{posn, fmt.Sprintf(format, args...)})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A use records an identifier and the environment in which it appears.
 | 
			
		||||
type use struct {
 | 
			
		||||
	id  *syntax.Ident
 | 
			
		||||
	env *block
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// bind creates a binding for id: a global (not file-local)
 | 
			
		||||
// binding at top-level, a local binding otherwise.
 | 
			
		||||
// At top-level, it reports an error if a global or file-local
 | 
			
		||||
// binding already exists, unless AllowGlobalReassign.
 | 
			
		||||
// It sets id.Binding to the binding (whether old or new),
 | 
			
		||||
// and returns whether a binding already existed.
 | 
			
		||||
func (r *resolver) bind(id *syntax.Ident) bool {
 | 
			
		||||
	// Binding outside any local (comprehension/function) block?
 | 
			
		||||
	if r.env == r.file {
 | 
			
		||||
		bind, ok := r.file.bindings[id.Name]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			bind, ok = r.globals[id.Name]
 | 
			
		||||
			if !ok {
 | 
			
		||||
				// first global binding of this name
 | 
			
		||||
				bind = &Binding{
 | 
			
		||||
					First: id,
 | 
			
		||||
					Scope: Global,
 | 
			
		||||
					Index: len(r.moduleGlobals),
 | 
			
		||||
				}
 | 
			
		||||
				r.globals[id.Name] = bind
 | 
			
		||||
				r.moduleGlobals = append(r.moduleGlobals, bind)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if ok && !AllowGlobalReassign {
 | 
			
		||||
			r.errorf(id.NamePos, "cannot reassign %s %s declared at %s",
 | 
			
		||||
				bind.Scope, id.Name, bind.First.NamePos)
 | 
			
		||||
		}
 | 
			
		||||
		id.Binding = bind
 | 
			
		||||
		return ok
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r.bindLocal(id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) bindLocal(id *syntax.Ident) bool {
 | 
			
		||||
	// Mark this name as local to current block.
 | 
			
		||||
	// Assign it a new local (positive) index in the current container.
 | 
			
		||||
	_, ok := r.env.bindings[id.Name]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		var locals *[]*Binding
 | 
			
		||||
		if fn := r.container().function; fn != nil {
 | 
			
		||||
			locals = &fn.Locals
 | 
			
		||||
		} else {
 | 
			
		||||
			locals = &r.moduleLocals
 | 
			
		||||
		}
 | 
			
		||||
		bind := &Binding{
 | 
			
		||||
			First: id,
 | 
			
		||||
			Scope: Local,
 | 
			
		||||
			Index: len(*locals),
 | 
			
		||||
		}
 | 
			
		||||
		r.env.bind(id.Name, bind)
 | 
			
		||||
		*locals = append(*locals, bind)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	r.use(id)
 | 
			
		||||
	return ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) use(id *syntax.Ident) {
 | 
			
		||||
	use := use{id, r.env}
 | 
			
		||||
 | 
			
		||||
	// The spec says that if there is a global binding of a name
 | 
			
		||||
	// then all references to that name in that block refer to the
 | 
			
		||||
	// global, even if the use precedes the def---just as for locals.
 | 
			
		||||
	// For example, in this code,
 | 
			
		||||
	//
 | 
			
		||||
	//   print(len); len=1; print(len)
 | 
			
		||||
	//
 | 
			
		||||
	// both occurrences of len refer to the len=1 binding, which
 | 
			
		||||
	// completely shadows the predeclared len function.
 | 
			
		||||
	//
 | 
			
		||||
	// The rationale for these semantics, which differ from Python,
 | 
			
		||||
	// is that the static meaning of len (a reference to a global)
 | 
			
		||||
	// does not change depending on where it appears in the file.
 | 
			
		||||
	// Of course, its dynamic meaning does change, from an error
 | 
			
		||||
	// into a valid reference, so it's not clear these semantics
 | 
			
		||||
	// have any practical advantage.
 | 
			
		||||
	//
 | 
			
		||||
	// In any case, the Bazel implementation lags behind the spec
 | 
			
		||||
	// and follows Python behavior, so the first use of len refers
 | 
			
		||||
	// to the predeclared function.  This typically used in a BUILD
 | 
			
		||||
	// file that redefines a predeclared name half way through,
 | 
			
		||||
	// for example:
 | 
			
		||||
	//
 | 
			
		||||
	//	proto_library(...) 			# built-in rule
 | 
			
		||||
	//      load("myproto.bzl", "proto_library")
 | 
			
		||||
	//	proto_library(...) 			# user-defined rule
 | 
			
		||||
	//
 | 
			
		||||
	// We will piggyback support for the legacy semantics on the
 | 
			
		||||
	// AllowGlobalReassign flag, which is loosely related and also
 | 
			
		||||
	// required for Bazel.
 | 
			
		||||
	if AllowGlobalReassign && r.env == r.file {
 | 
			
		||||
		r.useToplevel(use)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	b := r.container()
 | 
			
		||||
	b.uses = append(b.uses, use)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// useToplevel resolves use.id as a reference to a name visible at top-level.
 | 
			
		||||
// The use.env field captures the original environment for error reporting.
 | 
			
		||||
func (r *resolver) useToplevel(use use) (bind *Binding) {
 | 
			
		||||
	id := use.id
 | 
			
		||||
 | 
			
		||||
	if prev, ok := r.file.bindings[id.Name]; ok {
 | 
			
		||||
		// use of load-defined name in file block
 | 
			
		||||
		bind = prev
 | 
			
		||||
	} else if prev, ok := r.globals[id.Name]; ok {
 | 
			
		||||
		// use of global declared by module
 | 
			
		||||
		bind = prev
 | 
			
		||||
	} else if r.isGlobal != nil && r.isGlobal(id.Name) {
 | 
			
		||||
		// use of global defined in a previous REPL chunk
 | 
			
		||||
		bind = &Binding{
 | 
			
		||||
			First: id, // wrong: this is not even a binding use
 | 
			
		||||
			Scope: Global,
 | 
			
		||||
			Index: len(r.moduleGlobals),
 | 
			
		||||
		}
 | 
			
		||||
		r.globals[id.Name] = bind
 | 
			
		||||
		r.moduleGlobals = append(r.moduleGlobals, bind)
 | 
			
		||||
	} else if prev, ok := r.predeclared[id.Name]; ok {
 | 
			
		||||
		// repeated use of predeclared or universal
 | 
			
		||||
		bind = prev
 | 
			
		||||
	} else if r.isPredeclared(id.Name) {
 | 
			
		||||
		// use of pre-declared name
 | 
			
		||||
		bind = &Binding{Scope: Predeclared}
 | 
			
		||||
		r.predeclared[id.Name] = bind // save it
 | 
			
		||||
	} else if r.isUniversal(id.Name) {
 | 
			
		||||
		// use of universal name
 | 
			
		||||
		if !AllowSet && id.Name == "set" {
 | 
			
		||||
			r.errorf(id.NamePos, doesnt+"support sets")
 | 
			
		||||
		}
 | 
			
		||||
		bind = &Binding{Scope: Universal}
 | 
			
		||||
		r.predeclared[id.Name] = bind // save it
 | 
			
		||||
	} else {
 | 
			
		||||
		bind = &Binding{Scope: Undefined}
 | 
			
		||||
		var hint string
 | 
			
		||||
		if n := r.spellcheck(use); n != "" {
 | 
			
		||||
			hint = fmt.Sprintf(" (did you mean %s?)", n)
 | 
			
		||||
		}
 | 
			
		||||
		r.errorf(id.NamePos, "undefined: %s%s", id.Name, hint)
 | 
			
		||||
	}
 | 
			
		||||
	id.Binding = bind
 | 
			
		||||
	return bind
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// spellcheck returns the most likely misspelling of
 | 
			
		||||
// the name use.id in the environment use.env.
 | 
			
		||||
func (r *resolver) spellcheck(use use) string {
 | 
			
		||||
	var names []string
 | 
			
		||||
 | 
			
		||||
	// locals
 | 
			
		||||
	for b := use.env; b != nil; b = b.parent {
 | 
			
		||||
		for name := range b.bindings {
 | 
			
		||||
			names = append(names, name)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// globals
 | 
			
		||||
	//
 | 
			
		||||
	// We have no way to enumerate the sets whose membership
 | 
			
		||||
	// tests are isPredeclared, isUniverse, and isGlobal,
 | 
			
		||||
	// which includes prior names in the REPL session.
 | 
			
		||||
	for _, bind := range r.moduleGlobals {
 | 
			
		||||
		names = append(names, bind.First.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sort.Strings(names)
 | 
			
		||||
	return spell.Nearest(use.id.Name, names)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// resolveLocalUses is called when leaving a container (function/module)
 | 
			
		||||
// block.  It resolves all uses of locals/cells within that block.
 | 
			
		||||
func (b *block) resolveLocalUses() {
 | 
			
		||||
	unresolved := b.uses[:0]
 | 
			
		||||
	for _, use := range b.uses {
 | 
			
		||||
		if bind := lookupLocal(use); bind != nil && (bind.Scope == Local || bind.Scope == Cell) {
 | 
			
		||||
			use.id.Binding = bind
 | 
			
		||||
		} else {
 | 
			
		||||
			unresolved = append(unresolved, use)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	b.uses = unresolved
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) stmts(stmts []syntax.Stmt) {
 | 
			
		||||
	for _, stmt := range stmts {
 | 
			
		||||
		r.stmt(stmt)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) stmt(stmt syntax.Stmt) {
 | 
			
		||||
	switch stmt := stmt.(type) {
 | 
			
		||||
	case *syntax.ExprStmt:
 | 
			
		||||
		r.expr(stmt.X)
 | 
			
		||||
 | 
			
		||||
	case *syntax.BranchStmt:
 | 
			
		||||
		if r.loops == 0 && (stmt.Token == syntax.BREAK || stmt.Token == syntax.CONTINUE) {
 | 
			
		||||
			r.errorf(stmt.TokenPos, "%s not in a loop", stmt.Token)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.IfStmt:
 | 
			
		||||
		if !AllowGlobalReassign && r.container().function == nil {
 | 
			
		||||
			r.errorf(stmt.If, "if statement not within a function")
 | 
			
		||||
		}
 | 
			
		||||
		r.expr(stmt.Cond)
 | 
			
		||||
		r.ifstmts++
 | 
			
		||||
		r.stmts(stmt.True)
 | 
			
		||||
		r.stmts(stmt.False)
 | 
			
		||||
		r.ifstmts--
 | 
			
		||||
 | 
			
		||||
	case *syntax.AssignStmt:
 | 
			
		||||
		r.expr(stmt.RHS)
 | 
			
		||||
		isAugmented := stmt.Op != syntax.EQ
 | 
			
		||||
		r.assign(stmt.LHS, isAugmented)
 | 
			
		||||
 | 
			
		||||
	case *syntax.DefStmt:
 | 
			
		||||
		r.bind(stmt.Name)
 | 
			
		||||
		fn := &Function{
 | 
			
		||||
			Name:   stmt.Name.Name,
 | 
			
		||||
			Pos:    stmt.Def,
 | 
			
		||||
			Params: stmt.Params,
 | 
			
		||||
			Body:   stmt.Body,
 | 
			
		||||
		}
 | 
			
		||||
		stmt.Function = fn
 | 
			
		||||
		r.function(fn, stmt.Def)
 | 
			
		||||
 | 
			
		||||
	case *syntax.ForStmt:
 | 
			
		||||
		if !AllowGlobalReassign && r.container().function == nil {
 | 
			
		||||
			r.errorf(stmt.For, "for loop not within a function")
 | 
			
		||||
		}
 | 
			
		||||
		r.expr(stmt.X)
 | 
			
		||||
		const isAugmented = false
 | 
			
		||||
		r.assign(stmt.Vars, isAugmented)
 | 
			
		||||
		r.loops++
 | 
			
		||||
		r.stmts(stmt.Body)
 | 
			
		||||
		r.loops--
 | 
			
		||||
 | 
			
		||||
	case *syntax.WhileStmt:
 | 
			
		||||
		if !AllowRecursion {
 | 
			
		||||
			r.errorf(stmt.While, doesnt+"support while loops")
 | 
			
		||||
		}
 | 
			
		||||
		if !AllowGlobalReassign && r.container().function == nil {
 | 
			
		||||
			r.errorf(stmt.While, "while loop not within a function")
 | 
			
		||||
		}
 | 
			
		||||
		r.expr(stmt.Cond)
 | 
			
		||||
		r.loops++
 | 
			
		||||
		r.stmts(stmt.Body)
 | 
			
		||||
		r.loops--
 | 
			
		||||
 | 
			
		||||
	case *syntax.ReturnStmt:
 | 
			
		||||
		if r.container().function == nil {
 | 
			
		||||
			r.errorf(stmt.Return, "return statement not within a function")
 | 
			
		||||
		}
 | 
			
		||||
		if stmt.Result != nil {
 | 
			
		||||
			r.expr(stmt.Result)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.LoadStmt:
 | 
			
		||||
		// A load statement may not be nested in any other statement.
 | 
			
		||||
		if r.container().function != nil {
 | 
			
		||||
			r.errorf(stmt.Load, "load statement within a function")
 | 
			
		||||
		} else if r.loops > 0 {
 | 
			
		||||
			r.errorf(stmt.Load, "load statement within a loop")
 | 
			
		||||
		} else if r.ifstmts > 0 {
 | 
			
		||||
			r.errorf(stmt.Load, "load statement within a conditional")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for i, from := range stmt.From {
 | 
			
		||||
			if from.Name == "" {
 | 
			
		||||
				r.errorf(from.NamePos, "load: empty identifier")
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if from.Name[0] == '_' {
 | 
			
		||||
				r.errorf(from.NamePos, "load: names with leading underscores are not exported: %s", from.Name)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			id := stmt.To[i]
 | 
			
		||||
			if LoadBindsGlobally {
 | 
			
		||||
				r.bind(id)
 | 
			
		||||
			} else if r.bindLocal(id) && !AllowGlobalReassign {
 | 
			
		||||
				// "Global" in AllowGlobalReassign is a misnomer for "toplevel".
 | 
			
		||||
				// Sadly we can't report the previous declaration
 | 
			
		||||
				// as id.Binding may not be set yet.
 | 
			
		||||
				r.errorf(id.NamePos, "cannot reassign top-level %s", id.Name)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		log.Panicf("unexpected stmt %T", stmt)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) assign(lhs syntax.Expr, isAugmented bool) {
 | 
			
		||||
	switch lhs := lhs.(type) {
 | 
			
		||||
	case *syntax.Ident:
 | 
			
		||||
		// x = ...
 | 
			
		||||
		r.bind(lhs)
 | 
			
		||||
 | 
			
		||||
	case *syntax.IndexExpr:
 | 
			
		||||
		// x[i] = ...
 | 
			
		||||
		r.expr(lhs.X)
 | 
			
		||||
		r.expr(lhs.Y)
 | 
			
		||||
 | 
			
		||||
	case *syntax.DotExpr:
 | 
			
		||||
		// x.f = ...
 | 
			
		||||
		r.expr(lhs.X)
 | 
			
		||||
 | 
			
		||||
	case *syntax.TupleExpr:
 | 
			
		||||
		// (x, y) = ...
 | 
			
		||||
		if isAugmented {
 | 
			
		||||
			r.errorf(syntax.Start(lhs), "can't use tuple expression in augmented assignment")
 | 
			
		||||
		}
 | 
			
		||||
		for _, elem := range lhs.List {
 | 
			
		||||
			r.assign(elem, isAugmented)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.ListExpr:
 | 
			
		||||
		// [x, y, z] = ...
 | 
			
		||||
		if isAugmented {
 | 
			
		||||
			r.errorf(syntax.Start(lhs), "can't use list expression in augmented assignment")
 | 
			
		||||
		}
 | 
			
		||||
		for _, elem := range lhs.List {
 | 
			
		||||
			r.assign(elem, isAugmented)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.ParenExpr:
 | 
			
		||||
		r.assign(lhs.X, isAugmented)
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		name := strings.ToLower(strings.TrimPrefix(fmt.Sprintf("%T", lhs), "*syntax."))
 | 
			
		||||
		r.errorf(syntax.Start(lhs), "can't assign to %s", name)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) expr(e syntax.Expr) {
 | 
			
		||||
	switch e := e.(type) {
 | 
			
		||||
	case *syntax.Ident:
 | 
			
		||||
		r.use(e)
 | 
			
		||||
 | 
			
		||||
	case *syntax.Literal:
 | 
			
		||||
 | 
			
		||||
	case *syntax.ListExpr:
 | 
			
		||||
		for _, x := range e.List {
 | 
			
		||||
			r.expr(x)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.CondExpr:
 | 
			
		||||
		r.expr(e.Cond)
 | 
			
		||||
		r.expr(e.True)
 | 
			
		||||
		r.expr(e.False)
 | 
			
		||||
 | 
			
		||||
	case *syntax.IndexExpr:
 | 
			
		||||
		r.expr(e.X)
 | 
			
		||||
		r.expr(e.Y)
 | 
			
		||||
 | 
			
		||||
	case *syntax.DictEntry:
 | 
			
		||||
		r.expr(e.Key)
 | 
			
		||||
		r.expr(e.Value)
 | 
			
		||||
 | 
			
		||||
	case *syntax.SliceExpr:
 | 
			
		||||
		r.expr(e.X)
 | 
			
		||||
		if e.Lo != nil {
 | 
			
		||||
			r.expr(e.Lo)
 | 
			
		||||
		}
 | 
			
		||||
		if e.Hi != nil {
 | 
			
		||||
			r.expr(e.Hi)
 | 
			
		||||
		}
 | 
			
		||||
		if e.Step != nil {
 | 
			
		||||
			r.expr(e.Step)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.Comprehension:
 | 
			
		||||
		// The 'in' operand of the first clause (always a ForClause)
 | 
			
		||||
		// is resolved in the outer block; consider: [x for x in x].
 | 
			
		||||
		clause := e.Clauses[0].(*syntax.ForClause)
 | 
			
		||||
		r.expr(clause.X)
 | 
			
		||||
 | 
			
		||||
		// A list/dict comprehension defines a new lexical block.
 | 
			
		||||
		// Locals defined within the block will be allotted
 | 
			
		||||
		// distinct slots in the locals array of the innermost
 | 
			
		||||
		// enclosing container (function/module) block.
 | 
			
		||||
		r.push(&block{comp: e})
 | 
			
		||||
 | 
			
		||||
		const isAugmented = false
 | 
			
		||||
		r.assign(clause.Vars, isAugmented)
 | 
			
		||||
 | 
			
		||||
		for _, clause := range e.Clauses[1:] {
 | 
			
		||||
			switch clause := clause.(type) {
 | 
			
		||||
			case *syntax.IfClause:
 | 
			
		||||
				r.expr(clause.Cond)
 | 
			
		||||
			case *syntax.ForClause:
 | 
			
		||||
				r.assign(clause.Vars, isAugmented)
 | 
			
		||||
				r.expr(clause.X)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		r.expr(e.Body) // body may be *DictEntry
 | 
			
		||||
		r.pop()
 | 
			
		||||
 | 
			
		||||
	case *syntax.TupleExpr:
 | 
			
		||||
		for _, x := range e.List {
 | 
			
		||||
			r.expr(x)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.DictExpr:
 | 
			
		||||
		for _, entry := range e.List {
 | 
			
		||||
			entry := entry.(*syntax.DictEntry)
 | 
			
		||||
			r.expr(entry.Key)
 | 
			
		||||
			r.expr(entry.Value)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.UnaryExpr:
 | 
			
		||||
		r.expr(e.X)
 | 
			
		||||
 | 
			
		||||
	case *syntax.BinaryExpr:
 | 
			
		||||
		r.expr(e.X)
 | 
			
		||||
		r.expr(e.Y)
 | 
			
		||||
 | 
			
		||||
	case *syntax.DotExpr:
 | 
			
		||||
		r.expr(e.X)
 | 
			
		||||
		// ignore e.Name
 | 
			
		||||
 | 
			
		||||
	case *syntax.CallExpr:
 | 
			
		||||
		r.expr(e.Fn)
 | 
			
		||||
		var seenVarargs, seenKwargs bool
 | 
			
		||||
		var seenName map[string]bool
 | 
			
		||||
		var n, p int
 | 
			
		||||
		for _, arg := range e.Args {
 | 
			
		||||
			pos, _ := arg.Span()
 | 
			
		||||
			if unop, ok := arg.(*syntax.UnaryExpr); ok && unop.Op == syntax.STARSTAR {
 | 
			
		||||
				// **kwargs
 | 
			
		||||
				if seenKwargs {
 | 
			
		||||
					r.errorf(pos, "multiple **kwargs not allowed")
 | 
			
		||||
				}
 | 
			
		||||
				seenKwargs = true
 | 
			
		||||
				r.expr(arg)
 | 
			
		||||
			} else if ok && unop.Op == syntax.STAR {
 | 
			
		||||
				// *args
 | 
			
		||||
				if seenKwargs {
 | 
			
		||||
					r.errorf(pos, "*args may not follow **kwargs")
 | 
			
		||||
				} else if seenVarargs {
 | 
			
		||||
					r.errorf(pos, "multiple *args not allowed")
 | 
			
		||||
				}
 | 
			
		||||
				seenVarargs = true
 | 
			
		||||
				r.expr(arg)
 | 
			
		||||
			} else if binop, ok := arg.(*syntax.BinaryExpr); ok && binop.Op == syntax.EQ {
 | 
			
		||||
				// k=v
 | 
			
		||||
				n++
 | 
			
		||||
				if seenKwargs {
 | 
			
		||||
					r.errorf(pos, "keyword argument may not follow **kwargs")
 | 
			
		||||
				} else if seenVarargs {
 | 
			
		||||
					r.errorf(pos, "keyword argument may not follow *args")
 | 
			
		||||
				}
 | 
			
		||||
				x := binop.X.(*syntax.Ident)
 | 
			
		||||
				if seenName[x.Name] {
 | 
			
		||||
					r.errorf(x.NamePos, "keyword argument %q is repeated", x.Name)
 | 
			
		||||
				} else {
 | 
			
		||||
					if seenName == nil {
 | 
			
		||||
						seenName = make(map[string]bool)
 | 
			
		||||
					}
 | 
			
		||||
					seenName[x.Name] = true
 | 
			
		||||
				}
 | 
			
		||||
				r.expr(binop.Y)
 | 
			
		||||
			} else {
 | 
			
		||||
				// positional argument
 | 
			
		||||
				p++
 | 
			
		||||
				if seenVarargs {
 | 
			
		||||
					r.errorf(pos, "positional argument may not follow *args")
 | 
			
		||||
				} else if seenKwargs {
 | 
			
		||||
					r.errorf(pos, "positional argument may not follow **kwargs")
 | 
			
		||||
				} else if len(seenName) > 0 {
 | 
			
		||||
					r.errorf(pos, "positional argument may not follow named")
 | 
			
		||||
				}
 | 
			
		||||
				r.expr(arg)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Fail gracefully if compiler-imposed limit is exceeded.
 | 
			
		||||
		if p >= 256 {
 | 
			
		||||
			pos, _ := e.Span()
 | 
			
		||||
			r.errorf(pos, "%v positional arguments in call, limit is 255", p)
 | 
			
		||||
		}
 | 
			
		||||
		if n >= 256 {
 | 
			
		||||
			pos, _ := e.Span()
 | 
			
		||||
			r.errorf(pos, "%v keyword arguments in call, limit is 255", n)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *syntax.LambdaExpr:
 | 
			
		||||
		fn := &Function{
 | 
			
		||||
			Name:   "lambda",
 | 
			
		||||
			Pos:    e.Lambda,
 | 
			
		||||
			Params: e.Params,
 | 
			
		||||
			Body:   []syntax.Stmt{&syntax.ReturnStmt{Result: e.Body}},
 | 
			
		||||
		}
 | 
			
		||||
		e.Function = fn
 | 
			
		||||
		r.function(fn, e.Lambda)
 | 
			
		||||
 | 
			
		||||
	case *syntax.ParenExpr:
 | 
			
		||||
		r.expr(e.X)
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		log.Panicf("unexpected expr %T", e)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) function(function *Function, pos syntax.Position) {
 | 
			
		||||
	// Resolve defaults in enclosing environment.
 | 
			
		||||
	for _, param := range function.Params {
 | 
			
		||||
		if binary, ok := param.(*syntax.BinaryExpr); ok {
 | 
			
		||||
			r.expr(binary.Y)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Enter function block.
 | 
			
		||||
	b := &block{function: function}
 | 
			
		||||
	r.push(b)
 | 
			
		||||
 | 
			
		||||
	var seenOptional bool
 | 
			
		||||
	var star *syntax.UnaryExpr // * or *args param
 | 
			
		||||
	var starStar *syntax.Ident // **kwargs ident
 | 
			
		||||
	var numKwonlyParams int
 | 
			
		||||
	for _, param := range function.Params {
 | 
			
		||||
		switch param := param.(type) {
 | 
			
		||||
		case *syntax.Ident:
 | 
			
		||||
			// e.g. x
 | 
			
		||||
			if starStar != nil {
 | 
			
		||||
				r.errorf(param.NamePos, "required parameter may not follow **%s", starStar.Name)
 | 
			
		||||
			} else if star != nil {
 | 
			
		||||
				numKwonlyParams++
 | 
			
		||||
			} else if seenOptional {
 | 
			
		||||
				r.errorf(param.NamePos, "required parameter may not follow optional")
 | 
			
		||||
			}
 | 
			
		||||
			if r.bind(param) {
 | 
			
		||||
				r.errorf(param.NamePos, "duplicate parameter: %s", param.Name)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case *syntax.BinaryExpr:
 | 
			
		||||
			// e.g. y=dflt
 | 
			
		||||
			if starStar != nil {
 | 
			
		||||
				r.errorf(param.OpPos, "optional parameter may not follow **%s", starStar.Name)
 | 
			
		||||
			} else if star != nil {
 | 
			
		||||
				numKwonlyParams++
 | 
			
		||||
			}
 | 
			
		||||
			if id := param.X.(*syntax.Ident); r.bind(id) {
 | 
			
		||||
				r.errorf(param.OpPos, "duplicate parameter: %s", id.Name)
 | 
			
		||||
			}
 | 
			
		||||
			seenOptional = true
 | 
			
		||||
 | 
			
		||||
		case *syntax.UnaryExpr:
 | 
			
		||||
			// * or *args or **kwargs
 | 
			
		||||
			if param.Op == syntax.STAR {
 | 
			
		||||
				if starStar != nil {
 | 
			
		||||
					r.errorf(param.OpPos, "* parameter may not follow **%s", starStar.Name)
 | 
			
		||||
				} else if star != nil {
 | 
			
		||||
					r.errorf(param.OpPos, "multiple * parameters not allowed")
 | 
			
		||||
				} else {
 | 
			
		||||
					star = param
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				if starStar != nil {
 | 
			
		||||
					r.errorf(param.OpPos, "multiple ** parameters not allowed")
 | 
			
		||||
				}
 | 
			
		||||
				starStar = param.X.(*syntax.Ident)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Bind the *args and **kwargs parameters at the end,
 | 
			
		||||
	// so that regular parameters a/b/c are contiguous and
 | 
			
		||||
	// there is no hole for the "*":
 | 
			
		||||
	//   def f(a, b, *args, c=0, **kwargs)
 | 
			
		||||
	//   def f(a, b, *,     c=0, **kwargs)
 | 
			
		||||
	if star != nil {
 | 
			
		||||
		if id, _ := star.X.(*syntax.Ident); id != nil {
 | 
			
		||||
			// *args
 | 
			
		||||
			if r.bind(id) {
 | 
			
		||||
				r.errorf(id.NamePos, "duplicate parameter: %s", id.Name)
 | 
			
		||||
			}
 | 
			
		||||
			function.HasVarargs = true
 | 
			
		||||
		} else if numKwonlyParams == 0 {
 | 
			
		||||
			r.errorf(star.OpPos, "bare * must be followed by keyword-only parameters")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if starStar != nil {
 | 
			
		||||
		if r.bind(starStar) {
 | 
			
		||||
			r.errorf(starStar.NamePos, "duplicate parameter: %s", starStar.Name)
 | 
			
		||||
		}
 | 
			
		||||
		function.HasKwargs = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function.NumKwonlyParams = numKwonlyParams
 | 
			
		||||
	r.stmts(function.Body)
 | 
			
		||||
 | 
			
		||||
	// Resolve all uses of this function's local vars,
 | 
			
		||||
	// and keep just the remaining uses of free/global vars.
 | 
			
		||||
	b.resolveLocalUses()
 | 
			
		||||
 | 
			
		||||
	// Leave function block.
 | 
			
		||||
	r.pop()
 | 
			
		||||
 | 
			
		||||
	// References within the function body to globals are not
 | 
			
		||||
	// resolved until the end of the module.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *resolver) resolveNonLocalUses(b *block) {
 | 
			
		||||
	// First resolve inner blocks.
 | 
			
		||||
	for _, child := range b.children {
 | 
			
		||||
		r.resolveNonLocalUses(child)
 | 
			
		||||
	}
 | 
			
		||||
	for _, use := range b.uses {
 | 
			
		||||
		use.id.Binding = r.lookupLexical(use, use.env)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lookupLocal looks up an identifier within its immediately enclosing function.
 | 
			
		||||
func lookupLocal(use use) *Binding {
 | 
			
		||||
	for env := use.env; env != nil; env = env.parent {
 | 
			
		||||
		if bind, ok := env.bindings[use.id.Name]; ok {
 | 
			
		||||
			if bind.Scope == Free {
 | 
			
		||||
				// shouldn't exist till later
 | 
			
		||||
				log.Panicf("%s: internal error: %s, %v", use.id.NamePos, use.id.Name, bind)
 | 
			
		||||
			}
 | 
			
		||||
			return bind // found
 | 
			
		||||
		}
 | 
			
		||||
		if env.function != nil {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil // not found in this function
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lookupLexical looks up an identifier use.id within its lexically enclosing environment.
 | 
			
		||||
// The use.env field captures the original environment for error reporting.
 | 
			
		||||
func (r *resolver) lookupLexical(use use, env *block) (bind *Binding) {
 | 
			
		||||
	if debug {
 | 
			
		||||
		fmt.Printf("lookupLexical %s in %s = ...\n", use.id.Name, env)
 | 
			
		||||
		defer func() { fmt.Printf("= %v\n", bind) }()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Is this the file block?
 | 
			
		||||
	if env == r.file {
 | 
			
		||||
		return r.useToplevel(use) // file-local, global, predeclared, or not found
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Defined in this block?
 | 
			
		||||
	bind, ok := env.bindings[use.id.Name]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		// Defined in parent block?
 | 
			
		||||
		bind = r.lookupLexical(use, env.parent)
 | 
			
		||||
		if env.function != nil && (bind.Scope == Local || bind.Scope == Free || bind.Scope == Cell) {
 | 
			
		||||
			// Found in parent block, which belongs to enclosing function.
 | 
			
		||||
			// Add the parent's binding to the function's freevars,
 | 
			
		||||
			// and add a new 'free' binding to the inner function's block,
 | 
			
		||||
			// and turn the parent's local into cell.
 | 
			
		||||
			if bind.Scope == Local {
 | 
			
		||||
				bind.Scope = Cell
 | 
			
		||||
			}
 | 
			
		||||
			index := len(env.function.FreeVars)
 | 
			
		||||
			env.function.FreeVars = append(env.function.FreeVars, bind)
 | 
			
		||||
			bind = &Binding{
 | 
			
		||||
				First: bind.First,
 | 
			
		||||
				Scope: Free,
 | 
			
		||||
				Index: index,
 | 
			
		||||
			}
 | 
			
		||||
			if debug {
 | 
			
		||||
				fmt.Printf("creating freevar %v in function at %s: %s\n",
 | 
			
		||||
					len(env.function.FreeVars), env.function.Pos, use.id.Name)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Memoize, to avoid duplicate free vars
 | 
			
		||||
		// and redundant global (failing) lookups.
 | 
			
		||||
		env.bind(use.id.Name, bind)
 | 
			
		||||
	}
 | 
			
		||||
	return bind
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								vendor/go.starlark.net/starlark/debug.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/go.starlark.net/starlark/debug.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,42 +0,0 @@
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
import "go.starlark.net/syntax"
 | 
			
		||||
 | 
			
		||||
// This file defines an experimental API for the debugging tools.
 | 
			
		||||
// Some of these declarations expose details of internal packages.
 | 
			
		||||
// (The debugger makes liberal use of exported fields of unexported types.)
 | 
			
		||||
// Breaking changes may occur without notice.
 | 
			
		||||
 | 
			
		||||
// Local returns the value of the i'th local variable.
 | 
			
		||||
// It may be nil if not yet assigned.
 | 
			
		||||
//
 | 
			
		||||
// Local may be called only for frames whose Callable is a *Function (a
 | 
			
		||||
// function defined by Starlark source code), and only while the frame
 | 
			
		||||
// is active; it will panic otherwise.
 | 
			
		||||
//
 | 
			
		||||
// This function is provided only for debugging tools.
 | 
			
		||||
//
 | 
			
		||||
// THIS API IS EXPERIMENTAL AND MAY CHANGE WITHOUT NOTICE.
 | 
			
		||||
func (fr *frame) Local(i int) Value { return fr.locals[i] }
 | 
			
		||||
 | 
			
		||||
// DebugFrame is the debugger API for a frame of the interpreter's call stack.
 | 
			
		||||
//
 | 
			
		||||
// Most applications have no need for this API; use CallFrame instead.
 | 
			
		||||
//
 | 
			
		||||
// Clients must not retain a DebugFrame nor call any of its methods once
 | 
			
		||||
// the current built-in call has returned or execution has resumed
 | 
			
		||||
// after a breakpoint as this may have unpredictable effects, including
 | 
			
		||||
// but not limited to retention of object that would otherwise be garbage.
 | 
			
		||||
type DebugFrame interface {
 | 
			
		||||
	Callable() Callable        // returns the frame's function
 | 
			
		||||
	Local(i int) Value         // returns the value of the (Starlark) frame's ith local variable
 | 
			
		||||
	Position() syntax.Position // returns the current position of execution in this frame
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DebugFrame returns the debugger interface for
 | 
			
		||||
// the specified frame of the interpreter's call stack.
 | 
			
		||||
// Frame numbering is as for Thread.CallFrame.
 | 
			
		||||
//
 | 
			
		||||
// This function is intended for use in debugging tools.
 | 
			
		||||
// Most applications should have no need for it; use CallFrame instead.
 | 
			
		||||
func (thread *Thread) DebugFrame(depth int) DebugFrame { return thread.frameAt(depth) }
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/go.starlark.net/starlark/empty.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/go.starlark.net/starlark/empty.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
			
		||||
// The presence of this file allows the package to use the
 | 
			
		||||
// "go:linkname" hack to call non-exported functions in the
 | 
			
		||||
// Go runtime, such as hardware-accelerated string hashing.
 | 
			
		||||
							
								
								
									
										1648
									
								
								vendor/go.starlark.net/starlark/eval.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1648
									
								
								vendor/go.starlark.net/starlark/eval.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										390
									
								
								vendor/go.starlark.net/starlark/hashtable.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										390
									
								
								vendor/go.starlark.net/starlark/hashtable.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,390 +0,0 @@
 | 
			
		||||
// Copyright 2017 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	_ "unsafe" // for go:linkname hack
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// hashtable is used to represent Starlark dict and set values.
 | 
			
		||||
// It is a hash table whose key/value entries form a doubly-linked list
 | 
			
		||||
// in the order the entries were inserted.
 | 
			
		||||
//
 | 
			
		||||
// Initialized instances of hashtable must not be copied.
 | 
			
		||||
type hashtable struct {
 | 
			
		||||
	table     []bucket  // len is zero or a power of two
 | 
			
		||||
	bucket0   [1]bucket // inline allocation for small maps.
 | 
			
		||||
	len       uint32
 | 
			
		||||
	itercount uint32  // number of active iterators (ignored if frozen)
 | 
			
		||||
	head      *entry  // insertion order doubly-linked list; may be nil
 | 
			
		||||
	tailLink  **entry // address of nil link at end of list (perhaps &head)
 | 
			
		||||
	frozen    bool
 | 
			
		||||
 | 
			
		||||
	_ noCopy // triggers vet copylock check on this type.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// noCopy is zero-sized type that triggers vet's copylock check.
 | 
			
		||||
// See https://github.com/golang/go/issues/8005#issuecomment-190753527.
 | 
			
		||||
type noCopy struct{}
 | 
			
		||||
 | 
			
		||||
func (*noCopy) Lock()   {}
 | 
			
		||||
func (*noCopy) Unlock() {}
 | 
			
		||||
 | 
			
		||||
const bucketSize = 8
 | 
			
		||||
 | 
			
		||||
type bucket struct {
 | 
			
		||||
	entries [bucketSize]entry
 | 
			
		||||
	next    *bucket // linked list of buckets
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type entry struct {
 | 
			
		||||
	hash       uint32 // nonzero => in use
 | 
			
		||||
	key, value Value
 | 
			
		||||
	next       *entry  // insertion order doubly-linked list; may be nil
 | 
			
		||||
	prevLink   **entry // address of link to this entry (perhaps &head)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) init(size int) {
 | 
			
		||||
	if size < 0 {
 | 
			
		||||
		panic("size < 0")
 | 
			
		||||
	}
 | 
			
		||||
	nb := 1
 | 
			
		||||
	for overloaded(size, nb) {
 | 
			
		||||
		nb = nb << 1
 | 
			
		||||
	}
 | 
			
		||||
	if nb < 2 {
 | 
			
		||||
		ht.table = ht.bucket0[:1]
 | 
			
		||||
	} else {
 | 
			
		||||
		ht.table = make([]bucket, nb)
 | 
			
		||||
	}
 | 
			
		||||
	ht.tailLink = &ht.head
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) freeze() {
 | 
			
		||||
	if !ht.frozen {
 | 
			
		||||
		ht.frozen = true
 | 
			
		||||
		for e := ht.head; e != nil; e = e.next {
 | 
			
		||||
			e.key.Freeze()
 | 
			
		||||
			e.value.Freeze()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) insert(k, v Value) error {
 | 
			
		||||
	if err := ht.checkMutable("insert into"); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if ht.table == nil {
 | 
			
		||||
		ht.init(1)
 | 
			
		||||
	}
 | 
			
		||||
	h, err := k.Hash()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if h == 0 {
 | 
			
		||||
		h = 1 // zero is reserved
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
retry:
 | 
			
		||||
	var insert *entry
 | 
			
		||||
 | 
			
		||||
	// Inspect each bucket in the bucket list.
 | 
			
		||||
	p := &ht.table[h&(uint32(len(ht.table)-1))]
 | 
			
		||||
	for {
 | 
			
		||||
		for i := range p.entries {
 | 
			
		||||
			e := &p.entries[i]
 | 
			
		||||
			if e.hash != h {
 | 
			
		||||
				if e.hash == 0 {
 | 
			
		||||
					// Found empty entry; make a note.
 | 
			
		||||
					insert = e
 | 
			
		||||
				}
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if eq, err := Equal(k, e.key); err != nil {
 | 
			
		||||
				return err // e.g. excessively recursive tuple
 | 
			
		||||
			} else if !eq {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			// Key already present; update value.
 | 
			
		||||
			e.value = v
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		if p.next == nil {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		p = p.next
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Key not found.  p points to the last bucket.
 | 
			
		||||
 | 
			
		||||
	// Does the number of elements exceed the buckets' load factor?
 | 
			
		||||
	if overloaded(int(ht.len), len(ht.table)) {
 | 
			
		||||
		ht.grow()
 | 
			
		||||
		goto retry
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if insert == nil {
 | 
			
		||||
		// No space in existing buckets.  Add a new one to the bucket list.
 | 
			
		||||
		b := new(bucket)
 | 
			
		||||
		p.next = b
 | 
			
		||||
		insert = &b.entries[0]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Insert key/value pair.
 | 
			
		||||
	insert.hash = h
 | 
			
		||||
	insert.key = k
 | 
			
		||||
	insert.value = v
 | 
			
		||||
 | 
			
		||||
	// Append entry to doubly-linked list.
 | 
			
		||||
	insert.prevLink = ht.tailLink
 | 
			
		||||
	*ht.tailLink = insert
 | 
			
		||||
	ht.tailLink = &insert.next
 | 
			
		||||
 | 
			
		||||
	ht.len++
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func overloaded(elems, buckets int) bool {
 | 
			
		||||
	const loadFactor = 6.5 // just a guess
 | 
			
		||||
	return elems >= bucketSize && float64(elems) >= loadFactor*float64(buckets)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) grow() {
 | 
			
		||||
	// Double the number of buckets and rehash.
 | 
			
		||||
	//
 | 
			
		||||
	// Even though this makes reentrant calls to ht.insert,
 | 
			
		||||
	// calls Equals unnecessarily (since there can't be duplicate keys),
 | 
			
		||||
	// and recomputes the hash unnecessarily, the gains from
 | 
			
		||||
	// avoiding these steps were found to be too small to justify
 | 
			
		||||
	// the extra logic: -2% on hashtable benchmark.
 | 
			
		||||
	ht.table = make([]bucket, len(ht.table)<<1)
 | 
			
		||||
	oldhead := ht.head
 | 
			
		||||
	ht.head = nil
 | 
			
		||||
	ht.tailLink = &ht.head
 | 
			
		||||
	ht.len = 0
 | 
			
		||||
	for e := oldhead; e != nil; e = e.next {
 | 
			
		||||
		ht.insert(e.key, e.value)
 | 
			
		||||
	}
 | 
			
		||||
	ht.bucket0[0] = bucket{} // clear out unused initial bucket
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) lookup(k Value) (v Value, found bool, err error) {
 | 
			
		||||
	h, err := k.Hash()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, false, err // unhashable
 | 
			
		||||
	}
 | 
			
		||||
	if h == 0 {
 | 
			
		||||
		h = 1 // zero is reserved
 | 
			
		||||
	}
 | 
			
		||||
	if ht.table == nil {
 | 
			
		||||
		return None, false, nil // empty
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Inspect each bucket in the bucket list.
 | 
			
		||||
	for p := &ht.table[h&(uint32(len(ht.table)-1))]; p != nil; p = p.next {
 | 
			
		||||
		for i := range p.entries {
 | 
			
		||||
			e := &p.entries[i]
 | 
			
		||||
			if e.hash == h {
 | 
			
		||||
				if eq, err := Equal(k, e.key); err != nil {
 | 
			
		||||
					return nil, false, err // e.g. excessively recursive tuple
 | 
			
		||||
				} else if eq {
 | 
			
		||||
					return e.value, true, nil // found
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return None, false, nil // not found
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Items returns all the items in the map (as key/value pairs) in insertion order.
 | 
			
		||||
func (ht *hashtable) items() []Tuple {
 | 
			
		||||
	items := make([]Tuple, 0, ht.len)
 | 
			
		||||
	array := make([]Value, ht.len*2) // allocate a single backing array
 | 
			
		||||
	for e := ht.head; e != nil; e = e.next {
 | 
			
		||||
		pair := Tuple(array[:2:2])
 | 
			
		||||
		array = array[2:]
 | 
			
		||||
		pair[0] = e.key
 | 
			
		||||
		pair[1] = e.value
 | 
			
		||||
		items = append(items, pair)
 | 
			
		||||
	}
 | 
			
		||||
	return items
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) first() (Value, bool) {
 | 
			
		||||
	if ht.head != nil {
 | 
			
		||||
		return ht.head.key, true
 | 
			
		||||
	}
 | 
			
		||||
	return None, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) keys() []Value {
 | 
			
		||||
	keys := make([]Value, 0, ht.len)
 | 
			
		||||
	for e := ht.head; e != nil; e = e.next {
 | 
			
		||||
		keys = append(keys, e.key)
 | 
			
		||||
	}
 | 
			
		||||
	return keys
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) delete(k Value) (v Value, found bool, err error) {
 | 
			
		||||
	if err := ht.checkMutable("delete from"); err != nil {
 | 
			
		||||
		return nil, false, err
 | 
			
		||||
	}
 | 
			
		||||
	if ht.table == nil {
 | 
			
		||||
		return None, false, nil // empty
 | 
			
		||||
	}
 | 
			
		||||
	h, err := k.Hash()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, false, err // unhashable
 | 
			
		||||
	}
 | 
			
		||||
	if h == 0 {
 | 
			
		||||
		h = 1 // zero is reserved
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Inspect each bucket in the bucket list.
 | 
			
		||||
	for p := &ht.table[h&(uint32(len(ht.table)-1))]; p != nil; p = p.next {
 | 
			
		||||
		for i := range p.entries {
 | 
			
		||||
			e := &p.entries[i]
 | 
			
		||||
			if e.hash == h {
 | 
			
		||||
				if eq, err := Equal(k, e.key); err != nil {
 | 
			
		||||
					return nil, false, err
 | 
			
		||||
				} else if eq {
 | 
			
		||||
					// Remove e from doubly-linked list.
 | 
			
		||||
					*e.prevLink = e.next
 | 
			
		||||
					if e.next == nil {
 | 
			
		||||
						ht.tailLink = e.prevLink // deletion of last entry
 | 
			
		||||
					} else {
 | 
			
		||||
						e.next.prevLink = e.prevLink
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					v := e.value
 | 
			
		||||
					*e = entry{}
 | 
			
		||||
					ht.len--
 | 
			
		||||
					return v, true, nil // found
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO(adonovan): opt: remove completely empty bucket from bucket list.
 | 
			
		||||
 | 
			
		||||
	return None, false, nil // not found
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// checkMutable reports an error if the hash table should not be mutated.
 | 
			
		||||
// verb+" dict" should describe the operation.
 | 
			
		||||
func (ht *hashtable) checkMutable(verb string) error {
 | 
			
		||||
	if ht.frozen {
 | 
			
		||||
		return fmt.Errorf("cannot %s frozen hash table", verb)
 | 
			
		||||
	}
 | 
			
		||||
	if ht.itercount > 0 {
 | 
			
		||||
		return fmt.Errorf("cannot %s hash table during iteration", verb)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) clear() error {
 | 
			
		||||
	if err := ht.checkMutable("clear"); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if ht.table != nil {
 | 
			
		||||
		for i := range ht.table {
 | 
			
		||||
			ht.table[i] = bucket{}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	ht.head = nil
 | 
			
		||||
	ht.tailLink = &ht.head
 | 
			
		||||
	ht.len = 0
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) addAll(other *hashtable) error {
 | 
			
		||||
	for e := other.head; e != nil; e = e.next {
 | 
			
		||||
		if err := ht.insert(e.key, e.value); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dump is provided as an aid to debugging.
 | 
			
		||||
func (ht *hashtable) dump() {
 | 
			
		||||
	fmt.Printf("hashtable %p len=%d head=%p tailLink=%p",
 | 
			
		||||
		ht, ht.len, ht.head, ht.tailLink)
 | 
			
		||||
	if ht.tailLink != nil {
 | 
			
		||||
		fmt.Printf(" *tailLink=%p", *ht.tailLink)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println()
 | 
			
		||||
	for j := range ht.table {
 | 
			
		||||
		fmt.Printf("bucket chain %d\n", j)
 | 
			
		||||
		for p := &ht.table[j]; p != nil; p = p.next {
 | 
			
		||||
			fmt.Printf("bucket %p\n", p)
 | 
			
		||||
			for i := range p.entries {
 | 
			
		||||
				e := &p.entries[i]
 | 
			
		||||
				fmt.Printf("\tentry %d @ %p hash=%d key=%v value=%v\n",
 | 
			
		||||
					i, e, e.hash, e.key, e.value)
 | 
			
		||||
				fmt.Printf("\t\tnext=%p &next=%p prev=%p",
 | 
			
		||||
					e.next, &e.next, e.prevLink)
 | 
			
		||||
				if e.prevLink != nil {
 | 
			
		||||
					fmt.Printf(" *prev=%p", *e.prevLink)
 | 
			
		||||
				}
 | 
			
		||||
				fmt.Println()
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ht *hashtable) iterate() *keyIterator {
 | 
			
		||||
	if !ht.frozen {
 | 
			
		||||
		ht.itercount++
 | 
			
		||||
	}
 | 
			
		||||
	return &keyIterator{ht: ht, e: ht.head}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type keyIterator struct {
 | 
			
		||||
	ht *hashtable
 | 
			
		||||
	e  *entry
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (it *keyIterator) Next(k *Value) bool {
 | 
			
		||||
	if it.e != nil {
 | 
			
		||||
		*k = it.e.key
 | 
			
		||||
		it.e = it.e.next
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (it *keyIterator) Done() {
 | 
			
		||||
	if !it.ht.frozen {
 | 
			
		||||
		it.ht.itercount--
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO(adonovan): use go1.19's maphash.String.
 | 
			
		||||
 | 
			
		||||
// hashString computes the hash of s.
 | 
			
		||||
func hashString(s string) uint32 {
 | 
			
		||||
	if len(s) >= 12 {
 | 
			
		||||
		// Call the Go runtime's optimized hash implementation,
 | 
			
		||||
		// which uses the AESENC instruction on amd64 machines.
 | 
			
		||||
		return uint32(goStringHash(s, 0))
 | 
			
		||||
	}
 | 
			
		||||
	return softHashString(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//go:linkname goStringHash runtime.stringHash
 | 
			
		||||
func goStringHash(s string, seed uintptr) uintptr
 | 
			
		||||
 | 
			
		||||
// softHashString computes the 32-bit FNV-1a hash of s in software.
 | 
			
		||||
func softHashString(s string) uint32 {
 | 
			
		||||
	var h uint32 = 2166136261
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		h ^= uint32(s[i])
 | 
			
		||||
		h *= 16777619
 | 
			
		||||
	}
 | 
			
		||||
	return h
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										452
									
								
								vendor/go.starlark.net/starlark/int.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										452
									
								
								vendor/go.starlark.net/starlark/int.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,452 +0,0 @@
 | 
			
		||||
// Copyright 2017 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/syntax"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Int is the type of a Starlark int.
 | 
			
		||||
//
 | 
			
		||||
// The zero value is not a legal value; use MakeInt(0).
 | 
			
		||||
type Int struct{ impl intImpl }
 | 
			
		||||
 | 
			
		||||
// --- high-level accessors ---
 | 
			
		||||
 | 
			
		||||
// MakeInt returns a Starlark int for the specified signed integer.
 | 
			
		||||
func MakeInt(x int) Int { return MakeInt64(int64(x)) }
 | 
			
		||||
 | 
			
		||||
// MakeInt64 returns a Starlark int for the specified int64.
 | 
			
		||||
func MakeInt64(x int64) Int {
 | 
			
		||||
	if math.MinInt32 <= x && x <= math.MaxInt32 {
 | 
			
		||||
		return makeSmallInt(x)
 | 
			
		||||
	}
 | 
			
		||||
	return makeBigInt(big.NewInt(x))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MakeUint returns a Starlark int for the specified unsigned integer.
 | 
			
		||||
func MakeUint(x uint) Int { return MakeUint64(uint64(x)) }
 | 
			
		||||
 | 
			
		||||
// MakeUint64 returns a Starlark int for the specified uint64.
 | 
			
		||||
func MakeUint64(x uint64) Int {
 | 
			
		||||
	if x <= math.MaxInt32 {
 | 
			
		||||
		return makeSmallInt(int64(x))
 | 
			
		||||
	}
 | 
			
		||||
	return makeBigInt(new(big.Int).SetUint64(x))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MakeBigInt returns a Starlark int for the specified big.Int.
 | 
			
		||||
// The new Int value will contain a copy of x. The caller is safe to modify x.
 | 
			
		||||
func MakeBigInt(x *big.Int) Int {
 | 
			
		||||
	if isSmall(x) {
 | 
			
		||||
		return makeSmallInt(x.Int64())
 | 
			
		||||
	}
 | 
			
		||||
	z := new(big.Int).Set(x)
 | 
			
		||||
	return makeBigInt(z)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isSmall(x *big.Int) bool {
 | 
			
		||||
	n := x.BitLen()
 | 
			
		||||
	return n < 32 || n == 32 && x.Int64() == math.MinInt32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	zero, one = makeSmallInt(0), makeSmallInt(1)
 | 
			
		||||
	oneBig    = big.NewInt(1)
 | 
			
		||||
 | 
			
		||||
	_ HasUnary = Int{}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Unary implements the operations +int, -int, and ~int.
 | 
			
		||||
func (i Int) Unary(op syntax.Token) (Value, error) {
 | 
			
		||||
	switch op {
 | 
			
		||||
	case syntax.MINUS:
 | 
			
		||||
		return zero.Sub(i), nil
 | 
			
		||||
	case syntax.PLUS:
 | 
			
		||||
		return i, nil
 | 
			
		||||
	case syntax.TILDE:
 | 
			
		||||
		return i.Not(), nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64 returns the value as an int64.
 | 
			
		||||
// If it is not exactly representable the result is undefined and ok is false.
 | 
			
		||||
func (i Int) Int64() (_ int64, ok bool) {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		x, acc := bigintToInt64(iBig)
 | 
			
		||||
		if acc != big.Exact {
 | 
			
		||||
			return // inexact
 | 
			
		||||
		}
 | 
			
		||||
		return x, true
 | 
			
		||||
	}
 | 
			
		||||
	return iSmall, true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BigInt returns a new big.Int with the same value as the Int.
 | 
			
		||||
func (i Int) BigInt() *big.Int {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		return new(big.Int).Set(iBig)
 | 
			
		||||
	}
 | 
			
		||||
	return big.NewInt(iSmall)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// bigInt returns the value as a big.Int.
 | 
			
		||||
// It differs from BigInt in that this method returns the actual
 | 
			
		||||
// reference and any modification will change the state of i.
 | 
			
		||||
func (i Int) bigInt() *big.Int {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		return iBig
 | 
			
		||||
	}
 | 
			
		||||
	return big.NewInt(iSmall)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Uint64 returns the value as a uint64.
 | 
			
		||||
// If it is not exactly representable the result is undefined and ok is false.
 | 
			
		||||
func (i Int) Uint64() (_ uint64, ok bool) {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		x, acc := bigintToUint64(iBig)
 | 
			
		||||
		if acc != big.Exact {
 | 
			
		||||
			return // inexact
 | 
			
		||||
		}
 | 
			
		||||
		return x, true
 | 
			
		||||
	}
 | 
			
		||||
	if iSmall < 0 {
 | 
			
		||||
		return // inexact
 | 
			
		||||
	}
 | 
			
		||||
	return uint64(iSmall), true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The math/big API should provide this function.
 | 
			
		||||
func bigintToInt64(i *big.Int) (int64, big.Accuracy) {
 | 
			
		||||
	sign := i.Sign()
 | 
			
		||||
	if sign > 0 {
 | 
			
		||||
		if i.Cmp(maxint64) > 0 {
 | 
			
		||||
			return math.MaxInt64, big.Below
 | 
			
		||||
		}
 | 
			
		||||
	} else if sign < 0 {
 | 
			
		||||
		if i.Cmp(minint64) < 0 {
 | 
			
		||||
			return math.MinInt64, big.Above
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return i.Int64(), big.Exact
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The math/big API should provide this function.
 | 
			
		||||
func bigintToUint64(i *big.Int) (uint64, big.Accuracy) {
 | 
			
		||||
	sign := i.Sign()
 | 
			
		||||
	if sign > 0 {
 | 
			
		||||
		if i.BitLen() > 64 {
 | 
			
		||||
			return math.MaxUint64, big.Below
 | 
			
		||||
		}
 | 
			
		||||
	} else if sign < 0 {
 | 
			
		||||
		return 0, big.Above
 | 
			
		||||
	}
 | 
			
		||||
	return i.Uint64(), big.Exact
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	minint64 = new(big.Int).SetInt64(math.MinInt64)
 | 
			
		||||
	maxint64 = new(big.Int).SetInt64(math.MaxInt64)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (i Int) Format(s fmt.State, ch rune) {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		iBig.Format(s, ch)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	big.NewInt(iSmall).Format(s, ch)
 | 
			
		||||
}
 | 
			
		||||
func (i Int) String() string {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		return iBig.Text(10)
 | 
			
		||||
	}
 | 
			
		||||
	return strconv.FormatInt(iSmall, 10)
 | 
			
		||||
}
 | 
			
		||||
func (i Int) Type() string { return "int" }
 | 
			
		||||
func (i Int) Freeze()      {} // immutable
 | 
			
		||||
func (i Int) Truth() Bool  { return i.Sign() != 0 }
 | 
			
		||||
func (i Int) Hash() (uint32, error) {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	var lo big.Word
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		lo = iBig.Bits()[0]
 | 
			
		||||
	} else {
 | 
			
		||||
		lo = big.Word(iSmall)
 | 
			
		||||
	}
 | 
			
		||||
	return 12582917 * uint32(lo+3), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Required by the TotallyOrdered interface
 | 
			
		||||
func (x Int) Cmp(v Value, depth int) (int, error) {
 | 
			
		||||
	y := v.(Int)
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		return x.bigInt().Cmp(y.bigInt()), nil
 | 
			
		||||
	}
 | 
			
		||||
	return signum64(xSmall - ySmall), nil // safe: int32 operands
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float returns the float value nearest i.
 | 
			
		||||
func (i Int) Float() Float {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		// Fast path for hardware int-to-float conversions.
 | 
			
		||||
		if iBig.IsUint64() {
 | 
			
		||||
			return Float(iBig.Uint64())
 | 
			
		||||
		} else if iBig.IsInt64() {
 | 
			
		||||
			return Float(iBig.Int64())
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		f, _ := new(big.Float).SetInt(iBig).Float64()
 | 
			
		||||
		return Float(f)
 | 
			
		||||
	}
 | 
			
		||||
	return Float(iSmall)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// finiteFloat returns the finite float value nearest i,
 | 
			
		||||
// or an error if the magnitude is too large.
 | 
			
		||||
func (i Int) finiteFloat() (Float, error) {
 | 
			
		||||
	f := i.Float()
 | 
			
		||||
	if math.IsInf(float64(f), 0) {
 | 
			
		||||
		return 0, fmt.Errorf("int too large to convert to float")
 | 
			
		||||
	}
 | 
			
		||||
	return f, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x Int) Sign() int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	if xBig != nil {
 | 
			
		||||
		return xBig.Sign()
 | 
			
		||||
	}
 | 
			
		||||
	return signum64(xSmall)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x Int) Add(y Int) Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		return MakeBigInt(new(big.Int).Add(x.bigInt(), y.bigInt()))
 | 
			
		||||
	}
 | 
			
		||||
	return MakeInt64(xSmall + ySmall)
 | 
			
		||||
}
 | 
			
		||||
func (x Int) Sub(y Int) Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		return MakeBigInt(new(big.Int).Sub(x.bigInt(), y.bigInt()))
 | 
			
		||||
	}
 | 
			
		||||
	return MakeInt64(xSmall - ySmall)
 | 
			
		||||
}
 | 
			
		||||
func (x Int) Mul(y Int) Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		return MakeBigInt(new(big.Int).Mul(x.bigInt(), y.bigInt()))
 | 
			
		||||
	}
 | 
			
		||||
	return MakeInt64(xSmall * ySmall)
 | 
			
		||||
}
 | 
			
		||||
func (x Int) Or(y Int) Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		return MakeBigInt(new(big.Int).Or(x.bigInt(), y.bigInt()))
 | 
			
		||||
	}
 | 
			
		||||
	return makeSmallInt(xSmall | ySmall)
 | 
			
		||||
}
 | 
			
		||||
func (x Int) And(y Int) Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		return MakeBigInt(new(big.Int).And(x.bigInt(), y.bigInt()))
 | 
			
		||||
	}
 | 
			
		||||
	return makeSmallInt(xSmall & ySmall)
 | 
			
		||||
}
 | 
			
		||||
func (x Int) Xor(y Int) Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		return MakeBigInt(new(big.Int).Xor(x.bigInt(), y.bigInt()))
 | 
			
		||||
	}
 | 
			
		||||
	return makeSmallInt(xSmall ^ ySmall)
 | 
			
		||||
}
 | 
			
		||||
func (x Int) Not() Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	if xBig != nil {
 | 
			
		||||
		return MakeBigInt(new(big.Int).Not(xBig))
 | 
			
		||||
	}
 | 
			
		||||
	return makeSmallInt(^xSmall)
 | 
			
		||||
}
 | 
			
		||||
func (x Int) Lsh(y uint) Int { return MakeBigInt(new(big.Int).Lsh(x.bigInt(), y)) }
 | 
			
		||||
func (x Int) Rsh(y uint) Int { return MakeBigInt(new(big.Int).Rsh(x.bigInt(), y)) }
 | 
			
		||||
 | 
			
		||||
// Precondition: y is nonzero.
 | 
			
		||||
func (x Int) Div(y Int) Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	// http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		xb, yb := x.bigInt(), y.bigInt()
 | 
			
		||||
 | 
			
		||||
		var quo, rem big.Int
 | 
			
		||||
		quo.QuoRem(xb, yb, &rem)
 | 
			
		||||
		if (xb.Sign() < 0) != (yb.Sign() < 0) && rem.Sign() != 0 {
 | 
			
		||||
			quo.Sub(&quo, oneBig)
 | 
			
		||||
		}
 | 
			
		||||
		return MakeBigInt(&quo)
 | 
			
		||||
	}
 | 
			
		||||
	quo := xSmall / ySmall
 | 
			
		||||
	rem := xSmall % ySmall
 | 
			
		||||
	if (xSmall < 0) != (ySmall < 0) && rem != 0 {
 | 
			
		||||
		quo -= 1
 | 
			
		||||
	}
 | 
			
		||||
	return MakeInt64(quo)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Precondition: y is nonzero.
 | 
			
		||||
func (x Int) Mod(y Int) Int {
 | 
			
		||||
	xSmall, xBig := x.get()
 | 
			
		||||
	ySmall, yBig := y.get()
 | 
			
		||||
	if xBig != nil || yBig != nil {
 | 
			
		||||
		xb, yb := x.bigInt(), y.bigInt()
 | 
			
		||||
 | 
			
		||||
		var quo, rem big.Int
 | 
			
		||||
		quo.QuoRem(xb, yb, &rem)
 | 
			
		||||
		if (xb.Sign() < 0) != (yb.Sign() < 0) && rem.Sign() != 0 {
 | 
			
		||||
			rem.Add(&rem, yb)
 | 
			
		||||
		}
 | 
			
		||||
		return MakeBigInt(&rem)
 | 
			
		||||
	}
 | 
			
		||||
	rem := xSmall % ySmall
 | 
			
		||||
	if (xSmall < 0) != (ySmall < 0) && rem != 0 {
 | 
			
		||||
		rem += ySmall
 | 
			
		||||
	}
 | 
			
		||||
	return makeSmallInt(rem)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i Int) rational() *big.Rat {
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		return new(big.Rat).SetInt(iBig)
 | 
			
		||||
	}
 | 
			
		||||
	return new(big.Rat).SetInt64(iSmall)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsInt32 returns the value of x if is representable as an int32.
 | 
			
		||||
func AsInt32(x Value) (int, error) {
 | 
			
		||||
	i, ok := x.(Int)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return 0, fmt.Errorf("got %s, want int", x.Type())
 | 
			
		||||
	}
 | 
			
		||||
	iSmall, iBig := i.get()
 | 
			
		||||
	if iBig != nil {
 | 
			
		||||
		return 0, fmt.Errorf("%s out of range", i)
 | 
			
		||||
	}
 | 
			
		||||
	return int(iSmall), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsInt sets *ptr to the value of Starlark int x, if it is exactly representable,
 | 
			
		||||
// otherwise it returns an error.
 | 
			
		||||
// The type of ptr must be one of the pointer types *int, *int8, *int16, *int32, or *int64,
 | 
			
		||||
// or one of their unsigned counterparts including *uintptr.
 | 
			
		||||
func AsInt(x Value, ptr interface{}) error {
 | 
			
		||||
	xint, ok := x.(Int)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return fmt.Errorf("got %s, want int", x.Type())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bits := reflect.TypeOf(ptr).Elem().Size() * 8
 | 
			
		||||
	switch ptr.(type) {
 | 
			
		||||
	case *int, *int8, *int16, *int32, *int64:
 | 
			
		||||
		i, ok := xint.Int64()
 | 
			
		||||
		if !ok || bits < 64 && !(-1<<(bits-1) <= i && i < 1<<(bits-1)) {
 | 
			
		||||
			return fmt.Errorf("%s out of range (want value in signed %d-bit range)", xint, bits)
 | 
			
		||||
		}
 | 
			
		||||
		switch ptr := ptr.(type) {
 | 
			
		||||
		case *int:
 | 
			
		||||
			*ptr = int(i)
 | 
			
		||||
		case *int8:
 | 
			
		||||
			*ptr = int8(i)
 | 
			
		||||
		case *int16:
 | 
			
		||||
			*ptr = int16(i)
 | 
			
		||||
		case *int32:
 | 
			
		||||
			*ptr = int32(i)
 | 
			
		||||
		case *int64:
 | 
			
		||||
			*ptr = int64(i)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *uint, *uint8, *uint16, *uint32, *uint64, *uintptr:
 | 
			
		||||
		i, ok := xint.Uint64()
 | 
			
		||||
		if !ok || bits < 64 && i >= 1<<bits {
 | 
			
		||||
			return fmt.Errorf("%s out of range (want value in unsigned %d-bit range)", xint, bits)
 | 
			
		||||
		}
 | 
			
		||||
		switch ptr := ptr.(type) {
 | 
			
		||||
		case *uint:
 | 
			
		||||
			*ptr = uint(i)
 | 
			
		||||
		case *uint8:
 | 
			
		||||
			*ptr = uint8(i)
 | 
			
		||||
		case *uint16:
 | 
			
		||||
			*ptr = uint16(i)
 | 
			
		||||
		case *uint32:
 | 
			
		||||
			*ptr = uint32(i)
 | 
			
		||||
		case *uint64:
 | 
			
		||||
			*ptr = uint64(i)
 | 
			
		||||
		case *uintptr:
 | 
			
		||||
			*ptr = uintptr(i)
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		panic(fmt.Sprintf("invalid argument type: %T", ptr))
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NumberToInt converts a number x to an integer value.
 | 
			
		||||
// An int is returned unchanged, a float is truncated towards zero.
 | 
			
		||||
// NumberToInt reports an error for all other values.
 | 
			
		||||
func NumberToInt(x Value) (Int, error) {
 | 
			
		||||
	switch x := x.(type) {
 | 
			
		||||
	case Int:
 | 
			
		||||
		return x, nil
 | 
			
		||||
	case Float:
 | 
			
		||||
		f := float64(x)
 | 
			
		||||
		if math.IsInf(f, 0) {
 | 
			
		||||
			return zero, fmt.Errorf("cannot convert float infinity to integer")
 | 
			
		||||
		} else if math.IsNaN(f) {
 | 
			
		||||
			return zero, fmt.Errorf("cannot convert float NaN to integer")
 | 
			
		||||
		}
 | 
			
		||||
		return finiteFloatToInt(x), nil
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	return zero, fmt.Errorf("cannot convert %s to int", x.Type())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// finiteFloatToInt converts f to an Int, truncating towards zero.
 | 
			
		||||
// f must be finite.
 | 
			
		||||
func finiteFloatToInt(f Float) Int {
 | 
			
		||||
	// We avoid '<= MaxInt64' so that both constants are exactly representable as floats.
 | 
			
		||||
	// See https://github.com/google/starlark-go/issues/375.
 | 
			
		||||
	if math.MinInt64 <= f && f < math.MaxInt64+1 {
 | 
			
		||||
		// small values
 | 
			
		||||
		return MakeInt64(int64(f))
 | 
			
		||||
	}
 | 
			
		||||
	rat := f.rational()
 | 
			
		||||
	if rat == nil {
 | 
			
		||||
		panic(f) // non-finite
 | 
			
		||||
	}
 | 
			
		||||
	return MakeBigInt(new(big.Int).Div(rat.Num(), rat.Denom()))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								vendor/go.starlark.net/starlark/int_generic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/go.starlark.net/starlark/int_generic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,34 +0,0 @@
 | 
			
		||||
//go:build (!linux && !darwin && !dragonfly && !freebsd && !netbsd && !solaris) || (!amd64 && !arm64 && !mips64x && !ppc64x && !loong64)
 | 
			
		||||
// +build !linux,!darwin,!dragonfly,!freebsd,!netbsd,!solaris !amd64,!arm64,!mips64x,!ppc64x,!loong64
 | 
			
		||||
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
// generic Int implementation as a union
 | 
			
		||||
 | 
			
		||||
import "math/big"
 | 
			
		||||
 | 
			
		||||
type intImpl struct {
 | 
			
		||||
	// We use only the signed 32-bit range of small to ensure
 | 
			
		||||
	// that small+small and small*small do not overflow.
 | 
			
		||||
	small_ int64    // minint32 <= small <= maxint32
 | 
			
		||||
	big_   *big.Int // big != nil <=> value is not representable as int32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- low-level accessors ---
 | 
			
		||||
 | 
			
		||||
// get returns the small and big components of the Int.
 | 
			
		||||
// small is defined only if big is nil.
 | 
			
		||||
// small is sign-extended to 64 bits for ease of subsequent arithmetic.
 | 
			
		||||
func (i Int) get() (small int64, big *big.Int) {
 | 
			
		||||
	return i.impl.small_, i.impl.big_
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Precondition: math.MinInt32 <= x && x <= math.MaxInt32
 | 
			
		||||
func makeSmallInt(x int64) Int {
 | 
			
		||||
	return Int{intImpl{small_: x}}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Precondition: x cannot be represented as int32.
 | 
			
		||||
func makeBigInt(x *big.Int) Int {
 | 
			
		||||
	return Int{intImpl{big_: x}}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										91
									
								
								vendor/go.starlark.net/starlark/int_posix64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								vendor/go.starlark.net/starlark/int_posix64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,91 +0,0 @@
 | 
			
		||||
//go:build (linux || darwin || dragonfly || freebsd || netbsd || solaris) && (amd64 || arm64 || mips64x || ppc64x || loong64)
 | 
			
		||||
// +build linux darwin dragonfly freebsd netbsd solaris
 | 
			
		||||
// +build amd64 arm64 mips64x ppc64x loong64
 | 
			
		||||
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
// This file defines an optimized Int implementation for 64-bit machines
 | 
			
		||||
// running POSIX. It reserves a 4GB portion of the address space using
 | 
			
		||||
// mmap and represents int32 values as addresses within that range. This
 | 
			
		||||
// disambiguates int32 values from *big.Int pointers, letting all Int
 | 
			
		||||
// values be represented as an unsafe.Pointer, so that Int-to-Value
 | 
			
		||||
// interface conversion need not allocate.
 | 
			
		||||
 | 
			
		||||
// Although iOS (which, like macOS, appears as darwin/arm64) is
 | 
			
		||||
// POSIX-compliant, it limits each process to about 700MB of virtual
 | 
			
		||||
// address space, which defeats the optimization.  Similarly,
 | 
			
		||||
// OpenBSD's default ulimit for virtual memory is a measly GB or so.
 | 
			
		||||
// On both those platforms the attempted optimization will fail and
 | 
			
		||||
// fall back to the slow implementation.
 | 
			
		||||
 | 
			
		||||
// An alternative approach to this optimization would be to embed the
 | 
			
		||||
// int32 values in pointers using odd values, which can be distinguished
 | 
			
		||||
// from (even) *big.Int pointers. However, the Go runtime does not allow
 | 
			
		||||
// user programs to manufacture pointers to arbitrary locations such as
 | 
			
		||||
// within the zero page, or non-span, non-mmap, non-stack locations,
 | 
			
		||||
// and it may panic if it encounters them; see Issue #382.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"log"
 | 
			
		||||
	"math"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/unix"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// intImpl represents a union of (int32, *big.Int) in a single pointer,
 | 
			
		||||
// so that Int-to-Value conversions need not allocate.
 | 
			
		||||
//
 | 
			
		||||
// The pointer is either a *big.Int, if the value is big, or a pointer into a
 | 
			
		||||
// reserved portion of the address space (smallints), if the value is small
 | 
			
		||||
// and the address space allocation succeeded.
 | 
			
		||||
//
 | 
			
		||||
// See int_generic.go for the basic representation concepts.
 | 
			
		||||
type intImpl unsafe.Pointer
 | 
			
		||||
 | 
			
		||||
// get returns the (small, big) arms of the union.
 | 
			
		||||
func (i Int) get() (int64, *big.Int) {
 | 
			
		||||
	if smallints == 0 {
 | 
			
		||||
		// optimization disabled
 | 
			
		||||
		if x := (*big.Int)(i.impl); isSmall(x) {
 | 
			
		||||
			return x.Int64(), nil
 | 
			
		||||
		} else {
 | 
			
		||||
			return 0, x
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ptr := uintptr(i.impl); ptr >= smallints && ptr < smallints+1<<32 {
 | 
			
		||||
		return math.MinInt32 + int64(ptr-smallints), nil
 | 
			
		||||
	}
 | 
			
		||||
	return 0, (*big.Int)(i.impl)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Precondition: math.MinInt32 <= x && x <= math.MaxInt32
 | 
			
		||||
func makeSmallInt(x int64) Int {
 | 
			
		||||
	if smallints == 0 {
 | 
			
		||||
		// optimization disabled
 | 
			
		||||
		return Int{intImpl(big.NewInt(x))}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return Int{intImpl(uintptr(x-math.MinInt32) + smallints)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Precondition: x cannot be represented as int32.
 | 
			
		||||
func makeBigInt(x *big.Int) Int { return Int{intImpl(x)} }
 | 
			
		||||
 | 
			
		||||
// smallints is the base address of a 2^32 byte memory region.
 | 
			
		||||
// Pointers to addresses in this region represent int32 values.
 | 
			
		||||
// We assume smallints is not at the very top of the address space.
 | 
			
		||||
//
 | 
			
		||||
// Zero means the optimization is disabled and all Ints allocate a big.Int.
 | 
			
		||||
var smallints = reserveAddresses(1 << 32)
 | 
			
		||||
 | 
			
		||||
func reserveAddresses(len int) uintptr {
 | 
			
		||||
	b, err := unix.Mmap(-1, 0, len, unix.PROT_READ, unix.MAP_PRIVATE|unix.MAP_ANON)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("Starlark failed to allocate 4GB address space: %v. Integer performance may suffer.", err)
 | 
			
		||||
		return 0 // optimization disabled
 | 
			
		||||
	}
 | 
			
		||||
	return uintptr(unsafe.Pointer(&b[0]))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										705
									
								
								vendor/go.starlark.net/starlark/interp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										705
									
								
								vendor/go.starlark.net/starlark/interp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,705 +0,0 @@
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
// This file defines the bytecode interpreter.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/internal/compile"
 | 
			
		||||
	"go.starlark.net/internal/spell"
 | 
			
		||||
	"go.starlark.net/resolve"
 | 
			
		||||
	"go.starlark.net/syntax"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const vmdebug = false // TODO(adonovan): use a bitfield of specific kinds of error.
 | 
			
		||||
 | 
			
		||||
// TODO(adonovan):
 | 
			
		||||
// - optimize position table.
 | 
			
		||||
// - opt: record MaxIterStack during compilation and preallocate the stack.
 | 
			
		||||
 | 
			
		||||
func (fn *Function) CallInternal(thread *Thread, args Tuple, kwargs []Tuple) (Value, error) {
 | 
			
		||||
	// Postcondition: args is not mutated. This is stricter than required by Callable,
 | 
			
		||||
	// but allows CALL to avoid a copy.
 | 
			
		||||
 | 
			
		||||
	if !resolve.AllowRecursion {
 | 
			
		||||
		// detect recursion
 | 
			
		||||
		for _, fr := range thread.stack[:len(thread.stack)-1] {
 | 
			
		||||
			// We look for the same function code,
 | 
			
		||||
			// not function value, otherwise the user could
 | 
			
		||||
			// defeat the check by writing the Y combinator.
 | 
			
		||||
			if frfn, ok := fr.Callable().(*Function); ok && frfn.funcode == fn.funcode {
 | 
			
		||||
				return nil, fmt.Errorf("function %s called recursively", fn.Name())
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	f := fn.funcode
 | 
			
		||||
	fr := thread.frameAt(0)
 | 
			
		||||
 | 
			
		||||
	// Allocate space for stack and locals.
 | 
			
		||||
	// Logically these do not escape from this frame
 | 
			
		||||
	// (See https://github.com/golang/go/issues/20533.)
 | 
			
		||||
	//
 | 
			
		||||
	// This heap allocation looks expensive, but I was unable to get
 | 
			
		||||
	// more than 1% real time improvement in a large alloc-heavy
 | 
			
		||||
	// benchmark (in which this alloc was 8% of alloc-bytes)
 | 
			
		||||
	// by allocating space for 8 Values in each frame, or
 | 
			
		||||
	// by allocating stack by slicing an array held by the Thread
 | 
			
		||||
	// that is expanded in chunks of min(k, nspace), for k=256 or 1024.
 | 
			
		||||
	nlocals := len(f.Locals)
 | 
			
		||||
	nspace := nlocals + f.MaxStack
 | 
			
		||||
	space := make([]Value, nspace)
 | 
			
		||||
	locals := space[:nlocals:nlocals] // local variables, starting with parameters
 | 
			
		||||
	stack := space[nlocals:]          // operand stack
 | 
			
		||||
 | 
			
		||||
	// Digest arguments and set parameters.
 | 
			
		||||
	err := setArgs(locals, fn, args, kwargs)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, thread.evalError(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fr.locals = locals
 | 
			
		||||
 | 
			
		||||
	if vmdebug {
 | 
			
		||||
		fmt.Printf("Entering %s @ %s\n", f.Name, f.Position(0))
 | 
			
		||||
		fmt.Printf("%d stack, %d locals\n", len(stack), len(locals))
 | 
			
		||||
		defer fmt.Println("Leaving ", f.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Spill indicated locals to cells.
 | 
			
		||||
	// Each cell is a separate alloc to avoid spurious liveness.
 | 
			
		||||
	for _, index := range f.Cells {
 | 
			
		||||
		locals[index] = &cell{locals[index]}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO(adonovan): add static check that beneath this point
 | 
			
		||||
	// - there is exactly one return statement
 | 
			
		||||
	// - there is no redefinition of 'err'.
 | 
			
		||||
 | 
			
		||||
	var iterstack []Iterator // stack of active iterators
 | 
			
		||||
 | 
			
		||||
	// Use defer so that application panics can pass through
 | 
			
		||||
	// interpreter without leaving thread in a bad state.
 | 
			
		||||
	defer func() {
 | 
			
		||||
		// ITERPOP the rest of the iterator stack.
 | 
			
		||||
		for _, iter := range iterstack {
 | 
			
		||||
			iter.Done()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fr.locals = nil
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	sp := 0
 | 
			
		||||
	var pc uint32
 | 
			
		||||
	var result Value
 | 
			
		||||
	code := f.Code
 | 
			
		||||
loop:
 | 
			
		||||
	for {
 | 
			
		||||
		thread.Steps++
 | 
			
		||||
		if thread.Steps >= thread.maxSteps {
 | 
			
		||||
			if thread.OnMaxSteps != nil {
 | 
			
		||||
				thread.OnMaxSteps(thread)
 | 
			
		||||
			} else {
 | 
			
		||||
				thread.Cancel("too many steps")
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if reason := atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&thread.cancelReason))); reason != nil {
 | 
			
		||||
			err = fmt.Errorf("Starlark computation cancelled: %s", *(*string)(reason))
 | 
			
		||||
			break loop
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fr.pc = pc
 | 
			
		||||
 | 
			
		||||
		op := compile.Opcode(code[pc])
 | 
			
		||||
		pc++
 | 
			
		||||
		var arg uint32
 | 
			
		||||
		if op >= compile.OpcodeArgMin {
 | 
			
		||||
			// TODO(adonovan): opt: profile this.
 | 
			
		||||
			// Perhaps compiling big endian would be less work to decode?
 | 
			
		||||
			for s := uint(0); ; s += 7 {
 | 
			
		||||
				b := code[pc]
 | 
			
		||||
				pc++
 | 
			
		||||
				arg |= uint32(b&0x7f) << s
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if vmdebug {
 | 
			
		||||
			fmt.Fprintln(os.Stderr, stack[:sp]) // very verbose!
 | 
			
		||||
			compile.PrintOp(f, fr.pc, op, arg)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch op {
 | 
			
		||||
		case compile.NOP:
 | 
			
		||||
			// nop
 | 
			
		||||
 | 
			
		||||
		case compile.DUP:
 | 
			
		||||
			stack[sp] = stack[sp-1]
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.DUP2:
 | 
			
		||||
			stack[sp] = stack[sp-2]
 | 
			
		||||
			stack[sp+1] = stack[sp-1]
 | 
			
		||||
			sp += 2
 | 
			
		||||
 | 
			
		||||
		case compile.POP:
 | 
			
		||||
			sp--
 | 
			
		||||
 | 
			
		||||
		case compile.EXCH:
 | 
			
		||||
			stack[sp-2], stack[sp-1] = stack[sp-1], stack[sp-2]
 | 
			
		||||
 | 
			
		||||
		case compile.EQL, compile.NEQ, compile.GT, compile.LT, compile.LE, compile.GE:
 | 
			
		||||
			op := syntax.Token(op-compile.EQL) + syntax.EQL
 | 
			
		||||
			y := stack[sp-1]
 | 
			
		||||
			x := stack[sp-2]
 | 
			
		||||
			sp -= 2
 | 
			
		||||
			ok, err2 := Compare(op, x, y)
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = Bool(ok)
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.PLUS,
 | 
			
		||||
			compile.MINUS,
 | 
			
		||||
			compile.STAR,
 | 
			
		||||
			compile.SLASH,
 | 
			
		||||
			compile.SLASHSLASH,
 | 
			
		||||
			compile.PERCENT,
 | 
			
		||||
			compile.AMP,
 | 
			
		||||
			compile.PIPE,
 | 
			
		||||
			compile.CIRCUMFLEX,
 | 
			
		||||
			compile.LTLT,
 | 
			
		||||
			compile.GTGT,
 | 
			
		||||
			compile.IN:
 | 
			
		||||
			binop := syntax.Token(op-compile.PLUS) + syntax.PLUS
 | 
			
		||||
			if op == compile.IN {
 | 
			
		||||
				binop = syntax.IN // IN token is out of order
 | 
			
		||||
			}
 | 
			
		||||
			y := stack[sp-1]
 | 
			
		||||
			x := stack[sp-2]
 | 
			
		||||
			sp -= 2
 | 
			
		||||
			z, err2 := Binary(binop, x, y)
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = z
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.UPLUS, compile.UMINUS, compile.TILDE:
 | 
			
		||||
			var unop syntax.Token
 | 
			
		||||
			if op == compile.TILDE {
 | 
			
		||||
				unop = syntax.TILDE
 | 
			
		||||
			} else {
 | 
			
		||||
				unop = syntax.Token(op-compile.UPLUS) + syntax.PLUS
 | 
			
		||||
			}
 | 
			
		||||
			x := stack[sp-1]
 | 
			
		||||
			y, err2 := Unary(unop, x)
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp-1] = y
 | 
			
		||||
 | 
			
		||||
		case compile.INPLACE_ADD:
 | 
			
		||||
			y := stack[sp-1]
 | 
			
		||||
			x := stack[sp-2]
 | 
			
		||||
			sp -= 2
 | 
			
		||||
 | 
			
		||||
			// It's possible that y is not Iterable but
 | 
			
		||||
			// nonetheless defines x+y, in which case we
 | 
			
		||||
			// should fall back to the general case.
 | 
			
		||||
			var z Value
 | 
			
		||||
			if xlist, ok := x.(*List); ok {
 | 
			
		||||
				if yiter, ok := y.(Iterable); ok {
 | 
			
		||||
					if err = xlist.checkMutable("apply += to"); err != nil {
 | 
			
		||||
						break loop
 | 
			
		||||
					}
 | 
			
		||||
					listExtend(xlist, yiter)
 | 
			
		||||
					z = xlist
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if z == nil {
 | 
			
		||||
				z, err = Binary(syntax.PLUS, x, y)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					break loop
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			stack[sp] = z
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.INPLACE_PIPE:
 | 
			
		||||
			y := stack[sp-1]
 | 
			
		||||
			x := stack[sp-2]
 | 
			
		||||
			sp -= 2
 | 
			
		||||
 | 
			
		||||
			// It's possible that y is not Dict but
 | 
			
		||||
			// nonetheless defines x|y, in which case we
 | 
			
		||||
			// should fall back to the general case.
 | 
			
		||||
			var z Value
 | 
			
		||||
			if xdict, ok := x.(*Dict); ok {
 | 
			
		||||
				if ydict, ok := y.(*Dict); ok {
 | 
			
		||||
					if err = xdict.ht.checkMutable("apply |= to"); err != nil {
 | 
			
		||||
						break loop
 | 
			
		||||
					}
 | 
			
		||||
					xdict.ht.addAll(&ydict.ht) // can't fail
 | 
			
		||||
					z = xdict
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if z == nil {
 | 
			
		||||
				z, err = Binary(syntax.PIPE, x, y)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					break loop
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			stack[sp] = z
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.NONE:
 | 
			
		||||
			stack[sp] = None
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.TRUE:
 | 
			
		||||
			stack[sp] = True
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.FALSE:
 | 
			
		||||
			stack[sp] = False
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.MANDATORY:
 | 
			
		||||
			stack[sp] = mandatory{}
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.JMP:
 | 
			
		||||
			pc = arg
 | 
			
		||||
 | 
			
		||||
		case compile.CALL, compile.CALL_VAR, compile.CALL_KW, compile.CALL_VAR_KW:
 | 
			
		||||
			var kwargs Value
 | 
			
		||||
			if op == compile.CALL_KW || op == compile.CALL_VAR_KW {
 | 
			
		||||
				kwargs = stack[sp-1]
 | 
			
		||||
				sp--
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var args Value
 | 
			
		||||
			if op == compile.CALL_VAR || op == compile.CALL_VAR_KW {
 | 
			
		||||
				args = stack[sp-1]
 | 
			
		||||
				sp--
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// named args (pairs)
 | 
			
		||||
			var kvpairs []Tuple
 | 
			
		||||
			if nkvpairs := int(arg & 0xff); nkvpairs > 0 {
 | 
			
		||||
				kvpairs = make([]Tuple, 0, nkvpairs)
 | 
			
		||||
				kvpairsAlloc := make(Tuple, 2*nkvpairs) // allocate a single backing array
 | 
			
		||||
				sp -= 2 * nkvpairs
 | 
			
		||||
				for i := 0; i < nkvpairs; i++ {
 | 
			
		||||
					pair := kvpairsAlloc[:2:2]
 | 
			
		||||
					kvpairsAlloc = kvpairsAlloc[2:]
 | 
			
		||||
					pair[0] = stack[sp+2*i]   // name
 | 
			
		||||
					pair[1] = stack[sp+2*i+1] // value
 | 
			
		||||
					kvpairs = append(kvpairs, pair)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if kwargs != nil {
 | 
			
		||||
				// Add key/value items from **kwargs dictionary.
 | 
			
		||||
				dict, ok := kwargs.(IterableMapping)
 | 
			
		||||
				if !ok {
 | 
			
		||||
					err = fmt.Errorf("argument after ** must be a mapping, not %s", kwargs.Type())
 | 
			
		||||
					break loop
 | 
			
		||||
				}
 | 
			
		||||
				items := dict.Items()
 | 
			
		||||
				for _, item := range items {
 | 
			
		||||
					if _, ok := item[0].(String); !ok {
 | 
			
		||||
						err = fmt.Errorf("keywords must be strings, not %s", item[0].Type())
 | 
			
		||||
						break loop
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if len(kvpairs) == 0 {
 | 
			
		||||
					kvpairs = items
 | 
			
		||||
				} else {
 | 
			
		||||
					kvpairs = append(kvpairs, items...)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// positional args
 | 
			
		||||
			var positional Tuple
 | 
			
		||||
			if npos := int(arg >> 8); npos > 0 {
 | 
			
		||||
				positional = stack[sp-npos : sp]
 | 
			
		||||
				sp -= npos
 | 
			
		||||
 | 
			
		||||
				// Copy positional arguments into a new array,
 | 
			
		||||
				// unless the callee is another Starlark function,
 | 
			
		||||
				// in which case it can be trusted not to mutate them.
 | 
			
		||||
				if _, ok := stack[sp-1].(*Function); !ok || args != nil {
 | 
			
		||||
					positional = append(Tuple(nil), positional...)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if args != nil {
 | 
			
		||||
				// Add elements from *args sequence.
 | 
			
		||||
				iter := Iterate(args)
 | 
			
		||||
				if iter == nil {
 | 
			
		||||
					err = fmt.Errorf("argument after * must be iterable, not %s", args.Type())
 | 
			
		||||
					break loop
 | 
			
		||||
				}
 | 
			
		||||
				var elem Value
 | 
			
		||||
				for iter.Next(&elem) {
 | 
			
		||||
					positional = append(positional, elem)
 | 
			
		||||
				}
 | 
			
		||||
				iter.Done()
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			function := stack[sp-1]
 | 
			
		||||
 | 
			
		||||
			if vmdebug {
 | 
			
		||||
				fmt.Printf("VM call %s args=%s kwargs=%s @%s\n",
 | 
			
		||||
					function, positional, kvpairs, f.Position(fr.pc))
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			thread.endProfSpan()
 | 
			
		||||
			z, err2 := Call(thread, function, positional, kvpairs)
 | 
			
		||||
			thread.beginProfSpan()
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			if vmdebug {
 | 
			
		||||
				fmt.Printf("Resuming %s @ %s\n", f.Name, f.Position(0))
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp-1] = z
 | 
			
		||||
 | 
			
		||||
		case compile.ITERPUSH:
 | 
			
		||||
			x := stack[sp-1]
 | 
			
		||||
			sp--
 | 
			
		||||
			iter := Iterate(x)
 | 
			
		||||
			if iter == nil {
 | 
			
		||||
				err = fmt.Errorf("%s value is not iterable", x.Type())
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			iterstack = append(iterstack, iter)
 | 
			
		||||
 | 
			
		||||
		case compile.ITERJMP:
 | 
			
		||||
			iter := iterstack[len(iterstack)-1]
 | 
			
		||||
			if iter.Next(&stack[sp]) {
 | 
			
		||||
				sp++
 | 
			
		||||
			} else {
 | 
			
		||||
				pc = arg
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case compile.ITERPOP:
 | 
			
		||||
			n := len(iterstack) - 1
 | 
			
		||||
			iterstack[n].Done()
 | 
			
		||||
			iterstack = iterstack[:n]
 | 
			
		||||
 | 
			
		||||
		case compile.NOT:
 | 
			
		||||
			stack[sp-1] = !stack[sp-1].Truth()
 | 
			
		||||
 | 
			
		||||
		case compile.RETURN:
 | 
			
		||||
			result = stack[sp-1]
 | 
			
		||||
			break loop
 | 
			
		||||
 | 
			
		||||
		case compile.SETINDEX:
 | 
			
		||||
			z := stack[sp-1]
 | 
			
		||||
			y := stack[sp-2]
 | 
			
		||||
			x := stack[sp-3]
 | 
			
		||||
			sp -= 3
 | 
			
		||||
			err = setIndex(x, y, z)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case compile.INDEX:
 | 
			
		||||
			y := stack[sp-1]
 | 
			
		||||
			x := stack[sp-2]
 | 
			
		||||
			sp -= 2
 | 
			
		||||
			z, err2 := getIndex(x, y)
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = z
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.ATTR:
 | 
			
		||||
			x := stack[sp-1]
 | 
			
		||||
			name := f.Prog.Names[arg]
 | 
			
		||||
			y, err2 := getAttr(x, name)
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp-1] = y
 | 
			
		||||
 | 
			
		||||
		case compile.SETFIELD:
 | 
			
		||||
			y := stack[sp-1]
 | 
			
		||||
			x := stack[sp-2]
 | 
			
		||||
			sp -= 2
 | 
			
		||||
			name := f.Prog.Names[arg]
 | 
			
		||||
			if err2 := setField(x, name, y); err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case compile.MAKEDICT:
 | 
			
		||||
			stack[sp] = new(Dict)
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.SETDICT, compile.SETDICTUNIQ:
 | 
			
		||||
			dict := stack[sp-3].(*Dict)
 | 
			
		||||
			k := stack[sp-2]
 | 
			
		||||
			v := stack[sp-1]
 | 
			
		||||
			sp -= 3
 | 
			
		||||
			oldlen := dict.Len()
 | 
			
		||||
			if err2 := dict.SetKey(k, v); err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			if op == compile.SETDICTUNIQ && dict.Len() == oldlen {
 | 
			
		||||
				err = fmt.Errorf("duplicate key: %v", k)
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case compile.APPEND:
 | 
			
		||||
			elem := stack[sp-1]
 | 
			
		||||
			list := stack[sp-2].(*List)
 | 
			
		||||
			sp -= 2
 | 
			
		||||
			list.elems = append(list.elems, elem)
 | 
			
		||||
 | 
			
		||||
		case compile.SLICE:
 | 
			
		||||
			x := stack[sp-4]
 | 
			
		||||
			lo := stack[sp-3]
 | 
			
		||||
			hi := stack[sp-2]
 | 
			
		||||
			step := stack[sp-1]
 | 
			
		||||
			sp -= 4
 | 
			
		||||
			res, err2 := slice(x, lo, hi, step)
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				err = err2
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = res
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.UNPACK:
 | 
			
		||||
			n := int(arg)
 | 
			
		||||
			iterable := stack[sp-1]
 | 
			
		||||
			sp--
 | 
			
		||||
			iter := Iterate(iterable)
 | 
			
		||||
			if iter == nil {
 | 
			
		||||
				err = fmt.Errorf("got %s in sequence assignment", iterable.Type())
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			i := 0
 | 
			
		||||
			sp += n
 | 
			
		||||
			for i < n && iter.Next(&stack[sp-1-i]) {
 | 
			
		||||
				i++
 | 
			
		||||
			}
 | 
			
		||||
			var dummy Value
 | 
			
		||||
			if iter.Next(&dummy) {
 | 
			
		||||
				// NB: Len may return -1 here in obscure cases.
 | 
			
		||||
				err = fmt.Errorf("too many values to unpack (got %d, want %d)", Len(iterable), n)
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			iter.Done()
 | 
			
		||||
			if i < n {
 | 
			
		||||
				err = fmt.Errorf("too few values to unpack (got %d, want %d)", i, n)
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case compile.CJMP:
 | 
			
		||||
			if stack[sp-1].Truth() {
 | 
			
		||||
				pc = arg
 | 
			
		||||
			}
 | 
			
		||||
			sp--
 | 
			
		||||
 | 
			
		||||
		case compile.CONSTANT:
 | 
			
		||||
			stack[sp] = fn.module.constants[arg]
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.MAKETUPLE:
 | 
			
		||||
			n := int(arg)
 | 
			
		||||
			tuple := make(Tuple, n)
 | 
			
		||||
			sp -= n
 | 
			
		||||
			copy(tuple, stack[sp:])
 | 
			
		||||
			stack[sp] = tuple
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.MAKELIST:
 | 
			
		||||
			n := int(arg)
 | 
			
		||||
			elems := make([]Value, n)
 | 
			
		||||
			sp -= n
 | 
			
		||||
			copy(elems, stack[sp:])
 | 
			
		||||
			stack[sp] = NewList(elems)
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.MAKEFUNC:
 | 
			
		||||
			funcode := f.Prog.Functions[arg]
 | 
			
		||||
			tuple := stack[sp-1].(Tuple)
 | 
			
		||||
			n := len(tuple) - len(funcode.Freevars)
 | 
			
		||||
			defaults := tuple[:n:n]
 | 
			
		||||
			freevars := tuple[n:]
 | 
			
		||||
			stack[sp-1] = &Function{
 | 
			
		||||
				funcode:  funcode,
 | 
			
		||||
				module:   fn.module,
 | 
			
		||||
				defaults: defaults,
 | 
			
		||||
				freevars: freevars,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case compile.LOAD:
 | 
			
		||||
			n := int(arg)
 | 
			
		||||
			module := string(stack[sp-1].(String))
 | 
			
		||||
			sp--
 | 
			
		||||
 | 
			
		||||
			if thread.Load == nil {
 | 
			
		||||
				err = fmt.Errorf("load not implemented by this application")
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			thread.endProfSpan()
 | 
			
		||||
			dict, err2 := thread.Load(thread, module)
 | 
			
		||||
			thread.beginProfSpan()
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				err = wrappedError{
 | 
			
		||||
					msg:   fmt.Sprintf("cannot load %s: %v", module, err2),
 | 
			
		||||
					cause: err2,
 | 
			
		||||
				}
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for i := 0; i < n; i++ {
 | 
			
		||||
				from := string(stack[sp-1-i].(String))
 | 
			
		||||
				v, ok := dict[from]
 | 
			
		||||
				if !ok {
 | 
			
		||||
					err = fmt.Errorf("load: name %s not found in module %s", from, module)
 | 
			
		||||
					if n := spell.Nearest(from, dict.Keys()); n != "" {
 | 
			
		||||
						err = fmt.Errorf("%s (did you mean %s?)", err, n)
 | 
			
		||||
					}
 | 
			
		||||
					break loop
 | 
			
		||||
				}
 | 
			
		||||
				stack[sp-1-i] = v
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case compile.SETLOCAL:
 | 
			
		||||
			locals[arg] = stack[sp-1]
 | 
			
		||||
			sp--
 | 
			
		||||
 | 
			
		||||
		case compile.SETLOCALCELL:
 | 
			
		||||
			locals[arg].(*cell).v = stack[sp-1]
 | 
			
		||||
			sp--
 | 
			
		||||
 | 
			
		||||
		case compile.SETGLOBAL:
 | 
			
		||||
			fn.module.globals[arg] = stack[sp-1]
 | 
			
		||||
			sp--
 | 
			
		||||
 | 
			
		||||
		case compile.LOCAL:
 | 
			
		||||
			x := locals[arg]
 | 
			
		||||
			if x == nil {
 | 
			
		||||
				err = fmt.Errorf("local variable %s referenced before assignment", f.Locals[arg].Name)
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = x
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.FREE:
 | 
			
		||||
			stack[sp] = fn.freevars[arg]
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.LOCALCELL:
 | 
			
		||||
			v := locals[arg].(*cell).v
 | 
			
		||||
			if v == nil {
 | 
			
		||||
				err = fmt.Errorf("local variable %s referenced before assignment", f.Locals[arg].Name)
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = v
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.FREECELL:
 | 
			
		||||
			v := fn.freevars[arg].(*cell).v
 | 
			
		||||
			if v == nil {
 | 
			
		||||
				err = fmt.Errorf("local variable %s referenced before assignment", f.Freevars[arg].Name)
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = v
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.GLOBAL:
 | 
			
		||||
			x := fn.module.globals[arg]
 | 
			
		||||
			if x == nil {
 | 
			
		||||
				err = fmt.Errorf("global variable %s referenced before assignment", f.Prog.Globals[arg].Name)
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = x
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.PREDECLARED:
 | 
			
		||||
			name := f.Prog.Names[arg]
 | 
			
		||||
			x := fn.module.predeclared[name]
 | 
			
		||||
			if x == nil {
 | 
			
		||||
				err = fmt.Errorf("internal error: predeclared variable %s is uninitialized", name)
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			stack[sp] = x
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		case compile.UNIVERSAL:
 | 
			
		||||
			stack[sp] = Universe[f.Prog.Names[arg]]
 | 
			
		||||
			sp++
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			err = fmt.Errorf("unimplemented: %s", op)
 | 
			
		||||
			break loop
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// (deferred cleanup runs here)
 | 
			
		||||
	return result, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type wrappedError struct {
 | 
			
		||||
	msg   string
 | 
			
		||||
	cause error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e wrappedError) Error() string {
 | 
			
		||||
	return e.msg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements the xerrors.Wrapper interface
 | 
			
		||||
// https://godoc.org/golang.org/x/xerrors#Wrapper
 | 
			
		||||
func (e wrappedError) Unwrap() error {
 | 
			
		||||
	return e.cause
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mandatory is a sentinel value used in a function's defaults tuple
 | 
			
		||||
// to indicate that a (keyword-only) parameter is mandatory.
 | 
			
		||||
type mandatory struct{}
 | 
			
		||||
 | 
			
		||||
func (mandatory) String() string        { return "mandatory" }
 | 
			
		||||
func (mandatory) Type() string          { return "mandatory" }
 | 
			
		||||
func (mandatory) Freeze()               {} // immutable
 | 
			
		||||
func (mandatory) Truth() Bool           { return False }
 | 
			
		||||
func (mandatory) Hash() (uint32, error) { return 0, nil }
 | 
			
		||||
 | 
			
		||||
// A cell is a box containing a Value.
 | 
			
		||||
// Local variables marked as cells hold their value indirectly
 | 
			
		||||
// so that they may be shared by outer and inner nested functions.
 | 
			
		||||
// Cells are always accessed using indirect {FREE,LOCAL,SETLOCAL}CELL instructions.
 | 
			
		||||
// The FreeVars tuple contains only cells.
 | 
			
		||||
// The FREE instruction always yields a cell.
 | 
			
		||||
type cell struct{ v Value }
 | 
			
		||||
 | 
			
		||||
func (c *cell) String() string { return "cell" }
 | 
			
		||||
func (c *cell) Type() string   { return "cell" }
 | 
			
		||||
func (c *cell) Freeze() {
 | 
			
		||||
	if c.v != nil {
 | 
			
		||||
		c.v.Freeze()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (c *cell) Truth() Bool           { panic("unreachable") }
 | 
			
		||||
func (c *cell) Hash() (uint32, error) { panic("unreachable") }
 | 
			
		||||
							
								
								
									
										2289
									
								
								vendor/go.starlark.net/starlark/library.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2289
									
								
								vendor/go.starlark.net/starlark/library.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										449
									
								
								vendor/go.starlark.net/starlark/profile.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										449
									
								
								vendor/go.starlark.net/starlark/profile.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,449 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
// This file defines a simple execution-time profiler for Starlark.
 | 
			
		||||
// It measures the wall time spent executing Starlark code, and emits a
 | 
			
		||||
// gzipped protocol message in pprof format (github.com/google/pprof).
 | 
			
		||||
//
 | 
			
		||||
// When profiling is enabled, the interpreter calls the profiler to
 | 
			
		||||
// indicate the start and end of each "span" or time interval. A leaf
 | 
			
		||||
// function (whether Go or Starlark) has a single span. A function that
 | 
			
		||||
// calls another function has spans for each interval in which it is the
 | 
			
		||||
// top of the stack. (A LOAD instruction also ends a span.)
 | 
			
		||||
//
 | 
			
		||||
// At the start of a span, the interpreter records the current time in
 | 
			
		||||
// the thread's topmost frame. At the end of the span, it obtains the
 | 
			
		||||
// time again and subtracts the span start time. The difference is added
 | 
			
		||||
// to an accumulator variable in the thread. If the accumulator exceeds
 | 
			
		||||
// some fixed quantum (10ms, say), the profiler records the current call
 | 
			
		||||
// stack and sends it to the profiler goroutine, along with the number
 | 
			
		||||
// of quanta, which are subtracted. For example, if the accumulator
 | 
			
		||||
// holds 3ms and then a completed span adds 25ms to it, its value is 28ms,
 | 
			
		||||
// which exceeeds 10ms. The profiler records a stack with the value 20ms
 | 
			
		||||
// (2 quanta), and the accumulator is left with 8ms.
 | 
			
		||||
//
 | 
			
		||||
// The profiler goroutine converts the stacks into the pprof format and
 | 
			
		||||
// emits a gzip-compressed protocol message to the designated output
 | 
			
		||||
// file. We use a hand-written streaming proto encoder to avoid
 | 
			
		||||
// dependencies on pprof and proto, and to avoid the need to
 | 
			
		||||
// materialize the profile data structure in memory.
 | 
			
		||||
//
 | 
			
		||||
// A limitation of this profiler is that it measures wall time, which
 | 
			
		||||
// does not necessarily correspond to CPU time. A CPU profiler requires
 | 
			
		||||
// that only running (not runnable) threads are sampled; this is
 | 
			
		||||
// commonly achieved by having the kernel deliver a (PROF) signal to an
 | 
			
		||||
// arbitrary running thread, through setitimer(2). The CPU profiler in the
 | 
			
		||||
// Go runtime uses this mechanism, but it is not possible for a Go
 | 
			
		||||
// application to register a SIGPROF handler, nor is it possible for a
 | 
			
		||||
// Go handler for some other signal to read the stack pointer of
 | 
			
		||||
// the interrupted thread.
 | 
			
		||||
//
 | 
			
		||||
// Two caveats:
 | 
			
		||||
// (1) it is tempting to send the leaf Frame directly to the profiler
 | 
			
		||||
// goroutine instead of making a copy of the stack, since a Frame is a
 | 
			
		||||
// spaghetti stack--a linked list. However, as soon as execution
 | 
			
		||||
// resumes, the stack's Frame.pc values may be mutated, so Frames are
 | 
			
		||||
// not safe to share with the asynchronous profiler goroutine.
 | 
			
		||||
// (2) it is tempting to use Callables as keys in a map when tabulating
 | 
			
		||||
// the pprof protocols's Function entities. However, we cannot assume
 | 
			
		||||
// that Callables are valid map keys, and furthermore we must not
 | 
			
		||||
// pin function values in memory indefinitely as this may cause lambda
 | 
			
		||||
// values to keep their free variables live much longer than necessary.
 | 
			
		||||
 | 
			
		||||
// TODO(adonovan):
 | 
			
		||||
// - make Start/Stop fully thread-safe.
 | 
			
		||||
// - fix the pc hack.
 | 
			
		||||
// - experiment with other values of quantum.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"compress/gzip"
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"time"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/syntax"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// StartProfile enables time profiling of all Starlark threads,
 | 
			
		||||
// and writes a profile in pprof format to w.
 | 
			
		||||
// It must be followed by a call to StopProfiler to stop
 | 
			
		||||
// the profiler and finalize the profile.
 | 
			
		||||
//
 | 
			
		||||
// StartProfile returns an error if profiling was already enabled.
 | 
			
		||||
//
 | 
			
		||||
// StartProfile must not be called concurrently with Starlark execution.
 | 
			
		||||
func StartProfile(w io.Writer) error {
 | 
			
		||||
	if !atomic.CompareAndSwapUint32(&profiler.on, 0, 1) {
 | 
			
		||||
		return fmt.Errorf("profiler already running")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO(adonovan): make the API fully concurrency-safe.
 | 
			
		||||
	// The main challenge is racy reads/writes of profiler.events,
 | 
			
		||||
	// and of send/close races on the channel it refers to.
 | 
			
		||||
	// It's easy to solve them with a mutex but harder to do
 | 
			
		||||
	// it efficiently.
 | 
			
		||||
 | 
			
		||||
	profiler.events = make(chan *profEvent, 1)
 | 
			
		||||
	profiler.done = make(chan error)
 | 
			
		||||
 | 
			
		||||
	go profile(w)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StopProfiler stops the profiler started by a prior call to
 | 
			
		||||
// StartProfile and finalizes the profile. It returns an error if the
 | 
			
		||||
// profile could not be completed.
 | 
			
		||||
//
 | 
			
		||||
// StopProfiler must not be called concurrently with Starlark execution.
 | 
			
		||||
func StopProfile() error {
 | 
			
		||||
	// Terminate the profiler goroutine and get its result.
 | 
			
		||||
	close(profiler.events)
 | 
			
		||||
	err := <-profiler.done
 | 
			
		||||
 | 
			
		||||
	profiler.done = nil
 | 
			
		||||
	profiler.events = nil
 | 
			
		||||
	atomic.StoreUint32(&profiler.on, 0)
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// globals
 | 
			
		||||
var profiler struct {
 | 
			
		||||
	on     uint32          // nonzero => profiler running
 | 
			
		||||
	events chan *profEvent // profile events from interpreter threads
 | 
			
		||||
	done   chan error      // indicates profiler goroutine is ready
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (thread *Thread) beginProfSpan() {
 | 
			
		||||
	if profiler.events == nil {
 | 
			
		||||
		return // profiling not enabled
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	thread.frameAt(0).spanStart = nanotime()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO(adonovan): experiment with smaller values,
 | 
			
		||||
// which trade space and time for greater precision.
 | 
			
		||||
const quantum = 10 * time.Millisecond
 | 
			
		||||
 | 
			
		||||
func (thread *Thread) endProfSpan() {
 | 
			
		||||
	if profiler.events == nil {
 | 
			
		||||
		return // profiling not enabled
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Add the span to the thread's accumulator.
 | 
			
		||||
	thread.proftime += time.Duration(nanotime() - thread.frameAt(0).spanStart)
 | 
			
		||||
	if thread.proftime < quantum {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Only record complete quanta.
 | 
			
		||||
	n := thread.proftime / quantum
 | 
			
		||||
	thread.proftime -= n * quantum
 | 
			
		||||
 | 
			
		||||
	// Copy the stack.
 | 
			
		||||
	// (We can't save thread.frame because its pc will change.)
 | 
			
		||||
	ev := &profEvent{
 | 
			
		||||
		thread: thread,
 | 
			
		||||
		time:   n * quantum,
 | 
			
		||||
	}
 | 
			
		||||
	ev.stack = ev.stackSpace[:0]
 | 
			
		||||
	for i := range thread.stack {
 | 
			
		||||
		fr := thread.frameAt(i)
 | 
			
		||||
		ev.stack = append(ev.stack, profFrame{
 | 
			
		||||
			pos: fr.Position(),
 | 
			
		||||
			fn:  fr.Callable(),
 | 
			
		||||
			pc:  fr.pc,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	profiler.events <- ev
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type profEvent struct {
 | 
			
		||||
	thread     *Thread // currently unused
 | 
			
		||||
	time       time.Duration
 | 
			
		||||
	stack      []profFrame
 | 
			
		||||
	stackSpace [8]profFrame // initial space for stack
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type profFrame struct {
 | 
			
		||||
	fn  Callable        // don't hold this live for too long (prevents GC of lambdas)
 | 
			
		||||
	pc  uint32          // program counter (Starlark frames only)
 | 
			
		||||
	pos syntax.Position // position of pc within this frame
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// profile is the profiler goroutine.
 | 
			
		||||
// It runs until StopProfiler is called.
 | 
			
		||||
func profile(w io.Writer) {
 | 
			
		||||
	// Field numbers from pprof protocol.
 | 
			
		||||
	// See https://github.com/google/pprof/blob/master/proto/profile.proto
 | 
			
		||||
	const (
 | 
			
		||||
		Profile_sample_type    = 1  // repeated ValueType
 | 
			
		||||
		Profile_sample         = 2  // repeated Sample
 | 
			
		||||
		Profile_mapping        = 3  // repeated Mapping
 | 
			
		||||
		Profile_location       = 4  // repeated Location
 | 
			
		||||
		Profile_function       = 5  // repeated Function
 | 
			
		||||
		Profile_string_table   = 6  // repeated string
 | 
			
		||||
		Profile_time_nanos     = 9  // int64
 | 
			
		||||
		Profile_duration_nanos = 10 // int64
 | 
			
		||||
		Profile_period_type    = 11 // ValueType
 | 
			
		||||
		Profile_period         = 12 // int64
 | 
			
		||||
 | 
			
		||||
		ValueType_type = 1 // int64
 | 
			
		||||
		ValueType_unit = 2 // int64
 | 
			
		||||
 | 
			
		||||
		Sample_location_id = 1 // repeated uint64
 | 
			
		||||
		Sample_value       = 2 // repeated int64
 | 
			
		||||
		Sample_label       = 3 // repeated Label
 | 
			
		||||
 | 
			
		||||
		Label_key      = 1 // int64
 | 
			
		||||
		Label_str      = 2 // int64
 | 
			
		||||
		Label_num      = 3 // int64
 | 
			
		||||
		Label_num_unit = 4 // int64
 | 
			
		||||
 | 
			
		||||
		Location_id         = 1 // uint64
 | 
			
		||||
		Location_mapping_id = 2 // uint64
 | 
			
		||||
		Location_address    = 3 // uint64
 | 
			
		||||
		Location_line       = 4 // repeated Line
 | 
			
		||||
 | 
			
		||||
		Line_function_id = 1 // uint64
 | 
			
		||||
		Line_line        = 2 // int64
 | 
			
		||||
 | 
			
		||||
		Function_id          = 1 // uint64
 | 
			
		||||
		Function_name        = 2 // int64
 | 
			
		||||
		Function_system_name = 3 // int64
 | 
			
		||||
		Function_filename    = 4 // int64
 | 
			
		||||
		Function_start_line  = 5 // int64
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	bufw := bufio.NewWriter(w) // write file in 4KB (not 240B flate-sized) chunks
 | 
			
		||||
	gz := gzip.NewWriter(bufw)
 | 
			
		||||
	enc := protoEncoder{w: gz}
 | 
			
		||||
 | 
			
		||||
	// strings
 | 
			
		||||
	stringIndex := make(map[string]int64)
 | 
			
		||||
	str := func(s string) int64 {
 | 
			
		||||
		i, ok := stringIndex[s]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			i = int64(len(stringIndex))
 | 
			
		||||
			enc.string(Profile_string_table, s)
 | 
			
		||||
			stringIndex[s] = i
 | 
			
		||||
		}
 | 
			
		||||
		return i
 | 
			
		||||
	}
 | 
			
		||||
	str("") // entry 0
 | 
			
		||||
 | 
			
		||||
	// functions
 | 
			
		||||
	//
 | 
			
		||||
	// function returns the ID of a Callable for use in Line.FunctionId.
 | 
			
		||||
	// The ID is the same as the function's logical address,
 | 
			
		||||
	// which is supplied by the caller to avoid the need to recompute it.
 | 
			
		||||
	functionId := make(map[uintptr]uint64)
 | 
			
		||||
	function := func(fn Callable, addr uintptr) uint64 {
 | 
			
		||||
		id, ok := functionId[addr]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			id = uint64(addr)
 | 
			
		||||
 | 
			
		||||
			var pos syntax.Position
 | 
			
		||||
			if fn, ok := fn.(callableWithPosition); ok {
 | 
			
		||||
				pos = fn.Position()
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			name := fn.Name()
 | 
			
		||||
			if name == "<toplevel>" {
 | 
			
		||||
				name = pos.Filename()
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			nameIndex := str(name)
 | 
			
		||||
 | 
			
		||||
			fun := new(bytes.Buffer)
 | 
			
		||||
			funenc := protoEncoder{w: fun}
 | 
			
		||||
			funenc.uint(Function_id, id)
 | 
			
		||||
			funenc.int(Function_name, nameIndex)
 | 
			
		||||
			funenc.int(Function_system_name, nameIndex)
 | 
			
		||||
			funenc.int(Function_filename, str(pos.Filename()))
 | 
			
		||||
			funenc.int(Function_start_line, int64(pos.Line))
 | 
			
		||||
			enc.bytes(Profile_function, fun.Bytes())
 | 
			
		||||
 | 
			
		||||
			functionId[addr] = id
 | 
			
		||||
		}
 | 
			
		||||
		return id
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// locations
 | 
			
		||||
	//
 | 
			
		||||
	// location returns the ID of the location denoted by fr.
 | 
			
		||||
	// For Starlark frames, this is the Frame pc.
 | 
			
		||||
	locationId := make(map[uintptr]uint64)
 | 
			
		||||
	location := func(fr profFrame) uint64 {
 | 
			
		||||
		fnAddr := profFuncAddr(fr.fn)
 | 
			
		||||
 | 
			
		||||
		// For Starlark functions, the frame position
 | 
			
		||||
		// represents the current PC value.
 | 
			
		||||
		// Mix it into the low bits of the address.
 | 
			
		||||
		// This is super hacky and may result in collisions
 | 
			
		||||
		// in large functions or if functions are numerous.
 | 
			
		||||
		// TODO(adonovan): fix: try making this cleaner by treating
 | 
			
		||||
		// each bytecode segment as a Profile.Mapping.
 | 
			
		||||
		pcAddr := fnAddr
 | 
			
		||||
		if _, ok := fr.fn.(*Function); ok {
 | 
			
		||||
			pcAddr = (pcAddr << 16) ^ uintptr(fr.pc)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		id, ok := locationId[pcAddr]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			id = uint64(pcAddr)
 | 
			
		||||
 | 
			
		||||
			line := new(bytes.Buffer)
 | 
			
		||||
			lineenc := protoEncoder{w: line}
 | 
			
		||||
			lineenc.uint(Line_function_id, function(fr.fn, fnAddr))
 | 
			
		||||
			lineenc.int(Line_line, int64(fr.pos.Line))
 | 
			
		||||
			loc := new(bytes.Buffer)
 | 
			
		||||
			locenc := protoEncoder{w: loc}
 | 
			
		||||
			locenc.uint(Location_id, id)
 | 
			
		||||
			locenc.uint(Location_address, uint64(pcAddr))
 | 
			
		||||
			locenc.bytes(Location_line, line.Bytes())
 | 
			
		||||
			enc.bytes(Profile_location, loc.Bytes())
 | 
			
		||||
 | 
			
		||||
			locationId[pcAddr] = id
 | 
			
		||||
		}
 | 
			
		||||
		return id
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wallNanos := new(bytes.Buffer)
 | 
			
		||||
	wnenc := protoEncoder{w: wallNanos}
 | 
			
		||||
	wnenc.int(ValueType_type, str("wall"))
 | 
			
		||||
	wnenc.int(ValueType_unit, str("nanoseconds"))
 | 
			
		||||
 | 
			
		||||
	// informational fields of Profile
 | 
			
		||||
	enc.bytes(Profile_sample_type, wallNanos.Bytes())
 | 
			
		||||
	enc.int(Profile_period, quantum.Nanoseconds())     // magnitude of sampling period
 | 
			
		||||
	enc.bytes(Profile_period_type, wallNanos.Bytes())  // dimension and unit of period
 | 
			
		||||
	enc.int(Profile_time_nanos, time.Now().UnixNano()) // start (real) time of profile
 | 
			
		||||
 | 
			
		||||
	startNano := nanotime()
 | 
			
		||||
 | 
			
		||||
	// Read profile events from the channel
 | 
			
		||||
	// until it is closed by StopProfiler.
 | 
			
		||||
	for e := range profiler.events {
 | 
			
		||||
		sample := new(bytes.Buffer)
 | 
			
		||||
		sampleenc := protoEncoder{w: sample}
 | 
			
		||||
		sampleenc.int(Sample_value, e.time.Nanoseconds()) // wall nanoseconds
 | 
			
		||||
		for _, fr := range e.stack {
 | 
			
		||||
			sampleenc.uint(Sample_location_id, location(fr))
 | 
			
		||||
		}
 | 
			
		||||
		enc.bytes(Profile_sample, sample.Bytes())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	endNano := nanotime()
 | 
			
		||||
	enc.int(Profile_duration_nanos, endNano-startNano)
 | 
			
		||||
 | 
			
		||||
	err := gz.Close() // Close reports any prior write error
 | 
			
		||||
	if flushErr := bufw.Flush(); err == nil {
 | 
			
		||||
		err = flushErr
 | 
			
		||||
	}
 | 
			
		||||
	profiler.done <- err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// nanotime returns the time in nanoseconds since epoch.
 | 
			
		||||
// It is implemented by runtime.nanotime using the linkname hack;
 | 
			
		||||
// runtime.nanotime is defined for all OSs/ARCHS and uses the
 | 
			
		||||
// monotonic system clock, which there is no portable way to access.
 | 
			
		||||
// Should that function ever go away, these alternatives exist:
 | 
			
		||||
//
 | 
			
		||||
// 	// POSIX only. REALTIME not MONOTONIC. 17ns.
 | 
			
		||||
// 	var tv syscall.Timeval
 | 
			
		||||
// 	syscall.Gettimeofday(&tv) // can't fail
 | 
			
		||||
// 	return tv.Nano()
 | 
			
		||||
//
 | 
			
		||||
// 	// Portable. REALTIME not MONOTONIC. 46ns.
 | 
			
		||||
// 	return time.Now().Nanoseconds()
 | 
			
		||||
//
 | 
			
		||||
//      // POSIX only. Adds a dependency.
 | 
			
		||||
//	import "golang.org/x/sys/unix"
 | 
			
		||||
//	var ts unix.Timespec
 | 
			
		||||
// 	unix.ClockGettime(CLOCK_MONOTONIC, &ts) // can't fail
 | 
			
		||||
//	return unix.TimespecToNsec(ts)
 | 
			
		||||
//
 | 
			
		||||
//go:linkname nanotime runtime.nanotime
 | 
			
		||||
func nanotime() int64
 | 
			
		||||
 | 
			
		||||
// profFuncAddr returns the canonical "address"
 | 
			
		||||
// of a Callable for use by the profiler.
 | 
			
		||||
func profFuncAddr(fn Callable) uintptr {
 | 
			
		||||
	switch fn := fn.(type) {
 | 
			
		||||
	case *Builtin:
 | 
			
		||||
		return reflect.ValueOf(fn.fn).Pointer()
 | 
			
		||||
	case *Function:
 | 
			
		||||
		return uintptr(unsafe.Pointer(fn.funcode))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// User-defined callable types are typically of
 | 
			
		||||
	// of kind pointer-to-struct. Handle them specially.
 | 
			
		||||
	if v := reflect.ValueOf(fn); v.Type().Kind() == reflect.Ptr {
 | 
			
		||||
		return v.Pointer()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Address zero is reserved by the protocol.
 | 
			
		||||
	// Use 1 for callables we don't recognize.
 | 
			
		||||
	log.Printf("Starlark profiler: no address for Callable %T", fn)
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// We encode the protocol message by hand to avoid making
 | 
			
		||||
// the interpreter depend on both github.com/google/pprof
 | 
			
		||||
// and github.com/golang/protobuf.
 | 
			
		||||
//
 | 
			
		||||
// This also avoids the need to materialize a protocol message object
 | 
			
		||||
// tree of unbounded size and serialize it all at the end.
 | 
			
		||||
// The pprof format appears to have been designed to
 | 
			
		||||
// permit streaming implementations such as this one.
 | 
			
		||||
//
 | 
			
		||||
// See https://developers.google.com/protocol-buffers/docs/encoding.
 | 
			
		||||
type protoEncoder struct {
 | 
			
		||||
	w   io.Writer // *bytes.Buffer or *gzip.Writer
 | 
			
		||||
	tmp [binary.MaxVarintLen64]byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *protoEncoder) uvarint(x uint64) {
 | 
			
		||||
	n := binary.PutUvarint(e.tmp[:], x)
 | 
			
		||||
	e.w.Write(e.tmp[:n])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *protoEncoder) tag(field, wire uint) {
 | 
			
		||||
	e.uvarint(uint64(field<<3 | wire))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *protoEncoder) string(field uint, s string) {
 | 
			
		||||
	e.tag(field, 2) // length-delimited
 | 
			
		||||
	e.uvarint(uint64(len(s)))
 | 
			
		||||
	io.WriteString(e.w, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *protoEncoder) bytes(field uint, b []byte) {
 | 
			
		||||
	e.tag(field, 2) // length-delimited
 | 
			
		||||
	e.uvarint(uint64(len(b)))
 | 
			
		||||
	e.w.Write(b)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *protoEncoder) uint(field uint, x uint64) {
 | 
			
		||||
	e.tag(field, 0) // varint
 | 
			
		||||
	e.uvarint(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *protoEncoder) int(field uint, x int64) {
 | 
			
		||||
	e.tag(field, 0) // varint
 | 
			
		||||
	e.uvarint(uint64(x))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										355
									
								
								vendor/go.starlark.net/starlark/unpack.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										355
									
								
								vendor/go.starlark.net/starlark/unpack.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,355 +0,0 @@
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
// This file defines the Unpack helper functions used by
 | 
			
		||||
// built-in functions to interpret their call arguments.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/internal/spell"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// An Unpacker defines custom argument unpacking behavior.
 | 
			
		||||
// See UnpackArgs.
 | 
			
		||||
type Unpacker interface {
 | 
			
		||||
	Unpack(v Value) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnpackArgs unpacks the positional and keyword arguments into the
 | 
			
		||||
// supplied parameter variables.  pairs is an alternating list of names
 | 
			
		||||
// and pointers to variables.
 | 
			
		||||
//
 | 
			
		||||
// If the variable is a bool, integer, string, *List, *Dict, Callable,
 | 
			
		||||
// Iterable, or user-defined implementation of Value,
 | 
			
		||||
// UnpackArgs performs the appropriate type check.
 | 
			
		||||
// Predeclared Go integer types uses the AsInt check.
 | 
			
		||||
//
 | 
			
		||||
// If the parameter name ends with "?", it is optional.
 | 
			
		||||
//
 | 
			
		||||
// If the parameter name ends with "??", it is optional and treats the None value
 | 
			
		||||
// as if the argument was absent.
 | 
			
		||||
//
 | 
			
		||||
// If a parameter is marked optional, then all following parameters are
 | 
			
		||||
// implicitly optional where or not they are marked.
 | 
			
		||||
//
 | 
			
		||||
// If the variable implements Unpacker, its Unpack argument
 | 
			
		||||
// is called with the argument value, allowing an application
 | 
			
		||||
// to define its own argument validation and conversion.
 | 
			
		||||
//
 | 
			
		||||
// If the variable implements Value, UnpackArgs may call
 | 
			
		||||
// its Type() method while constructing the error message.
 | 
			
		||||
//
 | 
			
		||||
// Examples:
 | 
			
		||||
//
 | 
			
		||||
//      var (
 | 
			
		||||
//          a Value
 | 
			
		||||
//          b = MakeInt(42)
 | 
			
		||||
//          c Value = starlark.None
 | 
			
		||||
//      )
 | 
			
		||||
//
 | 
			
		||||
//      // 1. mixed parameters, like def f(a, b=42, c=None).
 | 
			
		||||
//      err := UnpackArgs("f", args, kwargs, "a", &a, "b?", &b, "c?", &c)
 | 
			
		||||
//
 | 
			
		||||
//      // 2. keyword parameters only, like def f(*, a, b, c=None).
 | 
			
		||||
//      if len(args) > 0 {
 | 
			
		||||
//              return fmt.Errorf("f: unexpected positional arguments")
 | 
			
		||||
//      }
 | 
			
		||||
//      err := UnpackArgs("f", args, kwargs, "a", &a, "b?", &b, "c?", &c)
 | 
			
		||||
//
 | 
			
		||||
//      // 3. positional parameters only, like def f(a, b=42, c=None, /) in Python 3.8.
 | 
			
		||||
//      err := UnpackPositionalArgs("f", args, kwargs, 1, &a, &b, &c)
 | 
			
		||||
//
 | 
			
		||||
// More complex forms such as def f(a, b=42, *args, c, d=123, **kwargs)
 | 
			
		||||
// require additional logic, but their need in built-ins is exceedingly rare.
 | 
			
		||||
//
 | 
			
		||||
// In the examples above, the declaration of b with type Int causes UnpackArgs
 | 
			
		||||
// to require that b's argument value, if provided, is also an int.
 | 
			
		||||
// To allow arguments of any type, while retaining the default value of 42,
 | 
			
		||||
// declare b as a Value:
 | 
			
		||||
//
 | 
			
		||||
//	var b Value = MakeInt(42)
 | 
			
		||||
//
 | 
			
		||||
// The zero value of a variable of type Value, such as 'a' in the
 | 
			
		||||
// examples above, is not a valid Starlark value, so if the parameter is
 | 
			
		||||
// optional, the caller must explicitly handle the default case by
 | 
			
		||||
// interpreting nil as None or some computed default. The same is true
 | 
			
		||||
// for the zero values of variables of type *List, *Dict, Callable, or
 | 
			
		||||
// Iterable. For example:
 | 
			
		||||
//
 | 
			
		||||
//      // def myfunc(d=None, e=[], f={})
 | 
			
		||||
//      var (
 | 
			
		||||
//          d Value
 | 
			
		||||
//          e *List
 | 
			
		||||
//          f *Dict
 | 
			
		||||
//      )
 | 
			
		||||
//      err := UnpackArgs("myfunc", args, kwargs, "d?", &d, "e?", &e, "f?", &f)
 | 
			
		||||
//      if d == nil { d = None; }
 | 
			
		||||
//      if e == nil { e = new(List); }
 | 
			
		||||
//      if f == nil { f = new(Dict); }
 | 
			
		||||
//
 | 
			
		||||
func UnpackArgs(fnname string, args Tuple, kwargs []Tuple, pairs ...interface{}) error {
 | 
			
		||||
	nparams := len(pairs) / 2
 | 
			
		||||
	var defined intset
 | 
			
		||||
	defined.init(nparams)
 | 
			
		||||
 | 
			
		||||
	paramName := func(x interface{}) (name string, skipNone bool) { // (no free variables)
 | 
			
		||||
		name = x.(string)
 | 
			
		||||
		if strings.HasSuffix(name, "??") {
 | 
			
		||||
			name = strings.TrimSuffix(name, "??")
 | 
			
		||||
			skipNone = true
 | 
			
		||||
		} else if name[len(name)-1] == '?' {
 | 
			
		||||
			name = name[:len(name)-1]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return name, skipNone
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// positional arguments
 | 
			
		||||
	if len(args) > nparams {
 | 
			
		||||
		return fmt.Errorf("%s: got %d arguments, want at most %d",
 | 
			
		||||
			fnname, len(args), nparams)
 | 
			
		||||
	}
 | 
			
		||||
	for i, arg := range args {
 | 
			
		||||
		defined.set(i)
 | 
			
		||||
		name, skipNone := paramName(pairs[2*i])
 | 
			
		||||
		if skipNone {
 | 
			
		||||
			if _, isNone := arg.(NoneType); isNone {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if err := unpackOneArg(arg, pairs[2*i+1]); err != nil {
 | 
			
		||||
			return fmt.Errorf("%s: for parameter %s: %s", fnname, name, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// keyword arguments
 | 
			
		||||
kwloop:
 | 
			
		||||
	for _, item := range kwargs {
 | 
			
		||||
		name, arg := item[0].(String), item[1]
 | 
			
		||||
		for i := 0; i < nparams; i++ {
 | 
			
		||||
			pName, skipNone := paramName(pairs[2*i])
 | 
			
		||||
			if pName == string(name) {
 | 
			
		||||
				// found it
 | 
			
		||||
				if defined.set(i) {
 | 
			
		||||
					return fmt.Errorf("%s: got multiple values for keyword argument %s",
 | 
			
		||||
						fnname, name)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if skipNone {
 | 
			
		||||
					if _, isNone := arg.(NoneType); isNone {
 | 
			
		||||
						continue kwloop
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				ptr := pairs[2*i+1]
 | 
			
		||||
				if err := unpackOneArg(arg, ptr); err != nil {
 | 
			
		||||
					return fmt.Errorf("%s: for parameter %s: %s", fnname, name, err)
 | 
			
		||||
				}
 | 
			
		||||
				continue kwloop
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		err := fmt.Errorf("%s: unexpected keyword argument %s", fnname, name)
 | 
			
		||||
		names := make([]string, 0, nparams)
 | 
			
		||||
		for i := 0; i < nparams; i += 2 {
 | 
			
		||||
			param, _ := paramName(pairs[i])
 | 
			
		||||
			names = append(names, param)
 | 
			
		||||
		}
 | 
			
		||||
		if n := spell.Nearest(string(name), names); n != "" {
 | 
			
		||||
			err = fmt.Errorf("%s (did you mean %s?)", err.Error(), n)
 | 
			
		||||
		}
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check that all non-optional parameters are defined.
 | 
			
		||||
	// (We needn't check the first len(args).)
 | 
			
		||||
	for i := len(args); i < nparams; i++ {
 | 
			
		||||
		name := pairs[2*i].(string)
 | 
			
		||||
		if strings.HasSuffix(name, "?") {
 | 
			
		||||
			break // optional
 | 
			
		||||
		}
 | 
			
		||||
		if !defined.get(i) {
 | 
			
		||||
			return fmt.Errorf("%s: missing argument for %s", fnname, name)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnpackPositionalArgs unpacks the positional arguments into
 | 
			
		||||
// corresponding variables.  Each element of vars is a pointer; see
 | 
			
		||||
// UnpackArgs for allowed types and conversions.
 | 
			
		||||
//
 | 
			
		||||
// UnpackPositionalArgs reports an error if the number of arguments is
 | 
			
		||||
// less than min or greater than len(vars), if kwargs is nonempty, or if
 | 
			
		||||
// any conversion fails.
 | 
			
		||||
//
 | 
			
		||||
// See UnpackArgs for general comments.
 | 
			
		||||
func UnpackPositionalArgs(fnname string, args Tuple, kwargs []Tuple, min int, vars ...interface{}) error {
 | 
			
		||||
	if len(kwargs) > 0 {
 | 
			
		||||
		return fmt.Errorf("%s: unexpected keyword arguments", fnname)
 | 
			
		||||
	}
 | 
			
		||||
	max := len(vars)
 | 
			
		||||
	if len(args) < min {
 | 
			
		||||
		var atleast string
 | 
			
		||||
		if min < max {
 | 
			
		||||
			atleast = "at least "
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("%s: got %d arguments, want %s%d", fnname, len(args), atleast, min)
 | 
			
		||||
	}
 | 
			
		||||
	if len(args) > max {
 | 
			
		||||
		var atmost string
 | 
			
		||||
		if max > min {
 | 
			
		||||
			atmost = "at most "
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("%s: got %d arguments, want %s%d", fnname, len(args), atmost, max)
 | 
			
		||||
	}
 | 
			
		||||
	for i, arg := range args {
 | 
			
		||||
		if err := unpackOneArg(arg, vars[i]); err != nil {
 | 
			
		||||
			return fmt.Errorf("%s: for parameter %d: %s", fnname, i+1, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func unpackOneArg(v Value, ptr interface{}) error {
 | 
			
		||||
	// On failure, don't clobber *ptr.
 | 
			
		||||
	switch ptr := ptr.(type) {
 | 
			
		||||
	case Unpacker:
 | 
			
		||||
		return ptr.Unpack(v)
 | 
			
		||||
	case *Value:
 | 
			
		||||
		*ptr = v
 | 
			
		||||
	case *string:
 | 
			
		||||
		s, ok := AsString(v)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return fmt.Errorf("got %s, want string", v.Type())
 | 
			
		||||
		}
 | 
			
		||||
		*ptr = s
 | 
			
		||||
	case *bool:
 | 
			
		||||
		b, ok := v.(Bool)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return fmt.Errorf("got %s, want bool", v.Type())
 | 
			
		||||
		}
 | 
			
		||||
		*ptr = bool(b)
 | 
			
		||||
	case *int, *int8, *int16, *int32, *int64,
 | 
			
		||||
		*uint, *uint8, *uint16, *uint32, *uint64, *uintptr:
 | 
			
		||||
		return AsInt(v, ptr)
 | 
			
		||||
	case *float64:
 | 
			
		||||
		f, ok := v.(Float)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return fmt.Errorf("got %s, want float", v.Type())
 | 
			
		||||
		}
 | 
			
		||||
		*ptr = float64(f)
 | 
			
		||||
	case **List:
 | 
			
		||||
		list, ok := v.(*List)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return fmt.Errorf("got %s, want list", v.Type())
 | 
			
		||||
		}
 | 
			
		||||
		*ptr = list
 | 
			
		||||
	case **Dict:
 | 
			
		||||
		dict, ok := v.(*Dict)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return fmt.Errorf("got %s, want dict", v.Type())
 | 
			
		||||
		}
 | 
			
		||||
		*ptr = dict
 | 
			
		||||
	case *Callable:
 | 
			
		||||
		f, ok := v.(Callable)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return fmt.Errorf("got %s, want callable", v.Type())
 | 
			
		||||
		}
 | 
			
		||||
		*ptr = f
 | 
			
		||||
	case *Iterable:
 | 
			
		||||
		it, ok := v.(Iterable)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return fmt.Errorf("got %s, want iterable", v.Type())
 | 
			
		||||
		}
 | 
			
		||||
		*ptr = it
 | 
			
		||||
	default:
 | 
			
		||||
		// v must have type *V, where V is some subtype of starlark.Value.
 | 
			
		||||
		ptrv := reflect.ValueOf(ptr)
 | 
			
		||||
		if ptrv.Kind() != reflect.Ptr {
 | 
			
		||||
			log.Panicf("internal error: not a pointer: %T", ptr)
 | 
			
		||||
		}
 | 
			
		||||
		paramVar := ptrv.Elem()
 | 
			
		||||
		if !reflect.TypeOf(v).AssignableTo(paramVar.Type()) {
 | 
			
		||||
			// The value is not assignable to the variable.
 | 
			
		||||
 | 
			
		||||
			// Detect a possible bug in the Go program that called Unpack:
 | 
			
		||||
			// If the variable *ptr is not a subtype of Value,
 | 
			
		||||
			// no value of v can possibly work.
 | 
			
		||||
			if !paramVar.Type().AssignableTo(reflect.TypeOf(new(Value)).Elem()) {
 | 
			
		||||
				log.Panicf("pointer element type does not implement Value: %T", ptr)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Report Starlark dynamic type error.
 | 
			
		||||
			//
 | 
			
		||||
			// We prefer the Starlark Value.Type name over
 | 
			
		||||
			// its Go reflect.Type name, but calling the
 | 
			
		||||
			// Value.Type method on the variable is not safe
 | 
			
		||||
			// in general. If the variable is an interface,
 | 
			
		||||
			// the call will fail. Even if the variable has
 | 
			
		||||
			// a concrete type, it might not be safe to call
 | 
			
		||||
			// Type() on a zero instance. Thus we must use
 | 
			
		||||
			// recover.
 | 
			
		||||
 | 
			
		||||
			// Default to Go reflect.Type name
 | 
			
		||||
			paramType := paramVar.Type().String()
 | 
			
		||||
 | 
			
		||||
			// Attempt to call Value.Type method.
 | 
			
		||||
			func() {
 | 
			
		||||
				defer func() { recover() }()
 | 
			
		||||
				if typer, _ := paramVar.Interface().(interface{ Type() string }); typer != nil {
 | 
			
		||||
					paramType = typer.Type()
 | 
			
		||||
				}
 | 
			
		||||
			}()
 | 
			
		||||
			return fmt.Errorf("got %s, want %s", v.Type(), paramType)
 | 
			
		||||
		}
 | 
			
		||||
		paramVar.Set(reflect.ValueOf(v))
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type intset struct {
 | 
			
		||||
	small uint64       // bitset, used if n < 64
 | 
			
		||||
	large map[int]bool //    set, used if n >= 64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (is *intset) init(n int) {
 | 
			
		||||
	if n >= 64 {
 | 
			
		||||
		is.large = make(map[int]bool)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (is *intset) set(i int) (prev bool) {
 | 
			
		||||
	if is.large == nil {
 | 
			
		||||
		prev = is.small&(1<<uint(i)) != 0
 | 
			
		||||
		is.small |= 1 << uint(i)
 | 
			
		||||
	} else {
 | 
			
		||||
		prev = is.large[i]
 | 
			
		||||
		is.large[i] = true
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (is *intset) get(i int) bool {
 | 
			
		||||
	if is.large == nil {
 | 
			
		||||
		return is.small&(1<<uint(i)) != 0
 | 
			
		||||
	}
 | 
			
		||||
	return is.large[i]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (is *intset) len() int {
 | 
			
		||||
	if is.large == nil {
 | 
			
		||||
		// Suboptimal, but used only for error reporting.
 | 
			
		||||
		len := 0
 | 
			
		||||
		for i := 0; i < 64; i++ {
 | 
			
		||||
			if is.small&(1<<uint(i)) != 0 {
 | 
			
		||||
				len++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return len
 | 
			
		||||
	}
 | 
			
		||||
	return len(is.large)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1500
									
								
								vendor/go.starlark.net/starlark/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1500
									
								
								vendor/go.starlark.net/starlark/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										43
									
								
								vendor/go.starlark.net/starlarkstruct/module.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								vendor/go.starlark.net/starlarkstruct/module.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,43 +0,0 @@
 | 
			
		||||
package starlarkstruct
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/starlark"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A Module is a named collection of values,
 | 
			
		||||
// typically a suite of functions imported by a load statement.
 | 
			
		||||
//
 | 
			
		||||
// It differs from Struct primarily in that its string representation
 | 
			
		||||
// does not enumerate its fields.
 | 
			
		||||
type Module struct {
 | 
			
		||||
	Name    string
 | 
			
		||||
	Members starlark.StringDict
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ starlark.HasAttrs = (*Module)(nil)
 | 
			
		||||
 | 
			
		||||
func (m *Module) Attr(name string) (starlark.Value, error) { return m.Members[name], nil }
 | 
			
		||||
func (m *Module) AttrNames() []string                      { return m.Members.Keys() }
 | 
			
		||||
func (m *Module) Freeze()                                  { m.Members.Freeze() }
 | 
			
		||||
func (m *Module) Hash() (uint32, error)                    { return 0, fmt.Errorf("unhashable: %s", m.Type()) }
 | 
			
		||||
func (m *Module) String() string                           { return fmt.Sprintf("<module %q>", m.Name) }
 | 
			
		||||
func (m *Module) Truth() starlark.Bool                     { return true }
 | 
			
		||||
func (m *Module) Type() string                             { return "module" }
 | 
			
		||||
 | 
			
		||||
// MakeModule may be used as the implementation of a Starlark built-in
 | 
			
		||||
// function, module(name, **kwargs). It returns a new module with the
 | 
			
		||||
// specified name and members.
 | 
			
		||||
func MakeModule(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
 | 
			
		||||
	var name string
 | 
			
		||||
	if err := starlark.UnpackPositionalArgs(b.Name(), args, nil, 1, &name); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	members := make(starlark.StringDict, len(kwargs))
 | 
			
		||||
	for _, kwarg := range kwargs {
 | 
			
		||||
		k := string(kwarg[0].(starlark.String))
 | 
			
		||||
		members[k] = kwarg[1]
 | 
			
		||||
	}
 | 
			
		||||
	return &Module{name, members}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										282
									
								
								vendor/go.starlark.net/starlarkstruct/struct.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										282
									
								
								vendor/go.starlark.net/starlarkstruct/struct.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,282 +0,0 @@
 | 
			
		||||
// Copyright 2017 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package starlarkstruct defines the Starlark types 'struct' and
 | 
			
		||||
// 'module', both optional language extensions.
 | 
			
		||||
//
 | 
			
		||||
package starlarkstruct // import "go.starlark.net/starlarkstruct"
 | 
			
		||||
 | 
			
		||||
// It is tempting to introduce a variant of Struct that is a wrapper
 | 
			
		||||
// around a Go struct value, for stronger typing guarantees and more
 | 
			
		||||
// efficient and convenient field lookup. However:
 | 
			
		||||
// 1) all fields of Starlark structs are optional, so we cannot represent
 | 
			
		||||
//    them using more specific types such as String, Int, *Depset, and
 | 
			
		||||
//    *File, as such types give no way to represent missing fields.
 | 
			
		||||
// 2) the efficiency gain of direct struct field access is rather
 | 
			
		||||
//    marginal: finding the index of a field by binary searching on the
 | 
			
		||||
//    sorted list of field names is quite fast compared to the other
 | 
			
		||||
//    overheads.
 | 
			
		||||
// 3) the gains in compactness and spatial locality are also rather
 | 
			
		||||
//    marginal: the array behind the []entry slice is (due to field name
 | 
			
		||||
//    strings) only a factor of 2 larger than the corresponding Go struct
 | 
			
		||||
//    would be, and, like the Go struct, requires only a single allocation.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/starlark"
 | 
			
		||||
	"go.starlark.net/syntax"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Make is the implementation of a built-in function that instantiates
 | 
			
		||||
// an immutable struct from the specified keyword arguments.
 | 
			
		||||
//
 | 
			
		||||
// An application can add 'struct' to the Starlark environment like so:
 | 
			
		||||
//
 | 
			
		||||
// 	globals := starlark.StringDict{
 | 
			
		||||
// 		"struct":  starlark.NewBuiltin("struct", starlarkstruct.Make),
 | 
			
		||||
// 	}
 | 
			
		||||
//
 | 
			
		||||
func Make(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
 | 
			
		||||
	if len(args) > 0 {
 | 
			
		||||
		return nil, fmt.Errorf("struct: unexpected positional arguments")
 | 
			
		||||
	}
 | 
			
		||||
	return FromKeywords(Default, kwargs), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FromKeywords returns a new struct instance whose fields are specified by the
 | 
			
		||||
// key/value pairs in kwargs.  (Each kwargs[i][0] must be a starlark.String.)
 | 
			
		||||
func FromKeywords(constructor starlark.Value, kwargs []starlark.Tuple) *Struct {
 | 
			
		||||
	if constructor == nil {
 | 
			
		||||
		panic("nil constructor")
 | 
			
		||||
	}
 | 
			
		||||
	s := &Struct{
 | 
			
		||||
		constructor: constructor,
 | 
			
		||||
		entries:     make(entries, 0, len(kwargs)),
 | 
			
		||||
	}
 | 
			
		||||
	for _, kwarg := range kwargs {
 | 
			
		||||
		k := string(kwarg[0].(starlark.String))
 | 
			
		||||
		v := kwarg[1]
 | 
			
		||||
		s.entries = append(s.entries, entry{k, v})
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(s.entries)
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FromStringDict returns a new struct instance whose elements are those of d.
 | 
			
		||||
// The constructor parameter specifies the constructor; use Default for an ordinary struct.
 | 
			
		||||
func FromStringDict(constructor starlark.Value, d starlark.StringDict) *Struct {
 | 
			
		||||
	if constructor == nil {
 | 
			
		||||
		panic("nil constructor")
 | 
			
		||||
	}
 | 
			
		||||
	s := &Struct{
 | 
			
		||||
		constructor: constructor,
 | 
			
		||||
		entries:     make(entries, 0, len(d)),
 | 
			
		||||
	}
 | 
			
		||||
	for k, v := range d {
 | 
			
		||||
		s.entries = append(s.entries, entry{k, v})
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(s.entries)
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Struct is an immutable Starlark type that maps field names to values.
 | 
			
		||||
// It is not iterable and does not support len.
 | 
			
		||||
//
 | 
			
		||||
// A struct has a constructor, a distinct value that identifies a class
 | 
			
		||||
// of structs, and which appears in the struct's string representation.
 | 
			
		||||
//
 | 
			
		||||
// Operations such as x+y fail if the constructors of the two operands
 | 
			
		||||
// are not equal.
 | 
			
		||||
//
 | 
			
		||||
// The default constructor, Default, is the string "struct", but
 | 
			
		||||
// clients may wish to 'brand' structs for their own purposes.
 | 
			
		||||
// The constructor value appears in the printed form of the value,
 | 
			
		||||
// and is accessible using the Constructor method.
 | 
			
		||||
//
 | 
			
		||||
// Use Attr to access its fields and AttrNames to enumerate them.
 | 
			
		||||
type Struct struct {
 | 
			
		||||
	constructor starlark.Value
 | 
			
		||||
	entries     entries // sorted by name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Default is the default constructor for structs.
 | 
			
		||||
// It is merely the string "struct".
 | 
			
		||||
const Default = starlark.String("struct")
 | 
			
		||||
 | 
			
		||||
type entries []entry
 | 
			
		||||
 | 
			
		||||
func (a entries) Len() int           { return len(a) }
 | 
			
		||||
func (a entries) Less(i, j int) bool { return a[i].name < a[j].name }
 | 
			
		||||
func (a entries) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
 | 
			
		||||
 | 
			
		||||
type entry struct {
 | 
			
		||||
	name  string
 | 
			
		||||
	value starlark.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ starlark.HasAttrs  = (*Struct)(nil)
 | 
			
		||||
	_ starlark.HasBinary = (*Struct)(nil)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ToStringDict adds a name/value entry to d for each field of the struct.
 | 
			
		||||
func (s *Struct) ToStringDict(d starlark.StringDict) {
 | 
			
		||||
	for _, e := range s.entries {
 | 
			
		||||
		d[e.name] = e.value
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Struct) String() string {
 | 
			
		||||
	buf := new(strings.Builder)
 | 
			
		||||
	switch constructor := s.constructor.(type) {
 | 
			
		||||
	case starlark.String:
 | 
			
		||||
		// NB: The Java implementation always prints struct
 | 
			
		||||
		// even for Bazel provider instances.
 | 
			
		||||
		buf.WriteString(constructor.GoString()) // avoid String()'s quotation
 | 
			
		||||
	default:
 | 
			
		||||
		buf.WriteString(s.constructor.String())
 | 
			
		||||
	}
 | 
			
		||||
	buf.WriteByte('(')
 | 
			
		||||
	for i, e := range s.entries {
 | 
			
		||||
		if i > 0 {
 | 
			
		||||
			buf.WriteString(", ")
 | 
			
		||||
		}
 | 
			
		||||
		buf.WriteString(e.name)
 | 
			
		||||
		buf.WriteString(" = ")
 | 
			
		||||
		buf.WriteString(e.value.String())
 | 
			
		||||
	}
 | 
			
		||||
	buf.WriteByte(')')
 | 
			
		||||
	return buf.String()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Constructor returns the constructor used to create this struct.
 | 
			
		||||
func (s *Struct) Constructor() starlark.Value { return s.constructor }
 | 
			
		||||
 | 
			
		||||
func (s *Struct) Type() string         { return "struct" }
 | 
			
		||||
func (s *Struct) Truth() starlark.Bool { return true } // even when empty
 | 
			
		||||
func (s *Struct) Hash() (uint32, error) {
 | 
			
		||||
	// Same algorithm as Tuple.hash, but with different primes.
 | 
			
		||||
	var x, m uint32 = 8731, 9839
 | 
			
		||||
	for _, e := range s.entries {
 | 
			
		||||
		namehash, _ := starlark.String(e.name).Hash()
 | 
			
		||||
		x = x ^ 3*namehash
 | 
			
		||||
		y, err := e.value.Hash()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
		x = x ^ y*m
 | 
			
		||||
		m += 7349
 | 
			
		||||
	}
 | 
			
		||||
	return x, nil
 | 
			
		||||
}
 | 
			
		||||
func (s *Struct) Freeze() {
 | 
			
		||||
	for _, e := range s.entries {
 | 
			
		||||
		e.value.Freeze()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Struct) Binary(op syntax.Token, y starlark.Value, side starlark.Side) (starlark.Value, error) {
 | 
			
		||||
	if y, ok := y.(*Struct); ok && op == syntax.PLUS {
 | 
			
		||||
		if side == starlark.Right {
 | 
			
		||||
			x, y = y, x
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if eq, err := starlark.Equal(x.constructor, y.constructor); err != nil {
 | 
			
		||||
			return nil, fmt.Errorf("in %s + %s: error comparing constructors: %v",
 | 
			
		||||
				x.constructor, y.constructor, err)
 | 
			
		||||
		} else if !eq {
 | 
			
		||||
			return nil, fmt.Errorf("cannot add structs of different constructors: %s + %s",
 | 
			
		||||
				x.constructor, y.constructor)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		z := make(starlark.StringDict, x.len()+y.len())
 | 
			
		||||
		for _, e := range x.entries {
 | 
			
		||||
			z[e.name] = e.value
 | 
			
		||||
		}
 | 
			
		||||
		for _, e := range y.entries {
 | 
			
		||||
			z[e.name] = e.value
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return FromStringDict(x.constructor, z), nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil, nil // unhandled
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Attr returns the value of the specified field.
 | 
			
		||||
func (s *Struct) Attr(name string) (starlark.Value, error) {
 | 
			
		||||
	// Binary search the entries.
 | 
			
		||||
	// This implementation is a specialization of
 | 
			
		||||
	// sort.Search that avoids dynamic dispatch.
 | 
			
		||||
	n := len(s.entries)
 | 
			
		||||
	i, j := 0, n
 | 
			
		||||
	for i < j {
 | 
			
		||||
		h := int(uint(i+j) >> 1)
 | 
			
		||||
		if s.entries[h].name < name {
 | 
			
		||||
			i = h + 1
 | 
			
		||||
		} else {
 | 
			
		||||
			j = h
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if i < n && s.entries[i].name == name {
 | 
			
		||||
		return s.entries[i].value, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var ctor string
 | 
			
		||||
	if s.constructor != Default {
 | 
			
		||||
		ctor = s.constructor.String() + " "
 | 
			
		||||
	}
 | 
			
		||||
	return nil, starlark.NoSuchAttrError(
 | 
			
		||||
		fmt.Sprintf("%sstruct has no .%s attribute", ctor, name))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Struct) len() int { return len(s.entries) }
 | 
			
		||||
 | 
			
		||||
// AttrNames returns a new sorted list of the struct fields.
 | 
			
		||||
func (s *Struct) AttrNames() []string {
 | 
			
		||||
	names := make([]string, len(s.entries))
 | 
			
		||||
	for i, e := range s.entries {
 | 
			
		||||
		names[i] = e.name
 | 
			
		||||
	}
 | 
			
		||||
	return names
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Struct) CompareSameType(op syntax.Token, y_ starlark.Value, depth int) (bool, error) {
 | 
			
		||||
	y := y_.(*Struct)
 | 
			
		||||
	switch op {
 | 
			
		||||
	case syntax.EQL:
 | 
			
		||||
		return structsEqual(x, y, depth)
 | 
			
		||||
	case syntax.NEQ:
 | 
			
		||||
		eq, err := structsEqual(x, y, depth)
 | 
			
		||||
		return !eq, err
 | 
			
		||||
	default:
 | 
			
		||||
		return false, fmt.Errorf("%s %s %s not implemented", x.Type(), op, y.Type())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func structsEqual(x, y *Struct, depth int) (bool, error) {
 | 
			
		||||
	if x.len() != y.len() {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if eq, err := starlark.Equal(x.constructor, y.constructor); err != nil {
 | 
			
		||||
		return false, fmt.Errorf("error comparing struct constructors %v and %v: %v",
 | 
			
		||||
			x.constructor, y.constructor, err)
 | 
			
		||||
	} else if !eq {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, n := 0, x.len(); i < n; i++ {
 | 
			
		||||
		if x.entries[i].name != y.entries[i].name {
 | 
			
		||||
			return false, nil
 | 
			
		||||
		} else if eq, err := starlark.EqualDepth(x.entries[i].value, y.entries[i].value, depth-1); err != nil {
 | 
			
		||||
			return false, err
 | 
			
		||||
		} else if !eq {
 | 
			
		||||
			return false, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										129
									
								
								vendor/go.starlark.net/syntax/grammar.txt
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										129
									
								
								vendor/go.starlark.net/syntax/grammar.txt
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,129 +0,0 @@
 | 
			
		||||
 | 
			
		||||
Grammar of Starlark
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
File = {Statement | newline} eof .
 | 
			
		||||
 | 
			
		||||
Statement = DefStmt | IfStmt | ForStmt | WhileStmt | SimpleStmt .
 | 
			
		||||
 | 
			
		||||
DefStmt = 'def' identifier '(' [Parameters [',']] ')' ':' Suite .
 | 
			
		||||
 | 
			
		||||
Parameters = Parameter {',' Parameter}.
 | 
			
		||||
 | 
			
		||||
Parameter = identifier | identifier '=' Test | '*' | '*' identifier | '**' identifier .
 | 
			
		||||
 | 
			
		||||
IfStmt = 'if' Test ':' Suite {'elif' Test ':' Suite} ['else' ':' Suite] .
 | 
			
		||||
 | 
			
		||||
ForStmt = 'for' LoopVariables 'in' Expression ':' Suite .
 | 
			
		||||
 | 
			
		||||
WhileStmt = 'while' Test ':' Suite .
 | 
			
		||||
 | 
			
		||||
Suite = [newline indent {Statement} outdent] | SimpleStmt .
 | 
			
		||||
 | 
			
		||||
SimpleStmt = SmallStmt {';' SmallStmt} [';'] '\n' .
 | 
			
		||||
# NOTE: '\n' optional at EOF
 | 
			
		||||
 | 
			
		||||
SmallStmt = ReturnStmt
 | 
			
		||||
          | BreakStmt | ContinueStmt | PassStmt
 | 
			
		||||
          | AssignStmt
 | 
			
		||||
          | ExprStmt
 | 
			
		||||
          | LoadStmt
 | 
			
		||||
          .
 | 
			
		||||
 | 
			
		||||
ReturnStmt   = 'return' [Expression] .
 | 
			
		||||
BreakStmt    = 'break' .
 | 
			
		||||
ContinueStmt = 'continue' .
 | 
			
		||||
PassStmt     = 'pass' .
 | 
			
		||||
AssignStmt   = Expression ('=' | '+=' | '-=' | '*=' | '/=' | '//=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=') Expression .
 | 
			
		||||
ExprStmt     = Expression .
 | 
			
		||||
 | 
			
		||||
LoadStmt = 'load' '(' string {',' [identifier '='] string} [','] ')' .
 | 
			
		||||
 | 
			
		||||
Test = LambdaExpr
 | 
			
		||||
     | IfExpr
 | 
			
		||||
     | PrimaryExpr
 | 
			
		||||
     | UnaryExpr
 | 
			
		||||
     | BinaryExpr
 | 
			
		||||
     .
 | 
			
		||||
 | 
			
		||||
LambdaExpr = 'lambda' [Parameters] ':' Test .
 | 
			
		||||
 | 
			
		||||
IfExpr = Test 'if' Test 'else' Test .
 | 
			
		||||
 | 
			
		||||
PrimaryExpr = Operand
 | 
			
		||||
            | PrimaryExpr DotSuffix
 | 
			
		||||
            | PrimaryExpr CallSuffix
 | 
			
		||||
            | PrimaryExpr SliceSuffix
 | 
			
		||||
            .
 | 
			
		||||
 | 
			
		||||
Operand = identifier
 | 
			
		||||
        | int | float | string
 | 
			
		||||
        | ListExpr | ListComp
 | 
			
		||||
        | DictExpr | DictComp
 | 
			
		||||
        | '(' [Expression [',']] ')'
 | 
			
		||||
        | ('-' | '+') PrimaryExpr
 | 
			
		||||
        .
 | 
			
		||||
 | 
			
		||||
DotSuffix   = '.' identifier .
 | 
			
		||||
CallSuffix  = '(' [Arguments [',']] ')' .
 | 
			
		||||
SliceSuffix = '[' [Expression] [':' Test [':' Test]] ']' .
 | 
			
		||||
 | 
			
		||||
Arguments = Argument {',' Argument} .
 | 
			
		||||
Argument  = Test | identifier '=' Test | '*' Test | '**' Test .
 | 
			
		||||
 | 
			
		||||
ListExpr = '[' [Expression [',']] ']' .
 | 
			
		||||
ListComp = '[' Test {CompClause} ']'.
 | 
			
		||||
 | 
			
		||||
DictExpr = '{' [Entries [',']] '}' .
 | 
			
		||||
DictComp = '{' Entry {CompClause} '}' .
 | 
			
		||||
Entries  = Entry {',' Entry} .
 | 
			
		||||
Entry    = Test ':' Test .
 | 
			
		||||
 | 
			
		||||
CompClause = 'for' LoopVariables 'in' Test | 'if' Test .
 | 
			
		||||
 | 
			
		||||
UnaryExpr = 'not' Test .
 | 
			
		||||
 | 
			
		||||
BinaryExpr = Test {Binop Test} .
 | 
			
		||||
 | 
			
		||||
Binop = 'or'
 | 
			
		||||
      | 'and'
 | 
			
		||||
      | '==' | '!=' | '<' | '>' | '<=' | '>=' | 'in' | 'not' 'in'
 | 
			
		||||
      | '|'
 | 
			
		||||
      | '^'
 | 
			
		||||
      | '&'
 | 
			
		||||
      | '-' | '+'
 | 
			
		||||
      | '*' | '%' | '/' | '//'
 | 
			
		||||
      .
 | 
			
		||||
 | 
			
		||||
Expression = Test {',' Test} .
 | 
			
		||||
# NOTE: trailing comma permitted only when within [...] or (...).
 | 
			
		||||
 | 
			
		||||
LoopVariables = PrimaryExpr {',' PrimaryExpr} .
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Notation (similar to Go spec):
 | 
			
		||||
- lowercase and 'quoted' items are lexical tokens.
 | 
			
		||||
- Capitalized names denote grammar productions.
 | 
			
		||||
- (...) implies grouping
 | 
			
		||||
- x | y means either x or y.
 | 
			
		||||
- [x] means x is optional
 | 
			
		||||
- {x} means x is repeated zero or more times
 | 
			
		||||
- The end of each declaration is marked with a period.
 | 
			
		||||
 | 
			
		||||
# Tokens
 | 
			
		||||
- spaces: newline, eof, indent, outdent.
 | 
			
		||||
- identifier.
 | 
			
		||||
- literals: string, int, float.
 | 
			
		||||
- plus all quoted tokens such as '+=', 'return'.
 | 
			
		||||
 | 
			
		||||
# Notes:
 | 
			
		||||
- Ambiguity is resolved using operator precedence.
 | 
			
		||||
- The grammar does not enforce the legal order of params and args,
 | 
			
		||||
  nor that the first compclause must be a 'for'.
 | 
			
		||||
 | 
			
		||||
TODO:
 | 
			
		||||
- explain how the lexer generates indent, outdent, and newline tokens.
 | 
			
		||||
- why is unary NOT separated from unary - and +?
 | 
			
		||||
- the grammar is (mostly) in LL(1) style so, for example,
 | 
			
		||||
  dot expressions are formed suffixes, not complete expressions,
 | 
			
		||||
  which makes the spec harder to read.  Reorganize into non-LL(1) form?
 | 
			
		||||
							
								
								
									
										1028
									
								
								vendor/go.starlark.net/syntax/parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1028
									
								
								vendor/go.starlark.net/syntax/parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										309
									
								
								vendor/go.starlark.net/syntax/quote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										309
									
								
								vendor/go.starlark.net/syntax/quote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,309 +0,0 @@
 | 
			
		||||
// Copyright 2017 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package syntax
 | 
			
		||||
 | 
			
		||||
// Starlark quoted string utilities.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// unesc maps single-letter chars following \ to their actual values.
 | 
			
		||||
var unesc = [256]byte{
 | 
			
		||||
	'a':  '\a',
 | 
			
		||||
	'b':  '\b',
 | 
			
		||||
	'f':  '\f',
 | 
			
		||||
	'n':  '\n',
 | 
			
		||||
	'r':  '\r',
 | 
			
		||||
	't':  '\t',
 | 
			
		||||
	'v':  '\v',
 | 
			
		||||
	'\\': '\\',
 | 
			
		||||
	'\'': '\'',
 | 
			
		||||
	'"':  '"',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// esc maps escape-worthy bytes to the char that should follow \.
 | 
			
		||||
var esc = [256]byte{
 | 
			
		||||
	'\a': 'a',
 | 
			
		||||
	'\b': 'b',
 | 
			
		||||
	'\f': 'f',
 | 
			
		||||
	'\n': 'n',
 | 
			
		||||
	'\r': 'r',
 | 
			
		||||
	'\t': 't',
 | 
			
		||||
	'\v': 'v',
 | 
			
		||||
	'\\': '\\',
 | 
			
		||||
	'\'': '\'',
 | 
			
		||||
	'"':  '"',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// unquote unquotes the quoted string, returning the actual
 | 
			
		||||
// string value, whether the original was triple-quoted,
 | 
			
		||||
// whether it was a byte string, and an error describing invalid input.
 | 
			
		||||
func unquote(quoted string) (s string, triple, isByte bool, err error) {
 | 
			
		||||
	// Check for raw prefix: means don't interpret the inner \.
 | 
			
		||||
	raw := false
 | 
			
		||||
	if strings.HasPrefix(quoted, "r") {
 | 
			
		||||
		raw = true
 | 
			
		||||
		quoted = quoted[1:]
 | 
			
		||||
	}
 | 
			
		||||
	// Check for bytes prefix.
 | 
			
		||||
	if strings.HasPrefix(quoted, "b") {
 | 
			
		||||
		isByte = true
 | 
			
		||||
		quoted = quoted[1:]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(quoted) < 2 {
 | 
			
		||||
		err = fmt.Errorf("string literal too short")
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if quoted[0] != '"' && quoted[0] != '\'' || quoted[0] != quoted[len(quoted)-1] {
 | 
			
		||||
		err = fmt.Errorf("string literal has invalid quotes")
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check for triple quoted string.
 | 
			
		||||
	quote := quoted[0]
 | 
			
		||||
	if len(quoted) >= 6 && quoted[1] == quote && quoted[2] == quote && quoted[:3] == quoted[len(quoted)-3:] {
 | 
			
		||||
		triple = true
 | 
			
		||||
		quoted = quoted[3 : len(quoted)-3]
 | 
			
		||||
	} else {
 | 
			
		||||
		quoted = quoted[1 : len(quoted)-1]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Now quoted is the quoted data, but no quotes.
 | 
			
		||||
	// If we're in raw mode or there are no escapes or
 | 
			
		||||
	// carriage returns, we're done.
 | 
			
		||||
	var unquoteChars string
 | 
			
		||||
	if raw {
 | 
			
		||||
		unquoteChars = "\r"
 | 
			
		||||
	} else {
 | 
			
		||||
		unquoteChars = "\\\r"
 | 
			
		||||
	}
 | 
			
		||||
	if !strings.ContainsAny(quoted, unquoteChars) {
 | 
			
		||||
		s = quoted
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Otherwise process quoted string.
 | 
			
		||||
	// Each iteration processes one escape sequence along with the
 | 
			
		||||
	// plain text leading up to it.
 | 
			
		||||
	buf := new(strings.Builder)
 | 
			
		||||
	for {
 | 
			
		||||
		// Remove prefix before escape sequence.
 | 
			
		||||
		i := strings.IndexAny(quoted, unquoteChars)
 | 
			
		||||
		if i < 0 {
 | 
			
		||||
			i = len(quoted)
 | 
			
		||||
		}
 | 
			
		||||
		buf.WriteString(quoted[:i])
 | 
			
		||||
		quoted = quoted[i:]
 | 
			
		||||
 | 
			
		||||
		if len(quoted) == 0 {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Process carriage return.
 | 
			
		||||
		if quoted[0] == '\r' {
 | 
			
		||||
			buf.WriteByte('\n')
 | 
			
		||||
			if len(quoted) > 1 && quoted[1] == '\n' {
 | 
			
		||||
				quoted = quoted[2:]
 | 
			
		||||
			} else {
 | 
			
		||||
				quoted = quoted[1:]
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Process escape sequence.
 | 
			
		||||
		if len(quoted) == 1 {
 | 
			
		||||
			err = fmt.Errorf(`truncated escape sequence \`)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch quoted[1] {
 | 
			
		||||
		default:
 | 
			
		||||
			// In Starlark, like Go, a backslash must escape something.
 | 
			
		||||
			// (Python still treats unnecessary backslashes literally,
 | 
			
		||||
			// but since 3.6 has emitted a deprecation warning.)
 | 
			
		||||
			err = fmt.Errorf("invalid escape sequence \\%c", quoted[1])
 | 
			
		||||
			return
 | 
			
		||||
 | 
			
		||||
		case '\n':
 | 
			
		||||
			// Ignore the escape and the line break.
 | 
			
		||||
			quoted = quoted[2:]
 | 
			
		||||
 | 
			
		||||
		case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '\'', '"':
 | 
			
		||||
			// One-char escape.
 | 
			
		||||
			// Escapes are allowed for both kinds of quotation
 | 
			
		||||
			// mark, not just the kind in use.
 | 
			
		||||
			buf.WriteByte(unesc[quoted[1]])
 | 
			
		||||
			quoted = quoted[2:]
 | 
			
		||||
 | 
			
		||||
		case '0', '1', '2', '3', '4', '5', '6', '7':
 | 
			
		||||
			// Octal escape, up to 3 digits, \OOO.
 | 
			
		||||
			n := int(quoted[1] - '0')
 | 
			
		||||
			quoted = quoted[2:]
 | 
			
		||||
			for i := 1; i < 3; i++ {
 | 
			
		||||
				if len(quoted) == 0 || quoted[0] < '0' || '7' < quoted[0] {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
				n = n*8 + int(quoted[0]-'0')
 | 
			
		||||
				quoted = quoted[1:]
 | 
			
		||||
			}
 | 
			
		||||
			if !isByte && n > 127 {
 | 
			
		||||
				err = fmt.Errorf(`non-ASCII octal escape \%o (use \u%04X for the UTF-8 encoding of U+%04X)`, n, n, n)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			if n >= 256 {
 | 
			
		||||
				// NOTE: Python silently discards the high bit,
 | 
			
		||||
				// so that '\541' == '\141' == 'a'.
 | 
			
		||||
				// Let's see if we can avoid doing that in BUILD files.
 | 
			
		||||
				err = fmt.Errorf(`invalid escape sequence \%03o`, n)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			buf.WriteByte(byte(n))
 | 
			
		||||
 | 
			
		||||
		case 'x':
 | 
			
		||||
			// Hexadecimal escape, exactly 2 digits, \xXX. [0-127]
 | 
			
		||||
			if len(quoted) < 4 {
 | 
			
		||||
				err = fmt.Errorf(`truncated escape sequence %s`, quoted)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			n, err1 := strconv.ParseUint(quoted[2:4], 16, 0)
 | 
			
		||||
			if err1 != nil {
 | 
			
		||||
				err = fmt.Errorf(`invalid escape sequence %s`, quoted[:4])
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			if !isByte && n > 127 {
 | 
			
		||||
				err = fmt.Errorf(`non-ASCII hex escape %s (use \u%04X for the UTF-8 encoding of U+%04X)`,
 | 
			
		||||
					quoted[:4], n, n)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			buf.WriteByte(byte(n))
 | 
			
		||||
			quoted = quoted[4:]
 | 
			
		||||
 | 
			
		||||
		case 'u', 'U':
 | 
			
		||||
			// Unicode code point, 4 (\uXXXX) or 8 (\UXXXXXXXX) hex digits.
 | 
			
		||||
			sz := 6
 | 
			
		||||
			if quoted[1] == 'U' {
 | 
			
		||||
				sz = 10
 | 
			
		||||
			}
 | 
			
		||||
			if len(quoted) < sz {
 | 
			
		||||
				err = fmt.Errorf(`truncated escape sequence %s`, quoted)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			n, err1 := strconv.ParseUint(quoted[2:sz], 16, 0)
 | 
			
		||||
			if err1 != nil {
 | 
			
		||||
				err = fmt.Errorf(`invalid escape sequence %s`, quoted[:sz])
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			if n > unicode.MaxRune {
 | 
			
		||||
				err = fmt.Errorf(`code point out of range: %s (max \U%08x)`,
 | 
			
		||||
					quoted[:sz], n)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			// As in Go, surrogates are disallowed.
 | 
			
		||||
			if 0xD800 <= n && n < 0xE000 {
 | 
			
		||||
				err = fmt.Errorf(`invalid Unicode code point U+%04X`, n)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			buf.WriteRune(rune(n))
 | 
			
		||||
			quoted = quoted[sz:]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s = buf.String()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// indexByte returns the index of the first instance of b in s, or else -1.
 | 
			
		||||
func indexByte(s string, b byte) int {
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		if s[i] == b {
 | 
			
		||||
			return i
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return -1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Quote returns a Starlark literal that denotes s.
 | 
			
		||||
// If b, it returns a bytes literal.
 | 
			
		||||
func Quote(s string, b bool) string {
 | 
			
		||||
	const hex = "0123456789abcdef"
 | 
			
		||||
	var runeTmp [utf8.UTFMax]byte
 | 
			
		||||
 | 
			
		||||
	buf := make([]byte, 0, 3*len(s)/2)
 | 
			
		||||
	if b {
 | 
			
		||||
		buf = append(buf, 'b')
 | 
			
		||||
	}
 | 
			
		||||
	buf = append(buf, '"')
 | 
			
		||||
	for width := 0; len(s) > 0; s = s[width:] {
 | 
			
		||||
		r := rune(s[0])
 | 
			
		||||
		width = 1
 | 
			
		||||
		if r >= utf8.RuneSelf {
 | 
			
		||||
			r, width = utf8.DecodeRuneInString(s)
 | 
			
		||||
		}
 | 
			
		||||
		if width == 1 && r == utf8.RuneError {
 | 
			
		||||
			// String (!b) literals accept \xXX escapes only for ASCII,
 | 
			
		||||
			// but we must use them here to represent invalid bytes.
 | 
			
		||||
			// The result is not a legal literal.
 | 
			
		||||
			buf = append(buf, `\x`...)
 | 
			
		||||
			buf = append(buf, hex[s[0]>>4])
 | 
			
		||||
			buf = append(buf, hex[s[0]&0xF])
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if r == '"' || r == '\\' { // always backslashed
 | 
			
		||||
			buf = append(buf, '\\')
 | 
			
		||||
			buf = append(buf, byte(r))
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if strconv.IsPrint(r) {
 | 
			
		||||
			n := utf8.EncodeRune(runeTmp[:], r)
 | 
			
		||||
			buf = append(buf, runeTmp[:n]...)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		switch r {
 | 
			
		||||
		case '\a':
 | 
			
		||||
			buf = append(buf, `\a`...)
 | 
			
		||||
		case '\b':
 | 
			
		||||
			buf = append(buf, `\b`...)
 | 
			
		||||
		case '\f':
 | 
			
		||||
			buf = append(buf, `\f`...)
 | 
			
		||||
		case '\n':
 | 
			
		||||
			buf = append(buf, `\n`...)
 | 
			
		||||
		case '\r':
 | 
			
		||||
			buf = append(buf, `\r`...)
 | 
			
		||||
		case '\t':
 | 
			
		||||
			buf = append(buf, `\t`...)
 | 
			
		||||
		case '\v':
 | 
			
		||||
			buf = append(buf, `\v`...)
 | 
			
		||||
		default:
 | 
			
		||||
			switch {
 | 
			
		||||
			case r < ' ' || r == 0x7f:
 | 
			
		||||
				buf = append(buf, `\x`...)
 | 
			
		||||
				buf = append(buf, hex[byte(r)>>4])
 | 
			
		||||
				buf = append(buf, hex[byte(r)&0xF])
 | 
			
		||||
			case r > utf8.MaxRune:
 | 
			
		||||
				r = 0xFFFD
 | 
			
		||||
				fallthrough
 | 
			
		||||
			case r < 0x10000:
 | 
			
		||||
				buf = append(buf, `\u`...)
 | 
			
		||||
				for s := 12; s >= 0; s -= 4 {
 | 
			
		||||
					buf = append(buf, hex[r>>uint(s)&0xF])
 | 
			
		||||
				}
 | 
			
		||||
			default:
 | 
			
		||||
				buf = append(buf, `\U`...)
 | 
			
		||||
				for s := 28; s >= 0; s -= 4 {
 | 
			
		||||
					buf = append(buf, hex[r>>uint(s)&0xF])
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	buf = append(buf, '"')
 | 
			
		||||
	return string(buf)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1123
									
								
								vendor/go.starlark.net/syntax/scan.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1123
									
								
								vendor/go.starlark.net/syntax/scan.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										525
									
								
								vendor/go.starlark.net/syntax/syntax.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										525
									
								
								vendor/go.starlark.net/syntax/syntax.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,525 +0,0 @@
 | 
			
		||||
// Copyright 2017 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package syntax provides a Starlark parser and abstract syntax tree.
 | 
			
		||||
package syntax // import "go.starlark.net/syntax"
 | 
			
		||||
 | 
			
		||||
// A Node is a node in a Starlark syntax tree.
 | 
			
		||||
type Node interface {
 | 
			
		||||
	// Span returns the start and end position of the expression.
 | 
			
		||||
	Span() (start, end Position)
 | 
			
		||||
 | 
			
		||||
	// Comments returns the comments associated with this node.
 | 
			
		||||
	// It returns nil if RetainComments was not specified during parsing,
 | 
			
		||||
	// or if AllocComments was not called.
 | 
			
		||||
	Comments() *Comments
 | 
			
		||||
 | 
			
		||||
	// AllocComments allocates a new Comments node if there was none.
 | 
			
		||||
	// This makes possible to add new comments using Comments() method.
 | 
			
		||||
	AllocComments()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Comment represents a single # comment.
 | 
			
		||||
type Comment struct {
 | 
			
		||||
	Start Position
 | 
			
		||||
	Text  string // without trailing newline
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Comments collects the comments associated with an expression.
 | 
			
		||||
type Comments struct {
 | 
			
		||||
	Before []Comment // whole-line comments before this expression
 | 
			
		||||
	Suffix []Comment // end-of-line comments after this expression (up to 1)
 | 
			
		||||
 | 
			
		||||
	// For top-level expressions only, After lists whole-line
 | 
			
		||||
	// comments following the expression.
 | 
			
		||||
	After []Comment
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A commentsRef is a possibly-nil reference to a set of comments.
 | 
			
		||||
// A commentsRef is embedded in each type of syntax node,
 | 
			
		||||
// and provides its Comments and AllocComments methods.
 | 
			
		||||
type commentsRef struct{ ref *Comments }
 | 
			
		||||
 | 
			
		||||
// Comments returns the comments associated with a syntax node,
 | 
			
		||||
// or nil if AllocComments has not yet been called.
 | 
			
		||||
func (cr commentsRef) Comments() *Comments { return cr.ref }
 | 
			
		||||
 | 
			
		||||
// AllocComments enables comments to be associated with a syntax node.
 | 
			
		||||
func (cr *commentsRef) AllocComments() {
 | 
			
		||||
	if cr.ref == nil {
 | 
			
		||||
		cr.ref = new(Comments)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Start returns the start position of the expression.
 | 
			
		||||
func Start(n Node) Position {
 | 
			
		||||
	start, _ := n.Span()
 | 
			
		||||
	return start
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// End returns the end position of the expression.
 | 
			
		||||
func End(n Node) Position {
 | 
			
		||||
	_, end := n.Span()
 | 
			
		||||
	return end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A File represents a Starlark file.
 | 
			
		||||
type File struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Path  string
 | 
			
		||||
	Stmts []Stmt
 | 
			
		||||
 | 
			
		||||
	Module interface{} // a *resolve.Module, set by resolver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *File) Span() (start, end Position) {
 | 
			
		||||
	if len(x.Stmts) == 0 {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	start, _ = x.Stmts[0].Span()
 | 
			
		||||
	_, end = x.Stmts[len(x.Stmts)-1].Span()
 | 
			
		||||
	return start, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Stmt is a Starlark statement.
 | 
			
		||||
type Stmt interface {
 | 
			
		||||
	Node
 | 
			
		||||
	stmt()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*AssignStmt) stmt() {}
 | 
			
		||||
func (*BranchStmt) stmt() {}
 | 
			
		||||
func (*DefStmt) stmt()    {}
 | 
			
		||||
func (*ExprStmt) stmt()   {}
 | 
			
		||||
func (*ForStmt) stmt()    {}
 | 
			
		||||
func (*WhileStmt) stmt()  {}
 | 
			
		||||
func (*IfStmt) stmt()     {}
 | 
			
		||||
func (*LoadStmt) stmt()   {}
 | 
			
		||||
func (*ReturnStmt) stmt() {}
 | 
			
		||||
 | 
			
		||||
// An AssignStmt represents an assignment:
 | 
			
		||||
//	x = 0
 | 
			
		||||
//	x, y = y, x
 | 
			
		||||
// 	x += 1
 | 
			
		||||
type AssignStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	OpPos Position
 | 
			
		||||
	Op    Token // = EQ | {PLUS,MINUS,STAR,PERCENT}_EQ
 | 
			
		||||
	LHS   Expr
 | 
			
		||||
	RHS   Expr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *AssignStmt) Span() (start, end Position) {
 | 
			
		||||
	start, _ = x.LHS.Span()
 | 
			
		||||
	_, end = x.RHS.Span()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A DefStmt represents a function definition.
 | 
			
		||||
type DefStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Def    Position
 | 
			
		||||
	Name   *Ident
 | 
			
		||||
	Params []Expr // param = ident | ident=expr | * | *ident | **ident
 | 
			
		||||
	Body   []Stmt
 | 
			
		||||
 | 
			
		||||
	Function interface{} // a *resolve.Function, set by resolver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *DefStmt) Span() (start, end Position) {
 | 
			
		||||
	_, end = x.Body[len(x.Body)-1].Span()
 | 
			
		||||
	return x.Def, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An ExprStmt is an expression evaluated for side effects.
 | 
			
		||||
type ExprStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	X Expr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ExprStmt) Span() (start, end Position) {
 | 
			
		||||
	return x.X.Span()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An IfStmt is a conditional: If Cond: True; else: False.
 | 
			
		||||
// 'elseif' is desugared into a chain of IfStmts.
 | 
			
		||||
type IfStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	If      Position // IF or ELIF
 | 
			
		||||
	Cond    Expr
 | 
			
		||||
	True    []Stmt
 | 
			
		||||
	ElsePos Position // ELSE or ELIF
 | 
			
		||||
	False   []Stmt   // optional
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *IfStmt) Span() (start, end Position) {
 | 
			
		||||
	body := x.False
 | 
			
		||||
	if body == nil {
 | 
			
		||||
		body = x.True
 | 
			
		||||
	}
 | 
			
		||||
	_, end = body[len(body)-1].Span()
 | 
			
		||||
	return x.If, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A LoadStmt loads another module and binds names from it:
 | 
			
		||||
// load(Module, "x", y="foo").
 | 
			
		||||
//
 | 
			
		||||
// The AST is slightly unfaithful to the concrete syntax here because
 | 
			
		||||
// Starlark's load statement, so that it can be implemented in Python,
 | 
			
		||||
// binds some names (like y above) with an identifier and some (like x)
 | 
			
		||||
// without.  For consistency we create fake identifiers for all the
 | 
			
		||||
// strings.
 | 
			
		||||
type LoadStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Load   Position
 | 
			
		||||
	Module *Literal // a string
 | 
			
		||||
	From   []*Ident // name defined in loading module
 | 
			
		||||
	To     []*Ident // name in loaded module
 | 
			
		||||
	Rparen Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *LoadStmt) Span() (start, end Position) {
 | 
			
		||||
	return x.Load, x.Rparen
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ModuleName returns the name of the module loaded by this statement.
 | 
			
		||||
func (x *LoadStmt) ModuleName() string { return x.Module.Value.(string) }
 | 
			
		||||
 | 
			
		||||
// A BranchStmt changes the flow of control: break, continue, pass.
 | 
			
		||||
type BranchStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Token    Token // = BREAK | CONTINUE | PASS
 | 
			
		||||
	TokenPos Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *BranchStmt) Span() (start, end Position) {
 | 
			
		||||
	return x.TokenPos, x.TokenPos.add(x.Token.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A ReturnStmt returns from a function.
 | 
			
		||||
type ReturnStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Return Position
 | 
			
		||||
	Result Expr // may be nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ReturnStmt) Span() (start, end Position) {
 | 
			
		||||
	if x.Result == nil {
 | 
			
		||||
		return x.Return, x.Return.add("return")
 | 
			
		||||
	}
 | 
			
		||||
	_, end = x.Result.Span()
 | 
			
		||||
	return x.Return, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An Expr is a Starlark expression.
 | 
			
		||||
type Expr interface {
 | 
			
		||||
	Node
 | 
			
		||||
	expr()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*BinaryExpr) expr()    {}
 | 
			
		||||
func (*CallExpr) expr()      {}
 | 
			
		||||
func (*Comprehension) expr() {}
 | 
			
		||||
func (*CondExpr) expr()      {}
 | 
			
		||||
func (*DictEntry) expr()     {}
 | 
			
		||||
func (*DictExpr) expr()      {}
 | 
			
		||||
func (*DotExpr) expr()       {}
 | 
			
		||||
func (*Ident) expr()         {}
 | 
			
		||||
func (*IndexExpr) expr()     {}
 | 
			
		||||
func (*LambdaExpr) expr()    {}
 | 
			
		||||
func (*ListExpr) expr()      {}
 | 
			
		||||
func (*Literal) expr()       {}
 | 
			
		||||
func (*ParenExpr) expr()     {}
 | 
			
		||||
func (*SliceExpr) expr()     {}
 | 
			
		||||
func (*TupleExpr) expr()     {}
 | 
			
		||||
func (*UnaryExpr) expr()     {}
 | 
			
		||||
 | 
			
		||||
// An Ident represents an identifier.
 | 
			
		||||
type Ident struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	NamePos Position
 | 
			
		||||
	Name    string
 | 
			
		||||
 | 
			
		||||
	Binding interface{} // a *resolver.Binding, set by resolver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Ident) Span() (start, end Position) {
 | 
			
		||||
	return x.NamePos, x.NamePos.add(x.Name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Literal represents a literal string or number.
 | 
			
		||||
type Literal struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Token    Token // = STRING | BYTES | INT | FLOAT
 | 
			
		||||
	TokenPos Position
 | 
			
		||||
	Raw      string      // uninterpreted text
 | 
			
		||||
	Value    interface{} // = string | int64 | *big.Int | float64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Literal) Span() (start, end Position) {
 | 
			
		||||
	return x.TokenPos, x.TokenPos.add(x.Raw)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A ParenExpr represents a parenthesized expression: (X).
 | 
			
		||||
type ParenExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Lparen Position
 | 
			
		||||
	X      Expr
 | 
			
		||||
	Rparen Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ParenExpr) Span() (start, end Position) {
 | 
			
		||||
	return x.Lparen, x.Rparen.add(")")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A CallExpr represents a function call expression: Fn(Args).
 | 
			
		||||
type CallExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Fn     Expr
 | 
			
		||||
	Lparen Position
 | 
			
		||||
	Args   []Expr // arg = expr | ident=expr | *expr | **expr
 | 
			
		||||
	Rparen Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *CallExpr) Span() (start, end Position) {
 | 
			
		||||
	start, _ = x.Fn.Span()
 | 
			
		||||
	return start, x.Rparen.add(")")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A DotExpr represents a field or method selector: X.Name.
 | 
			
		||||
type DotExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	X       Expr
 | 
			
		||||
	Dot     Position
 | 
			
		||||
	NamePos Position
 | 
			
		||||
	Name    *Ident
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *DotExpr) Span() (start, end Position) {
 | 
			
		||||
	start, _ = x.X.Span()
 | 
			
		||||
	_, end = x.Name.Span()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Comprehension represents a list or dict comprehension:
 | 
			
		||||
// [Body for ... if ...] or {Body for ... if ...}
 | 
			
		||||
type Comprehension struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Curly   bool // {x:y for ...} or {x for ...}, not [x for ...]
 | 
			
		||||
	Lbrack  Position
 | 
			
		||||
	Body    Expr
 | 
			
		||||
	Clauses []Node // = *ForClause | *IfClause
 | 
			
		||||
	Rbrack  Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Comprehension) Span() (start, end Position) {
 | 
			
		||||
	return x.Lbrack, x.Rbrack.add("]")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A ForStmt represents a loop: for Vars in X: Body.
 | 
			
		||||
type ForStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	For  Position
 | 
			
		||||
	Vars Expr // name, or tuple of names
 | 
			
		||||
	X    Expr
 | 
			
		||||
	Body []Stmt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ForStmt) Span() (start, end Position) {
 | 
			
		||||
	_, end = x.Body[len(x.Body)-1].Span()
 | 
			
		||||
	return x.For, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A WhileStmt represents a while loop: while X: Body.
 | 
			
		||||
type WhileStmt struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	While Position
 | 
			
		||||
	Cond  Expr
 | 
			
		||||
	Body  []Stmt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *WhileStmt) Span() (start, end Position) {
 | 
			
		||||
	_, end = x.Body[len(x.Body)-1].Span()
 | 
			
		||||
	return x.While, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A ForClause represents a for clause in a list comprehension: for Vars in X.
 | 
			
		||||
type ForClause struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	For  Position
 | 
			
		||||
	Vars Expr // name, or tuple of names
 | 
			
		||||
	In   Position
 | 
			
		||||
	X    Expr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ForClause) Span() (start, end Position) {
 | 
			
		||||
	_, end = x.X.Span()
 | 
			
		||||
	return x.For, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An IfClause represents an if clause in a list comprehension: if Cond.
 | 
			
		||||
type IfClause struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	If   Position
 | 
			
		||||
	Cond Expr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *IfClause) Span() (start, end Position) {
 | 
			
		||||
	_, end = x.Cond.Span()
 | 
			
		||||
	return x.If, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A DictExpr represents a dictionary literal: { List }.
 | 
			
		||||
type DictExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Lbrace Position
 | 
			
		||||
	List   []Expr // all *DictEntrys
 | 
			
		||||
	Rbrace Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *DictExpr) Span() (start, end Position) {
 | 
			
		||||
	return x.Lbrace, x.Rbrace.add("}")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A DictEntry represents a dictionary entry: Key: Value.
 | 
			
		||||
// Used only within a DictExpr.
 | 
			
		||||
type DictEntry struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Key   Expr
 | 
			
		||||
	Colon Position
 | 
			
		||||
	Value Expr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *DictEntry) Span() (start, end Position) {
 | 
			
		||||
	start, _ = x.Key.Span()
 | 
			
		||||
	_, end = x.Value.Span()
 | 
			
		||||
	return start, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A LambdaExpr represents an inline function abstraction.
 | 
			
		||||
type LambdaExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Lambda Position
 | 
			
		||||
	Params []Expr // param = ident | ident=expr | * | *ident | **ident
 | 
			
		||||
	Body   Expr
 | 
			
		||||
 | 
			
		||||
	Function interface{} // a *resolve.Function, set by resolver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *LambdaExpr) Span() (start, end Position) {
 | 
			
		||||
	_, end = x.Body.Span()
 | 
			
		||||
	return x.Lambda, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A ListExpr represents a list literal: [ List ].
 | 
			
		||||
type ListExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Lbrack Position
 | 
			
		||||
	List   []Expr
 | 
			
		||||
	Rbrack Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ListExpr) Span() (start, end Position) {
 | 
			
		||||
	return x.Lbrack, x.Rbrack.add("]")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CondExpr represents the conditional: X if COND else ELSE.
 | 
			
		||||
type CondExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	If      Position
 | 
			
		||||
	Cond    Expr
 | 
			
		||||
	True    Expr
 | 
			
		||||
	ElsePos Position
 | 
			
		||||
	False   Expr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *CondExpr) Span() (start, end Position) {
 | 
			
		||||
	start, _ = x.True.Span()
 | 
			
		||||
	_, end = x.False.Span()
 | 
			
		||||
	return start, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A TupleExpr represents a tuple literal: (List).
 | 
			
		||||
type TupleExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	Lparen Position // optional (e.g. in x, y = 0, 1), but required if List is empty
 | 
			
		||||
	List   []Expr
 | 
			
		||||
	Rparen Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *TupleExpr) Span() (start, end Position) {
 | 
			
		||||
	if x.Lparen.IsValid() {
 | 
			
		||||
		return x.Lparen, x.Rparen
 | 
			
		||||
	} else {
 | 
			
		||||
		return Start(x.List[0]), End(x.List[len(x.List)-1])
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A UnaryExpr represents a unary expression: Op X.
 | 
			
		||||
//
 | 
			
		||||
// As a special case, UnaryOp{Op:Star} may also represent
 | 
			
		||||
// the star parameter in def f(*args) or def f(*, x).
 | 
			
		||||
type UnaryExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	OpPos Position
 | 
			
		||||
	Op    Token
 | 
			
		||||
	X     Expr // may be nil if Op==STAR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *UnaryExpr) Span() (start, end Position) {
 | 
			
		||||
	if x.X != nil {
 | 
			
		||||
		_, end = x.X.Span()
 | 
			
		||||
	} else {
 | 
			
		||||
		end = x.OpPos.add("*")
 | 
			
		||||
	}
 | 
			
		||||
	return x.OpPos, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A BinaryExpr represents a binary expression: X Op Y.
 | 
			
		||||
//
 | 
			
		||||
// As a special case, BinaryExpr{Op:EQ} may also
 | 
			
		||||
// represent a named argument in a call f(k=v)
 | 
			
		||||
// or a named parameter in a function declaration
 | 
			
		||||
// def f(param=default).
 | 
			
		||||
type BinaryExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	X     Expr
 | 
			
		||||
	OpPos Position
 | 
			
		||||
	Op    Token
 | 
			
		||||
	Y     Expr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *BinaryExpr) Span() (start, end Position) {
 | 
			
		||||
	start, _ = x.X.Span()
 | 
			
		||||
	_, end = x.Y.Span()
 | 
			
		||||
	return start, end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A SliceExpr represents a slice or substring expression: X[Lo:Hi:Step].
 | 
			
		||||
type SliceExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	X            Expr
 | 
			
		||||
	Lbrack       Position
 | 
			
		||||
	Lo, Hi, Step Expr // all optional
 | 
			
		||||
	Rbrack       Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SliceExpr) Span() (start, end Position) {
 | 
			
		||||
	start, _ = x.X.Span()
 | 
			
		||||
	return start, x.Rbrack
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An IndexExpr represents an index expression: X[Y].
 | 
			
		||||
type IndexExpr struct {
 | 
			
		||||
	commentsRef
 | 
			
		||||
	X      Expr
 | 
			
		||||
	Lbrack Position
 | 
			
		||||
	Y      Expr
 | 
			
		||||
	Rbrack Position
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *IndexExpr) Span() (start, end Position) {
 | 
			
		||||
	start, _ = x.X.Span()
 | 
			
		||||
	return start, x.Rbrack
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										161
									
								
								vendor/go.starlark.net/syntax/walk.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										161
									
								
								vendor/go.starlark.net/syntax/walk.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,161 +0,0 @@
 | 
			
		||||
// Copyright 2017 The Bazel Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package syntax
 | 
			
		||||
 | 
			
		||||
// Walk traverses a syntax tree in depth-first order.
 | 
			
		||||
// It starts by calling f(n); n must not be nil.
 | 
			
		||||
// If f returns true, Walk calls itself
 | 
			
		||||
// recursively for each non-nil child of n.
 | 
			
		||||
// Walk then calls f(nil).
 | 
			
		||||
func Walk(n Node, f func(Node) bool) {
 | 
			
		||||
	if n == nil {
 | 
			
		||||
		panic("nil")
 | 
			
		||||
	}
 | 
			
		||||
	if !f(n) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO(adonovan): opt: order cases using profile data.
 | 
			
		||||
	switch n := n.(type) {
 | 
			
		||||
	case *File:
 | 
			
		||||
		walkStmts(n.Stmts, f)
 | 
			
		||||
 | 
			
		||||
	case *ExprStmt:
 | 
			
		||||
		Walk(n.X, f)
 | 
			
		||||
 | 
			
		||||
	case *BranchStmt:
 | 
			
		||||
		// no-op
 | 
			
		||||
 | 
			
		||||
	case *IfStmt:
 | 
			
		||||
		Walk(n.Cond, f)
 | 
			
		||||
		walkStmts(n.True, f)
 | 
			
		||||
		walkStmts(n.False, f)
 | 
			
		||||
 | 
			
		||||
	case *AssignStmt:
 | 
			
		||||
		Walk(n.LHS, f)
 | 
			
		||||
		Walk(n.RHS, f)
 | 
			
		||||
 | 
			
		||||
	case *DefStmt:
 | 
			
		||||
		Walk(n.Name, f)
 | 
			
		||||
		for _, param := range n.Params {
 | 
			
		||||
			Walk(param, f)
 | 
			
		||||
		}
 | 
			
		||||
		walkStmts(n.Body, f)
 | 
			
		||||
 | 
			
		||||
	case *ForStmt:
 | 
			
		||||
		Walk(n.Vars, f)
 | 
			
		||||
		Walk(n.X, f)
 | 
			
		||||
		walkStmts(n.Body, f)
 | 
			
		||||
 | 
			
		||||
	case *ReturnStmt:
 | 
			
		||||
		if n.Result != nil {
 | 
			
		||||
			Walk(n.Result, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *LoadStmt:
 | 
			
		||||
		Walk(n.Module, f)
 | 
			
		||||
		for _, from := range n.From {
 | 
			
		||||
			Walk(from, f)
 | 
			
		||||
		}
 | 
			
		||||
		for _, to := range n.To {
 | 
			
		||||
			Walk(to, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *Ident, *Literal:
 | 
			
		||||
		// no-op
 | 
			
		||||
 | 
			
		||||
	case *ListExpr:
 | 
			
		||||
		for _, x := range n.List {
 | 
			
		||||
			Walk(x, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *ParenExpr:
 | 
			
		||||
		Walk(n.X, f)
 | 
			
		||||
 | 
			
		||||
	case *CondExpr:
 | 
			
		||||
		Walk(n.Cond, f)
 | 
			
		||||
		Walk(n.True, f)
 | 
			
		||||
		Walk(n.False, f)
 | 
			
		||||
 | 
			
		||||
	case *IndexExpr:
 | 
			
		||||
		Walk(n.X, f)
 | 
			
		||||
		Walk(n.Y, f)
 | 
			
		||||
 | 
			
		||||
	case *DictEntry:
 | 
			
		||||
		Walk(n.Key, f)
 | 
			
		||||
		Walk(n.Value, f)
 | 
			
		||||
 | 
			
		||||
	case *SliceExpr:
 | 
			
		||||
		Walk(n.X, f)
 | 
			
		||||
		if n.Lo != nil {
 | 
			
		||||
			Walk(n.Lo, f)
 | 
			
		||||
		}
 | 
			
		||||
		if n.Hi != nil {
 | 
			
		||||
			Walk(n.Hi, f)
 | 
			
		||||
		}
 | 
			
		||||
		if n.Step != nil {
 | 
			
		||||
			Walk(n.Step, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *Comprehension:
 | 
			
		||||
		Walk(n.Body, f)
 | 
			
		||||
		for _, clause := range n.Clauses {
 | 
			
		||||
			Walk(clause, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *IfClause:
 | 
			
		||||
		Walk(n.Cond, f)
 | 
			
		||||
 | 
			
		||||
	case *ForClause:
 | 
			
		||||
		Walk(n.Vars, f)
 | 
			
		||||
		Walk(n.X, f)
 | 
			
		||||
 | 
			
		||||
	case *TupleExpr:
 | 
			
		||||
		for _, x := range n.List {
 | 
			
		||||
			Walk(x, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *DictExpr:
 | 
			
		||||
		for _, entry := range n.List {
 | 
			
		||||
			Walk(entry, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *UnaryExpr:
 | 
			
		||||
		if n.X != nil {
 | 
			
		||||
			Walk(n.X, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *BinaryExpr:
 | 
			
		||||
		Walk(n.X, f)
 | 
			
		||||
		Walk(n.Y, f)
 | 
			
		||||
 | 
			
		||||
	case *DotExpr:
 | 
			
		||||
		Walk(n.X, f)
 | 
			
		||||
		Walk(n.Name, f)
 | 
			
		||||
 | 
			
		||||
	case *CallExpr:
 | 
			
		||||
		Walk(n.Fn, f)
 | 
			
		||||
		for _, arg := range n.Args {
 | 
			
		||||
			Walk(arg, f)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case *LambdaExpr:
 | 
			
		||||
		for _, param := range n.Params {
 | 
			
		||||
			Walk(param, f)
 | 
			
		||||
		}
 | 
			
		||||
		Walk(n.Body, f)
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		panic(n)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	f(nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func walkStmts(stmts []Stmt, f func(Node) bool) {
 | 
			
		||||
	for _, stmt := range stmts {
 | 
			
		||||
		Walk(stmt, f)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -807,14 +807,6 @@ go.opentelemetry.io/proto/otlp/collector/trace/v1
 | 
			
		||||
go.opentelemetry.io/proto/otlp/common/v1
 | 
			
		||||
go.opentelemetry.io/proto/otlp/resource/v1
 | 
			
		||||
go.opentelemetry.io/proto/otlp/trace/v1
 | 
			
		||||
# go.starlark.net v0.0.0-20230525235612-a134d8f9ddca
 | 
			
		||||
## explicit; go 1.16
 | 
			
		||||
go.starlark.net/internal/compile
 | 
			
		||||
go.starlark.net/internal/spell
 | 
			
		||||
go.starlark.net/resolve
 | 
			
		||||
go.starlark.net/starlark
 | 
			
		||||
go.starlark.net/starlarkstruct
 | 
			
		||||
go.starlark.net/syntax
 | 
			
		||||
# go.uber.org/goleak v1.3.0
 | 
			
		||||
## explicit; go 1.20
 | 
			
		||||
go.uber.org/goleak
 | 
			
		||||
@@ -1242,8 +1234,8 @@ sigs.k8s.io/json/internal/golang/encoding/json
 | 
			
		||||
# sigs.k8s.io/knftables v0.0.17
 | 
			
		||||
## explicit; go 1.20
 | 
			
		||||
sigs.k8s.io/knftables
 | 
			
		||||
# sigs.k8s.io/kustomize/api v0.17.2
 | 
			
		||||
## explicit; go 1.21
 | 
			
		||||
# sigs.k8s.io/kustomize/api v0.18.0
 | 
			
		||||
## explicit; go 1.22.7
 | 
			
		||||
sigs.k8s.io/kustomize/api/filters/annotations
 | 
			
		||||
sigs.k8s.io/kustomize/api/filters/fieldspec
 | 
			
		||||
sigs.k8s.io/kustomize/api/filters/filtersutil
 | 
			
		||||
@@ -1288,11 +1280,11 @@ sigs.k8s.io/kustomize/api/provider
 | 
			
		||||
sigs.k8s.io/kustomize/api/resmap
 | 
			
		||||
sigs.k8s.io/kustomize/api/resource
 | 
			
		||||
sigs.k8s.io/kustomize/api/types
 | 
			
		||||
# sigs.k8s.io/kustomize/kustomize/v5 v5.4.2
 | 
			
		||||
## explicit; go 1.21
 | 
			
		||||
# sigs.k8s.io/kustomize/kustomize/v5 v5.5.0
 | 
			
		||||
## explicit; go 1.22.7
 | 
			
		||||
sigs.k8s.io/kustomize/kustomize/v5/commands/build
 | 
			
		||||
# sigs.k8s.io/kustomize/kyaml v0.17.1
 | 
			
		||||
## explicit; go 1.21
 | 
			
		||||
# sigs.k8s.io/kustomize/kyaml v0.18.1
 | 
			
		||||
## explicit; go 1.22.7
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/comments
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/errors
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/ext
 | 
			
		||||
@@ -1301,10 +1293,7 @@ sigs.k8s.io/kustomize/kyaml/filesys
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/fn/runtime/container
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/fn/runtime/exec
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/kio
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/kio/filters
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/kio/kioutil
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/openapi
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi
 | 
			
		||||
@@ -1324,7 +1313,6 @@ sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/yaml/merge2
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/yaml/merge3
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/yaml/schema
 | 
			
		||||
sigs.k8s.io/kustomize/kyaml/yaml/walk
 | 
			
		||||
# sigs.k8s.io/structured-merge-diff/v4 v4.4.1
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/sigs.k8s.io/kustomize/api/internal/builtins/HelmChartInflationGenerator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/sigs.k8s.io/kustomize/api/internal/builtins/HelmChartInflationGenerator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"slices"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"sigs.k8s.io/kustomize/api/resmap"
 | 
			
		||||
@@ -62,6 +63,9 @@ func (p *HelmChartInflationGeneratorPlugin) Config(
 | 
			
		||||
	if len(h.GeneralConfig().HelmConfig.ApiVersions) != 0 {
 | 
			
		||||
		p.HelmChart.ApiVersions = h.GeneralConfig().HelmConfig.ApiVersions
 | 
			
		||||
	}
 | 
			
		||||
	if h.GeneralConfig().HelmConfig.Debug {
 | 
			
		||||
		p.HelmChart.Debug = h.GeneralConfig().HelmConfig.Debug
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p.h = h
 | 
			
		||||
	if err = yaml.Unmarshal(config, p); err != nil {
 | 
			
		||||
@@ -168,13 +172,17 @@ func (p *HelmChartInflationGeneratorPlugin) runHelmCommand(
 | 
			
		||||
		fmt.Sprintf("HELM_DATA_HOME=%s/.data", p.ConfigHome)}
 | 
			
		||||
	cmd.Env = append(os.Environ(), env...)
 | 
			
		||||
	err := cmd.Run()
 | 
			
		||||
	errorOutput := stderr.String()
 | 
			
		||||
	if slices.Contains(args, "--debug") {
 | 
			
		||||
		errorOutput = " Helm stack trace:\n" + errorOutput + "\nHelm template:\n" + stdout.String() + "\n"
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		helm := p.h.GeneralConfig().HelmConfig.Command
 | 
			
		||||
		err = errors.WrapPrefixf(
 | 
			
		||||
			fmt.Errorf(
 | 
			
		||||
				"unable to run: '%s %s' with env=%s (is '%s' installed?): %w",
 | 
			
		||||
				helm, strings.Join(args, " "), env, helm, err),
 | 
			
		||||
			stderr.String(),
 | 
			
		||||
			errorOutput,
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
	return stdout.Bytes(), err
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/sigs.k8s.io/kustomize/api/internal/builtins/SortOrderTransformer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/sigs.k8s.io/kustomize/api/internal/builtins/SortOrderTransformer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -151,6 +151,9 @@ func gvkLessThan(gvk1, gvk2 resid.Gvk, typeOrders map[string]int) bool {
 | 
			
		||||
	if index1 != index2 {
 | 
			
		||||
		return index1 < index2
 | 
			
		||||
	}
 | 
			
		||||
	if (gvk1.Kind == types.NamespaceKind && gvk2.Kind == types.NamespaceKind) && (gvk1.Group == "" || gvk2.Group == "") {
 | 
			
		||||
		return legacyGVKSortString(gvk1) > legacyGVKSortString(gvk2)
 | 
			
		||||
	}
 | 
			
		||||
	return legacyGVKSortString(gvk1) < legacyGVKSortString(gvk2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -421,6 +421,13 @@ nameReference:
 | 
			
		||||
  fieldSpecs:
 | 
			
		||||
  - path: spec/ingressClassName
 | 
			
		||||
    kind: Ingress
 | 
			
		||||
 | 
			
		||||
- kind: ValidatingAdmissionPolicy
 | 
			
		||||
  group: admissionregistration.k8s.io
 | 
			
		||||
  fieldSpecs:
 | 
			
		||||
  - path: spec/policyName
 | 
			
		||||
    kind: ValidatingAdmissionPolicyBinding
 | 
			
		||||
    group: admissionregistration.k8s.io
 | 
			
		||||
`
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -77,7 +77,6 @@ func NewFnPlugin(o *types.FnPluginLoadingOptions) *FnPlugin {
 | 
			
		||||
		runFns: runfn.RunFns{
 | 
			
		||||
			Functions:      []*yaml.RNode{},
 | 
			
		||||
			Network:        o.Network,
 | 
			
		||||
			EnableStarlark: o.EnableStar,
 | 
			
		||||
			EnableExec:     o.EnableExec,
 | 
			
		||||
			StorageMounts:  toStorageMounts(o.Mounts),
 | 
			
		||||
			Env:            o.Env,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -449,9 +449,6 @@ func (kt *KustTarget) accumulateResources(
 | 
			
		||||
				ra, err = kt.accumulateDirectory(ra, ldr, false)
 | 
			
		||||
			}
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				if kusterr.IsMalformedYAMLError(errF) { // Some error occurred while tyring to decode YAML file
 | 
			
		||||
					return nil, errF
 | 
			
		||||
				}
 | 
			
		||||
				return nil, errors.WrapPrefixf(
 | 
			
		||||
					err, "accumulation err='%s'", errF.Error())
 | 
			
		||||
			}
 | 
			
		||||
@@ -460,7 +457,7 @@ func (kt *KustTarget) accumulateResources(
 | 
			
		||||
	return ra, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// accumulateResources fills the given resourceAccumulator
 | 
			
		||||
// accumulateComponents fills the given resourceAccumulator
 | 
			
		||||
// with resources read from the given list of paths.
 | 
			
		||||
func (kt *KustTarget) accumulateComponents(
 | 
			
		||||
	ra *accumulator.ResAccumulator, paths []string) (*accumulator.ResAccumulator, error) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/sigs.k8s.io/kustomize/api/resource/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/sigs.k8s.io/kustomize/api/resource/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -202,7 +202,10 @@ func (rf *Factory) inlineAnyEmbeddedLists(
 | 
			
		||||
		}
 | 
			
		||||
		items, ok := m["items"]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			// treat as an empty list
 | 
			
		||||
			// Items field is not present.
 | 
			
		||||
			// This is not a collections resource.
 | 
			
		||||
			// read more https://kubernetes.io/docs/reference/using-api/api-concepts/#collections
 | 
			
		||||
			result = append(result, n0)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		slice, ok := items.([]interface{})
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -96,6 +96,9 @@ type HelmChart struct {
 | 
			
		||||
 | 
			
		||||
	// SkipTests skips tests from templated output.
 | 
			
		||||
	SkipTests bool `json:"skipTests,omitempty" yaml:"skipTests,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// debug enables debug output from the Helm chart inflator generator.
 | 
			
		||||
	Debug bool `json:"debug,omitempty" yaml:"debug,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HelmChartArgs contains arguments to helm.
 | 
			
		||||
@@ -188,5 +191,8 @@ func (h HelmChart) AsHelmArgs(absChartHome string) []string {
 | 
			
		||||
	if h.SkipHooks {
 | 
			
		||||
		args = append(args, "--no-hooks")
 | 
			
		||||
	}
 | 
			
		||||
	if h.Debug {
 | 
			
		||||
		args = append(args, "--debug")
 | 
			
		||||
	}
 | 
			
		||||
	return args
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/api/types/kustomization.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/api/types/kustomization.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -22,6 +22,7 @@ const (
 | 
			
		||||
	MetadataNamespacePath       = "metadata/namespace"
 | 
			
		||||
	MetadataNamespaceApiVersion = "v1"
 | 
			
		||||
	MetadataNamePath            = "metadata/name"
 | 
			
		||||
	NamespaceKind               = "Namespace"
 | 
			
		||||
 | 
			
		||||
	OriginAnnotations      = "originAnnotations"
 | 
			
		||||
	TransformerAnnotations = "transformerAnnotations"
 | 
			
		||||
@@ -55,6 +56,7 @@ type Kustomization struct {
 | 
			
		||||
	// Namespace to add to all objects.
 | 
			
		||||
	Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Deprecated: Use the Labels field instead, which provides a superset of the functionality of CommonLabels.
 | 
			
		||||
	// CommonLabels to add to all objects and selectors.
 | 
			
		||||
	CommonLabels map[string]string `json:"commonLabels,omitempty" yaml:"commonLabels,omitempty"`
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,6 +8,7 @@ type HelmConfig struct {
 | 
			
		||||
	Command     string
 | 
			
		||||
	ApiVersions []string
 | 
			
		||||
	KubeVersion string
 | 
			
		||||
	Debug       bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PluginConfig holds plugin configuration.
 | 
			
		||||
@@ -27,7 +28,6 @@ type PluginConfig struct {
 | 
			
		||||
 | 
			
		||||
func EnabledPluginConfig(b BuiltinPluginLoadingOptions) (pc *PluginConfig) {
 | 
			
		||||
	pc = MakePluginConfig(PluginRestrictionsNone, b)
 | 
			
		||||
	pc.FnpLoadingOptions.EnableStar = true
 | 
			
		||||
	pc.HelmConfig.Enabled = true
 | 
			
		||||
	// If this command is not on PATH, tests needing it should skip.
 | 
			
		||||
	pc.HelmConfig.Command = "helmV3"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -46,8 +46,6 @@ const (
 | 
			
		||||
type FnPluginLoadingOptions struct {
 | 
			
		||||
	// Allow to run executables
 | 
			
		||||
	EnableExec bool
 | 
			
		||||
	// Allow to run starlark
 | 
			
		||||
	EnableStar bool
 | 
			
		||||
	// Allow container access to network
 | 
			
		||||
	Network     bool
 | 
			
		||||
	NetworkName string
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/build.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/build.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -30,6 +30,7 @@ var theFlags struct {
 | 
			
		||||
	helmCommand     string
 | 
			
		||||
	helmApiVersions []string
 | 
			
		||||
	helmKubeVersion string
 | 
			
		||||
	helmDebug       bool
 | 
			
		||||
	loadRestrictor  string
 | 
			
		||||
	reorderOutput   string
 | 
			
		||||
	fnOptions       types.FnPluginLoadingOptions
 | 
			
		||||
@@ -163,6 +164,7 @@ func HonorKustomizeFlags(kOpts *krusty.Options, flags *flag.FlagSet) *krusty.Opt
 | 
			
		||||
	kOpts.PluginConfig.HelmConfig.Command = theFlags.helmCommand
 | 
			
		||||
	kOpts.PluginConfig.HelmConfig.ApiVersions = theFlags.helmApiVersions
 | 
			
		||||
	kOpts.PluginConfig.HelmConfig.KubeVersion = theFlags.helmKubeVersion
 | 
			
		||||
	kOpts.PluginConfig.HelmConfig.Debug = theFlags.helmDebug
 | 
			
		||||
	kOpts.AddManagedbyLabel = isManagedByLabelEnabled()
 | 
			
		||||
	return kOpts
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenablehelm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenablehelm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -31,4 +31,9 @@ func AddFlagEnableHelm(set *pflag.FlagSet) {
 | 
			
		||||
		"helm-kube-version",
 | 
			
		||||
		"", // default
 | 
			
		||||
		"Kubernetes version used by Helm for Capabilities.KubeVersion")
 | 
			
		||||
	set.BoolVar(
 | 
			
		||||
		&theFlags.helmDebug,
 | 
			
		||||
		"helm-debug",
 | 
			
		||||
		false,
 | 
			
		||||
		"Enable debug output from the Helm chart inflator generator.")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagsforfunctions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagsforfunctions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -30,7 +30,4 @@ func AddFunctionAlphaEnablementFlags(set *pflag.FlagSet) {
 | 
			
		||||
		&theFlags.fnOptions.EnableExec, "enable-exec", false,
 | 
			
		||||
		"enable support for exec functions (raw executables); "+
 | 
			
		||||
			"do not use for untrusted configs! (Alpha)")
 | 
			
		||||
	set.BoolVar(
 | 
			
		||||
		&theFlags.fnOptions.EnableStar, "enable-star", false,
 | 
			
		||||
		"enable support for starlark functions. (Alpha)")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/container/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/container/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -167,7 +167,7 @@ func (c *Filter) setupExec() error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getArgs returns the command + args to run to spawn the container
 | 
			
		||||
// getCommand returns the command + args to run to spawn the container
 | 
			
		||||
func (c *Filter) getCommand() (string, []string) {
 | 
			
		||||
	network := runtimeutil.NetworkNameNone
 | 
			
		||||
	if c.ContainerSpec.Network {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -132,9 +132,6 @@ type FunctionSpec struct {
 | 
			
		||||
	// Container is the spec for running a function as a container
 | 
			
		||||
	Container ContainerSpec `json:"container,omitempty" yaml:"container,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Starlark is the spec for running a function as a starlark script
 | 
			
		||||
	Starlark StarlarkSpec `json:"starlark,omitempty" yaml:"starlark,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// ExecSpec is the spec for running a function as an executable
 | 
			
		||||
	Exec ExecSpec `json:"exec,omitempty" yaml:"exec,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
@@ -158,17 +155,6 @@ type ContainerSpec struct {
 | 
			
		||||
	Env []string `json:"envs,omitempty" yaml:"envs,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StarlarkSpec defines how to run a function as a starlark program
 | 
			
		||||
type StarlarkSpec struct {
 | 
			
		||||
	Name string `json:"name,omitempty" yaml:"name,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Path specifies a path to a starlark script
 | 
			
		||||
	Path string `json:"path,omitempty" yaml:"path,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// URL specifies a url containing a starlark script
 | 
			
		||||
	URL string `json:"url,omitempty" yaml:"url,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StorageMount represents a container's mounted storage option(s)
 | 
			
		||||
type StorageMount struct {
 | 
			
		||||
	// Type of mount e.g. bind mount, local volume, etc.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										79
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										79
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,79 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/starlark"
 | 
			
		||||
	"go.starlark.net/starlarkstruct"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/errors"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/openapi"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Context struct {
 | 
			
		||||
	resourceList starlark.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Context) predeclared() (starlark.StringDict, error) {
 | 
			
		||||
	e, err := env()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	oa, err := oa()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	dict := starlark.StringDict{
 | 
			
		||||
		"resource_list": c.resourceList,
 | 
			
		||||
		"open_api":      oa,
 | 
			
		||||
		"environment":   e,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return starlark.StringDict{
 | 
			
		||||
		"ctx": starlarkstruct.FromStringDict(starlarkstruct.Default, dict),
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func oa() (starlark.Value, error) {
 | 
			
		||||
	return interfaceToValue(openapi.Schema())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func env() (starlark.Value, error) {
 | 
			
		||||
	env := map[string]interface{}{}
 | 
			
		||||
	for _, e := range os.Environ() {
 | 
			
		||||
		pair := strings.SplitN(e, "=", 2)
 | 
			
		||||
		if len(pair) < 2 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		env[pair[0]] = pair[1]
 | 
			
		||||
	}
 | 
			
		||||
	value, err := util.Marshal(env)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
	return value, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func interfaceToValue(i interface{}) (starlark.Value, error) {
 | 
			
		||||
	b, err := json.Marshal(i)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var in map[string]interface{}
 | 
			
		||||
	if err := yaml.Unmarshal(b, &in); err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	value, err := util.Marshal(in)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
	return value, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										36
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,36 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
// Package starlark contains a kio.Filter which can be applied to resources to transform
 | 
			
		||||
// them through starlark program.
 | 
			
		||||
//
 | 
			
		||||
// Starlark has become a popular runtime embedding in go programs, especially for Kubernetes
 | 
			
		||||
// and data processing.
 | 
			
		||||
// Examples: https://github.com/cruise-automation/isopod, https://qri.io/docs/starlark/starlib,
 | 
			
		||||
// https://github.com/stripe/skycfg, https://github.com/k14s/ytt
 | 
			
		||||
//
 | 
			
		||||
// The resources are provided to the starlark program through the global variable "resourceList".
 | 
			
		||||
// "resourceList" is a dictionary containing an "items" field with a list of resources.
 | 
			
		||||
// The starlark modified "resourceList" is the Filter output.
 | 
			
		||||
//
 | 
			
		||||
// After being run through the starlark program, the filter will copy the comments from the input
 | 
			
		||||
// resources to restore them -- due to them being dropped as a result of serializing the resources
 | 
			
		||||
// as starlark values.
 | 
			
		||||
//
 | 
			
		||||
// "resourceList" may also contain a "functionConfig" entry to configure the starlark script itself.
 | 
			
		||||
// Changes made by the starlark program to the "functionConfig" will be reflected in the
 | 
			
		||||
// Filter.FunctionConfig value.
 | 
			
		||||
//
 | 
			
		||||
// The Filter will also format the output so that output has the preferred field ordering
 | 
			
		||||
// rather than an alphabetical field ordering.
 | 
			
		||||
//
 | 
			
		||||
// The resourceList variable adheres to the kustomize function spec as specified by:
 | 
			
		||||
// https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md
 | 
			
		||||
//
 | 
			
		||||
// All items in the resourceList are resources represented as starlark dictionaries/
 | 
			
		||||
// The items in the resourceList respect the io spec specified by:
 | 
			
		||||
// https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/config-io.md
 | 
			
		||||
//
 | 
			
		||||
// The starlark language spec can be found here:
 | 
			
		||||
// https://github.com/google/starlark-go/blob/master/doc/spec.md
 | 
			
		||||
package starlark
 | 
			
		||||
							
								
								
									
										180
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										180
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,180 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package starlark
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/starlark"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/errors"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio/filters"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Filter transforms a set of resources through the provided program
 | 
			
		||||
type Filter struct {
 | 
			
		||||
	Name string
 | 
			
		||||
 | 
			
		||||
	// Program is a starlark script which will be run against the resources
 | 
			
		||||
	Program string
 | 
			
		||||
 | 
			
		||||
	// URL is the url of a starlark program to fetch and run
 | 
			
		||||
	URL string
 | 
			
		||||
 | 
			
		||||
	// Path is the path to a starlark program to read and run
 | 
			
		||||
	Path string
 | 
			
		||||
 | 
			
		||||
	runtimeutil.FunctionFilter
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sf *Filter) String() string {
 | 
			
		||||
	return fmt.Sprintf(
 | 
			
		||||
		"name: %v path: %v url: %v program: %v", sf.Name, sf.Path, sf.URL, sf.Program)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sf *Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	if err := sf.setup(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	sf.FunctionFilter.Run = sf.Run
 | 
			
		||||
 | 
			
		||||
	return sf.FunctionFilter.Filter(nodes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sf *Filter) setup() error {
 | 
			
		||||
	if (sf.URL != "" && sf.Path != "") ||
 | 
			
		||||
		(sf.URL != "" && sf.Program != "") ||
 | 
			
		||||
		(sf.Path != "" && sf.Program != "") {
 | 
			
		||||
		return errors.Errorf("Filter Path, Program and URL are mutually exclusive")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// read the program from a file
 | 
			
		||||
	if sf.Path != "" {
 | 
			
		||||
		b, err := os.ReadFile(sf.Path)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		sf.Program = string(b)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// read the program from a URL
 | 
			
		||||
	if sf.URL != "" {
 | 
			
		||||
		err := func() error {
 | 
			
		||||
			resp, err := http.Get(sf.URL)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			defer resp.Body.Close()
 | 
			
		||||
			b, err := io.ReadAll(resp.Body)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			sf.Program = string(b)
 | 
			
		||||
			return nil
 | 
			
		||||
		}()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sf *Filter) Run(reader io.Reader, writer io.Writer) error {
 | 
			
		||||
	// retain map of inputs to outputs by id so if the name is changed by the
 | 
			
		||||
	// starlark program, we are able to match the same resources
 | 
			
		||||
	value, err := sf.readResourceList(reader)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// run the starlark as program as transformation function
 | 
			
		||||
	thread := &starlark.Thread{Name: sf.Name}
 | 
			
		||||
 | 
			
		||||
	ctx := &Context{resourceList: value}
 | 
			
		||||
	pd, err := ctx.predeclared()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
	_, err = starlark.ExecFile(thread, sf.Name, sf.Program, pd)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sf.writeResourceList(value, writer)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// inputToResourceList transforms input into a starlark.Value
 | 
			
		||||
func (sf *Filter) readResourceList(reader io.Reader) (starlark.Value, error) {
 | 
			
		||||
	// read and parse the inputs
 | 
			
		||||
	rl := bytes.Buffer{}
 | 
			
		||||
	_, err := rl.ReadFrom(reader)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
	rn, err := yaml.Parse(rl.String())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// convert to a starlark value
 | 
			
		||||
	b, err := yaml.Marshal(rn.Document()) // convert to bytes
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
	var in map[string]interface{}
 | 
			
		||||
	err = yaml.Unmarshal(b, &in) // convert to map[string]interface{}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
	return util.Marshal(in) // convert to starlark value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// resourceListToOutput converts the output of the starlark program to the filter output
 | 
			
		||||
func (sf *Filter) writeResourceList(value starlark.Value, writer io.Writer) error {
 | 
			
		||||
	// convert the modified resourceList back into a slice of RNodes
 | 
			
		||||
	// by first converting to a map[string]interface{}
 | 
			
		||||
	out, err := util.Unmarshal(value)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
	b, err := yaml.Marshal(out)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rl, err := yaml.Parse(string(b))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// preserve the comments from the input
 | 
			
		||||
	items, err := rl.Pipe(yaml.Lookup("items"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
	err = items.VisitElements(func(node *yaml.RNode) error {
 | 
			
		||||
		// starlark will serialize the resources sorting the fields alphabetically,
 | 
			
		||||
		// format them to have a better ordering
 | 
			
		||||
		_, err := filters.FormatFilter{}.Filter([]*yaml.RNode{node})
 | 
			
		||||
		return err
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s, err := rl.String()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrap(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = writer.Write([]byte(s))
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2018 QRI, Inc.
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
in the Software without restriction, including without limitation the rights
 | 
			
		||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in
 | 
			
		||||
all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										25
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,25 +0,0 @@
 | 
			
		||||
// The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2018 QRI, Inc.
 | 
			
		||||
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in
 | 
			
		||||
// all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
// THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// Package util is forked from https://github.com/qri-io/starlib in order to prune
 | 
			
		||||
// excessive transitive dependencies from pulling in that library.
 | 
			
		||||
package util
 | 
			
		||||
							
								
								
									
										275
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										275
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,275 +0,0 @@
 | 
			
		||||
// The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2018 QRI, Inc.
 | 
			
		||||
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in
 | 
			
		||||
// all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
// THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
package util
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"go.starlark.net/starlark"
 | 
			
		||||
	"go.starlark.net/starlarkstruct"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// // asString unquotes a starlark string value
 | 
			
		||||
// func asString(x starlark.Value) (string, error) {
 | 
			
		||||
// 	return strconv.Unquote(x.String())
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// IsEmptyString checks is a starlark string is empty ("" for a go string)
 | 
			
		||||
// starlark.String.String performs repr-style quotation, which is necessary
 | 
			
		||||
// for the starlark.Value contract but a frequent source of errors in API
 | 
			
		||||
// clients. This helper method makes sure it'll work properly
 | 
			
		||||
func IsEmptyString(s starlark.String) bool {
 | 
			
		||||
	return s.String() == `""`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshal decodes a starlark.Value into it's golang counterpart
 | 
			
		||||
//
 | 
			
		||||
//nolint:nakedret
 | 
			
		||||
func Unmarshal(x starlark.Value) (val interface{}, err error) {
 | 
			
		||||
	switch v := x.(type) {
 | 
			
		||||
	case starlark.NoneType:
 | 
			
		||||
		val = nil
 | 
			
		||||
	case starlark.Bool:
 | 
			
		||||
		val = v.Truth() == starlark.True
 | 
			
		||||
	case starlark.Int:
 | 
			
		||||
		val, err = starlark.AsInt32(x)
 | 
			
		||||
	case starlark.Float:
 | 
			
		||||
		if f, ok := starlark.AsFloat(x); !ok {
 | 
			
		||||
			err = fmt.Errorf("couldn't parse float")
 | 
			
		||||
		} else {
 | 
			
		||||
			val = f
 | 
			
		||||
		}
 | 
			
		||||
	case starlark.String:
 | 
			
		||||
		val = v.GoString()
 | 
			
		||||
	// case starlibtime.Time:
 | 
			
		||||
	// 	val = time.Time(v)
 | 
			
		||||
	case *starlark.Dict:
 | 
			
		||||
		var (
 | 
			
		||||
			dictVal starlark.Value
 | 
			
		||||
			pval    interface{}
 | 
			
		||||
			kval    interface{}
 | 
			
		||||
			keys    []interface{}
 | 
			
		||||
			vals    []interface{}
 | 
			
		||||
			// key as interface if found one key is not a string
 | 
			
		||||
			ki bool
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		for _, k := range v.Keys() {
 | 
			
		||||
			dictVal, _, err = v.Get(k)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			pval, err = Unmarshal(dictVal)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				err = fmt.Errorf("unmarshaling starlark value: %w", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			kval, err = Unmarshal(k)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				err = fmt.Errorf("unmarshaling starlark key: %w", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if _, ok := kval.(string); !ok {
 | 
			
		||||
				// found key as not a string
 | 
			
		||||
				ki = true
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			keys = append(keys, kval)
 | 
			
		||||
			vals = append(vals, pval)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// prepare result
 | 
			
		||||
 | 
			
		||||
		rs := map[string]interface{}{}
 | 
			
		||||
		ri := map[interface{}]interface{}{}
 | 
			
		||||
 | 
			
		||||
		for i, key := range keys {
 | 
			
		||||
			// key as interface
 | 
			
		||||
			if ki {
 | 
			
		||||
				ri[key] = vals[i]
 | 
			
		||||
			} else {
 | 
			
		||||
				rs[key.(string)] = vals[i]
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ki {
 | 
			
		||||
			val = ri // map[interface{}]interface{}
 | 
			
		||||
		} else {
 | 
			
		||||
			val = rs // map[string]interface{}
 | 
			
		||||
		}
 | 
			
		||||
	case *starlark.List:
 | 
			
		||||
		var (
 | 
			
		||||
			i       int
 | 
			
		||||
			listVal starlark.Value
 | 
			
		||||
			iter    = v.Iterate()
 | 
			
		||||
			value   = make([]interface{}, v.Len())
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		defer iter.Done()
 | 
			
		||||
		for iter.Next(&listVal) {
 | 
			
		||||
			value[i], err = Unmarshal(listVal)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
		val = value
 | 
			
		||||
	case starlark.Tuple:
 | 
			
		||||
		var (
 | 
			
		||||
			i        int
 | 
			
		||||
			tupleVal starlark.Value
 | 
			
		||||
			iter     = v.Iterate()
 | 
			
		||||
			value    = make([]interface{}, v.Len())
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		defer iter.Done()
 | 
			
		||||
		for iter.Next(&tupleVal) {
 | 
			
		||||
			value[i], err = Unmarshal(tupleVal)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
		val = value
 | 
			
		||||
	case *starlark.Set:
 | 
			
		||||
		fmt.Println("errnotdone: SET")
 | 
			
		||||
		err = fmt.Errorf("sets aren't yet supported")
 | 
			
		||||
	case *starlarkstruct.Struct:
 | 
			
		||||
		if _var, ok := v.Constructor().(Unmarshaler); ok {
 | 
			
		||||
			err = _var.UnmarshalStarlark(x)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				err = errors.WrapPrefixf(err, "failed marshal %q to Starlark object", v.Constructor().Type())
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			val = _var
 | 
			
		||||
		} else {
 | 
			
		||||
			err = fmt.Errorf("constructor object from *starlarkstruct.Struct not supported Marshaler to starlark object: %s", v.Constructor().Type())
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Println("errbadtype:", x.Type())
 | 
			
		||||
		err = fmt.Errorf("unrecognized starlark type: %s", x.Type())
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Marshal turns go values into starlark types
 | 
			
		||||
//
 | 
			
		||||
//nolint:nakedret
 | 
			
		||||
func Marshal(data interface{}) (v starlark.Value, err error) {
 | 
			
		||||
	switch x := data.(type) {
 | 
			
		||||
	case nil:
 | 
			
		||||
		v = starlark.None
 | 
			
		||||
	case bool:
 | 
			
		||||
		v = starlark.Bool(x)
 | 
			
		||||
	case string:
 | 
			
		||||
		v = starlark.String(x)
 | 
			
		||||
	case int:
 | 
			
		||||
		v = starlark.MakeInt(x)
 | 
			
		||||
	case int8:
 | 
			
		||||
		v = starlark.MakeInt(int(x))
 | 
			
		||||
	case int16:
 | 
			
		||||
		v = starlark.MakeInt(int(x))
 | 
			
		||||
	case int32:
 | 
			
		||||
		v = starlark.MakeInt(int(x))
 | 
			
		||||
	case int64:
 | 
			
		||||
		v = starlark.MakeInt64(x)
 | 
			
		||||
	case uint:
 | 
			
		||||
		v = starlark.MakeUint(x)
 | 
			
		||||
	case uint8:
 | 
			
		||||
		v = starlark.MakeUint(uint(x))
 | 
			
		||||
	case uint16:
 | 
			
		||||
		v = starlark.MakeUint(uint(x))
 | 
			
		||||
	case uint32:
 | 
			
		||||
		v = starlark.MakeUint(uint(x))
 | 
			
		||||
	case uint64:
 | 
			
		||||
		v = starlark.MakeUint64(x)
 | 
			
		||||
	case float32:
 | 
			
		||||
		v = starlark.Float(float64(x))
 | 
			
		||||
	case float64:
 | 
			
		||||
		v = starlark.Float(x)
 | 
			
		||||
	// case time.Time:
 | 
			
		||||
	// 	v = starlibtime.Time(x)
 | 
			
		||||
	case []interface{}:
 | 
			
		||||
		var elems = make([]starlark.Value, len(x))
 | 
			
		||||
		for i, val := range x {
 | 
			
		||||
			elems[i], err = Marshal(val)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		v = starlark.NewList(elems)
 | 
			
		||||
	case map[interface{}]interface{}:
 | 
			
		||||
		dict := &starlark.Dict{}
 | 
			
		||||
		var elem starlark.Value
 | 
			
		||||
		for ki, val := range x {
 | 
			
		||||
			var key starlark.Value
 | 
			
		||||
			key, err = Marshal(ki)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			elem, err = Marshal(val)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			if err = dict.SetKey(key, elem); err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		v = dict
 | 
			
		||||
	case map[string]interface{}:
 | 
			
		||||
		dict := &starlark.Dict{}
 | 
			
		||||
		var elem starlark.Value
 | 
			
		||||
		for key, val := range x {
 | 
			
		||||
			elem, err = Marshal(val)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			if err = dict.SetKey(starlark.String(key), elem); err != nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		v = dict
 | 
			
		||||
	case Marshaler:
 | 
			
		||||
		v, err = x.MarshalStarlark()
 | 
			
		||||
	default:
 | 
			
		||||
		return starlark.None, fmt.Errorf("unrecognized type: %#v", x)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshaler is the interface use to unmarshal starlark custom types.
 | 
			
		||||
type Unmarshaler interface {
 | 
			
		||||
	// UnmarshalStarlark unmarshal a starlark object to custom type.
 | 
			
		||||
	UnmarshalStarlark(starlark.Value) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Marshaler is the interface use to marshal starlark custom types.
 | 
			
		||||
type Marshaler interface {
 | 
			
		||||
	// MarshalStarlark marshal a custom type to starlark object.
 | 
			
		||||
	MarshalStarlark() (starlark.Value, error)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										210
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/filters.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										210
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/filters.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,210 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package filters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Filters are the list of known filters for unmarshalling a filter into a concrete
 | 
			
		||||
// implementation.
 | 
			
		||||
var Filters = map[string]func() kio.Filter{
 | 
			
		||||
	"FileSetter":    func() kio.Filter { return &FileSetter{} },
 | 
			
		||||
	"FormatFilter":  func() kio.Filter { return &FormatFilter{} },
 | 
			
		||||
	"GrepFilter":    func() kio.Filter { return GrepFilter{} },
 | 
			
		||||
	"MatchModifier": func() kio.Filter { return &MatchModifyFilter{} },
 | 
			
		||||
	"Modifier":      func() kio.Filter { return &Modifier{} },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// filter wraps a kio.filter so that it can be unmarshalled from yaml.
 | 
			
		||||
type KFilter struct {
 | 
			
		||||
	kio.Filter
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t KFilter) MarshalYAML() (interface{}, error) {
 | 
			
		||||
	return t.Filter, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *KFilter) UnmarshalYAML(unmarshal func(interface{}) error) error {
 | 
			
		||||
	i := map[string]interface{}{}
 | 
			
		||||
	if err := unmarshal(i); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	meta := &yaml.ResourceMeta{}
 | 
			
		||||
	if err := unmarshal(meta); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	filter, found := Filters[meta.Kind]
 | 
			
		||||
	if !found {
 | 
			
		||||
		var knownFilters []string
 | 
			
		||||
		for k := range Filters {
 | 
			
		||||
			knownFilters = append(knownFilters, k)
 | 
			
		||||
		}
 | 
			
		||||
		sort.Strings(knownFilters)
 | 
			
		||||
		return fmt.Errorf("unsupported filter Kind %v:  may be one of: [%s]",
 | 
			
		||||
			meta, strings.Join(knownFilters, ","))
 | 
			
		||||
	}
 | 
			
		||||
	t.Filter = filter()
 | 
			
		||||
 | 
			
		||||
	return unmarshal(t.Filter)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Modifier modifies the input Resources by invoking the provided pipeline.
 | 
			
		||||
// Modifier will return any Resources for which the pipeline does not return an error.
 | 
			
		||||
type Modifier struct {
 | 
			
		||||
	Kind string `yaml:"kind,omitempty"`
 | 
			
		||||
 | 
			
		||||
	Filters yaml.YFilters `yaml:"pipeline,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ kio.Filter = &Modifier{}
 | 
			
		||||
 | 
			
		||||
func (f Modifier) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	for i := range input {
 | 
			
		||||
		if _, err := input[i].Pipe(f.Filters.Filters()...); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return input, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type MatchModifyFilter struct {
 | 
			
		||||
	Kind string `yaml:"kind,omitempty"`
 | 
			
		||||
 | 
			
		||||
	MatchFilters []yaml.YFilters `yaml:"match,omitempty"`
 | 
			
		||||
 | 
			
		||||
	ModifyFilters yaml.YFilters `yaml:"modify,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ kio.Filter = &MatchModifyFilter{}
 | 
			
		||||
 | 
			
		||||
func (f MatchModifyFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	var matches = input
 | 
			
		||||
	var err error
 | 
			
		||||
	for _, filter := range f.MatchFilters {
 | 
			
		||||
		matches, err = MatchFilter{Filters: filter}.Filter(matches)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	_, err = Modifier{Filters: f.ModifyFilters}.Filter(matches)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return input, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type MatchFilter struct {
 | 
			
		||||
	Kind string `yaml:"kind,omitempty"`
 | 
			
		||||
 | 
			
		||||
	Filters yaml.YFilters `yaml:"pipeline,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ kio.Filter = &MatchFilter{}
 | 
			
		||||
 | 
			
		||||
func (f MatchFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	var output []*yaml.RNode
 | 
			
		||||
	for i := range input {
 | 
			
		||||
		if v, err := input[i].Pipe(f.Filters.Filters()...); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		} else if v == nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		output = append(output, input[i])
 | 
			
		||||
	}
 | 
			
		||||
	return output, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type FilenameFmtVerb string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// KindFmt substitutes kind
 | 
			
		||||
	KindFmt FilenameFmtVerb = "%k"
 | 
			
		||||
 | 
			
		||||
	// NameFmt substitutes metadata.name
 | 
			
		||||
	NameFmt FilenameFmtVerb = "%n"
 | 
			
		||||
 | 
			
		||||
	// NamespaceFmt substitutes metdata.namespace
 | 
			
		||||
	NamespaceFmt FilenameFmtVerb = "%s"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// FileSetter sets the file name and mode annotations on Resources.
 | 
			
		||||
type FileSetter struct {
 | 
			
		||||
	Kind string `yaml:"kind,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// FilenamePattern is the pattern to use for generating filenames.  FilenameFmtVerb
 | 
			
		||||
	// FielnameFmtVerbs may be specified to substitute Resource metadata into the filename.
 | 
			
		||||
	FilenamePattern string `yaml:"filenamePattern,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Mode is the filemode to write.
 | 
			
		||||
	Mode string `yaml:"mode,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Override will override the existing filename if it is set on the pattern.
 | 
			
		||||
	// Otherwise the existing filename is kept.
 | 
			
		||||
	Override bool `yaml:"override,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ kio.Filter = &FileSetter{}
 | 
			
		||||
 | 
			
		||||
const DefaultFilenamePattern = "%n_%k.yaml"
 | 
			
		||||
 | 
			
		||||
func (f *FileSetter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	if f.Mode == "" {
 | 
			
		||||
		f.Mode = fmt.Sprintf("%d", 0600)
 | 
			
		||||
	}
 | 
			
		||||
	if f.FilenamePattern == "" {
 | 
			
		||||
		f.FilenamePattern = DefaultFilenamePattern
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resources := map[string][]*yaml.RNode{}
 | 
			
		||||
	for i := range input {
 | 
			
		||||
		if err := kioutil.CopyLegacyAnnotations(input[i]); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m, err := input[i].GetMeta()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		file := f.FilenamePattern
 | 
			
		||||
		file = strings.ReplaceAll(file, string(KindFmt), strings.ToLower(m.Kind))
 | 
			
		||||
		file = strings.ReplaceAll(file, string(NameFmt), strings.ToLower(m.Name))
 | 
			
		||||
		file = strings.ReplaceAll(file, string(NamespaceFmt), strings.ToLower(m.Namespace))
 | 
			
		||||
 | 
			
		||||
		if _, found := m.Annotations[kioutil.PathAnnotation]; !found || f.Override {
 | 
			
		||||
			if _, err := input[i].Pipe(yaml.SetAnnotation(kioutil.PathAnnotation, file)); err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			if _, err := input[i].Pipe(yaml.SetAnnotation(kioutil.LegacyPathAnnotation, file)); err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		resources[file] = append(resources[file], input[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var output []*yaml.RNode
 | 
			
		||||
	for i := range resources {
 | 
			
		||||
		if err := kioutil.SortNodes(resources[i]); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		for j := range resources[i] {
 | 
			
		||||
			if _, err := resources[i][j].Pipe(
 | 
			
		||||
				yaml.SetAnnotation(kioutil.IndexAnnotation, fmt.Sprintf("%d", j))); err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			if _, err := resources[i][j].Pipe(
 | 
			
		||||
				yaml.SetAnnotation(kioutil.LegacyIndexAnnotation, fmt.Sprintf("%d", j))); err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			output = append(output, resources[i][j])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return output, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										314
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/fmtr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										314
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/fmtr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,314 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
// Package yamlfmt contains libraries for formatting yaml files containing
 | 
			
		||||
// Kubernetes Resource configuration.
 | 
			
		||||
//
 | 
			
		||||
// Yaml files are formatted by:
 | 
			
		||||
// - Sorting fields and map values
 | 
			
		||||
// - Sorting unordered lists for whitelisted types
 | 
			
		||||
// - Applying a canonical yaml Style
 | 
			
		||||
//
 | 
			
		||||
// Fields are ordered using a relative ordering applied to commonly
 | 
			
		||||
// encountered Resource fields.  All Resources,  including non-builtin
 | 
			
		||||
// Resources such as CRDs, share the same field precedence.
 | 
			
		||||
//
 | 
			
		||||
// Fields that do not appear in the explicit ordering are ordered
 | 
			
		||||
// lexicographically.
 | 
			
		||||
//
 | 
			
		||||
// A subset of well known known unordered lists are sorted by element field
 | 
			
		||||
// values.
 | 
			
		||||
package filters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"sort"
 | 
			
		||||
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/openapi"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type FormattingStrategy = string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// NoFmtAnnotation determines if the resource should be formatted.
 | 
			
		||||
	FmtAnnotation string = "config.kubernetes.io/formatting"
 | 
			
		||||
 | 
			
		||||
	// FmtStrategyStandard means the resource will be formatted according
 | 
			
		||||
	// to the default rules.
 | 
			
		||||
	FmtStrategyStandard FormattingStrategy = "standard"
 | 
			
		||||
 | 
			
		||||
	// FmtStrategyNone means the resource will not be formatted.
 | 
			
		||||
	FmtStrategyNone FormattingStrategy = "none"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// FormatInput returns the formatted input.
 | 
			
		||||
func FormatInput(input io.Reader) (*bytes.Buffer, error) {
 | 
			
		||||
	buff := &bytes.Buffer{}
 | 
			
		||||
	err := kio.Pipeline{
 | 
			
		||||
		Inputs:  []kio.Reader{&kio.ByteReader{Reader: input}},
 | 
			
		||||
		Filters: []kio.Filter{FormatFilter{}},
 | 
			
		||||
		Outputs: []kio.Writer{kio.ByteWriter{Writer: buff}},
 | 
			
		||||
	}.Execute()
 | 
			
		||||
 | 
			
		||||
	return buff, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FormatFileOrDirectory reads the file or directory and formats each file's
 | 
			
		||||
// contents by writing it back to the file.
 | 
			
		||||
func FormatFileOrDirectory(path string) error {
 | 
			
		||||
	return kio.Pipeline{
 | 
			
		||||
		Inputs: []kio.Reader{kio.LocalPackageReader{
 | 
			
		||||
			PackagePath: path,
 | 
			
		||||
		}},
 | 
			
		||||
		Filters: []kio.Filter{FormatFilter{}},
 | 
			
		||||
		Outputs: []kio.Writer{kio.LocalPackageWriter{PackagePath: path}},
 | 
			
		||||
	}.Execute()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type FormatFilter struct {
 | 
			
		||||
	Process   func(n *yaml.Node) error
 | 
			
		||||
	UseSchema bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ kio.Filter = FormatFilter{}
 | 
			
		||||
 | 
			
		||||
func (f FormatFilter) Filter(slice []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	for i := range slice {
 | 
			
		||||
		fmtStrategy, err := getFormattingStrategy(slice[i])
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if fmtStrategy == FmtStrategyNone {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		kindNode, err := slice[i].Pipe(yaml.Get("kind"))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if kindNode == nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		apiVersionNode, err := slice[i].Pipe(yaml.Get("apiVersion"))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if apiVersionNode == nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		kind, apiVersion := kindNode.YNode().Value, apiVersionNode.YNode().Value
 | 
			
		||||
		var s *openapi.ResourceSchema
 | 
			
		||||
		if f.UseSchema {
 | 
			
		||||
			s = openapi.SchemaForResourceType(yaml.TypeMeta{APIVersion: apiVersion, Kind: kind})
 | 
			
		||||
		} else {
 | 
			
		||||
			s = nil
 | 
			
		||||
		}
 | 
			
		||||
		err = (&formatter{apiVersion: apiVersion, kind: kind, process: f.Process}).
 | 
			
		||||
			fmtNode(slice[i].YNode(), "", s)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return slice, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getFormattingStrategy looks for the formatting annotation to determine
 | 
			
		||||
// which strategy should be used for formatting. The default is standard
 | 
			
		||||
// if no annotation is found.
 | 
			
		||||
func getFormattingStrategy(node *yaml.RNode) (FormattingStrategy, error) {
 | 
			
		||||
	value, err := node.Pipe(yaml.GetAnnotation(FmtAnnotation))
 | 
			
		||||
	if err != nil || value == nil {
 | 
			
		||||
		return FmtStrategyStandard, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmtStrategy := value.YNode().Value
 | 
			
		||||
 | 
			
		||||
	switch fmtStrategy {
 | 
			
		||||
	case FmtStrategyStandard:
 | 
			
		||||
		return FmtStrategyStandard, nil
 | 
			
		||||
	case FmtStrategyNone:
 | 
			
		||||
		return FmtStrategyNone, nil
 | 
			
		||||
	default:
 | 
			
		||||
		return "", fmt.Errorf(
 | 
			
		||||
			"formatting annotation has illegal value %s", fmtStrategy)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type formatter struct {
 | 
			
		||||
	apiVersion string
 | 
			
		||||
	kind       string
 | 
			
		||||
	process    func(n *yaml.Node) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// fmtNode recursively formats the Document Contents.
 | 
			
		||||
// See: https://godoc.org/gopkg.in/yaml.v3#Node
 | 
			
		||||
func (f *formatter) fmtNode(n *yaml.Node, path string, schema *openapi.ResourceSchema) error {
 | 
			
		||||
	if n.Kind == yaml.ScalarNode && schema != nil && schema.Schema != nil {
 | 
			
		||||
		// ensure values that are interpreted as non-string values (e.g. "true")
 | 
			
		||||
		// are properly quoted
 | 
			
		||||
		yaml.FormatNonStringStyle(n, *schema.Schema)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// sort the order of mapping fields
 | 
			
		||||
	if n.Kind == yaml.MappingNode {
 | 
			
		||||
		sort.Sort(sortedMapContents(*n))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// sort the order of sequence elements if it is whitelisted
 | 
			
		||||
	if n.Kind == yaml.SequenceNode {
 | 
			
		||||
		if yaml.WhitelistedListSortKinds.Has(f.kind) &&
 | 
			
		||||
			yaml.WhitelistedListSortApis.Has(f.apiVersion) {
 | 
			
		||||
			if sortField, found := yaml.WhitelistedListSortFields[path]; found {
 | 
			
		||||
				sort.Sort(sortedSeqContents{Node: *n, sortField: sortField})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// format the Content
 | 
			
		||||
	for i := range n.Content {
 | 
			
		||||
		// MappingNode are structured as having their fields as Content,
 | 
			
		||||
		// with the field-key and field-value alternating.  e.g. Even elements
 | 
			
		||||
		// are the keys and odd elements are the values
 | 
			
		||||
		isFieldKey := n.Kind == yaml.MappingNode && i%2 == 0
 | 
			
		||||
		isFieldValue := n.Kind == yaml.MappingNode && i%2 == 1
 | 
			
		||||
		isElement := n.Kind == yaml.SequenceNode
 | 
			
		||||
 | 
			
		||||
		// run the process callback on the node if it has been set
 | 
			
		||||
		// don't process keys: their format should be fixed
 | 
			
		||||
		if f.process != nil && !isFieldKey {
 | 
			
		||||
			if err := f.process(n.Content[i]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// get the schema for this Node
 | 
			
		||||
		p := path
 | 
			
		||||
		var s *openapi.ResourceSchema
 | 
			
		||||
		switch {
 | 
			
		||||
		case isFieldValue:
 | 
			
		||||
			// if the node is a field, lookup the schema using the field name
 | 
			
		||||
			p = fmt.Sprintf("%s.%s", path, n.Content[i-1].Value)
 | 
			
		||||
			if schema != nil {
 | 
			
		||||
				s = schema.Field(n.Content[i-1].Value)
 | 
			
		||||
			}
 | 
			
		||||
		case isElement:
 | 
			
		||||
			// if the node is a list element, lookup the schema for the array items
 | 
			
		||||
			if schema != nil {
 | 
			
		||||
				s = schema.Elements()
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		// format the node using the schema
 | 
			
		||||
		err := f.fmtNode(n.Content[i], p, s)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// sortedMapContents sorts the Contents field of a MappingNode by the field names using a statically
 | 
			
		||||
// defined field precedence, and falling back on lexicographical sorting
 | 
			
		||||
type sortedMapContents yaml.Node
 | 
			
		||||
 | 
			
		||||
func (s sortedMapContents) Len() int {
 | 
			
		||||
	return len(s.Content) / 2
 | 
			
		||||
}
 | 
			
		||||
func (s sortedMapContents) Swap(i, j int) {
 | 
			
		||||
	// yaml MappingNode Contents are a list of field names followed by
 | 
			
		||||
	// field values, rather than a list of field <name, value> pairs.
 | 
			
		||||
	// increment.
 | 
			
		||||
	//
 | 
			
		||||
	// e.g. ["field1Name", "field1Value", "field2Name", "field2Value"]
 | 
			
		||||
	iFieldNameIndex := i * 2
 | 
			
		||||
	jFieldNameIndex := j * 2
 | 
			
		||||
	iFieldValueIndex := iFieldNameIndex + 1
 | 
			
		||||
	jFieldValueIndex := jFieldNameIndex + 1
 | 
			
		||||
 | 
			
		||||
	// swap field names
 | 
			
		||||
	s.Content[iFieldNameIndex], s.Content[jFieldNameIndex] =
 | 
			
		||||
		s.Content[jFieldNameIndex], s.Content[iFieldNameIndex]
 | 
			
		||||
 | 
			
		||||
	// swap field values
 | 
			
		||||
	s.Content[iFieldValueIndex], s.Content[jFieldValueIndex] = s.
 | 
			
		||||
		Content[jFieldValueIndex], s.Content[iFieldValueIndex]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s sortedMapContents) Less(i, j int) bool {
 | 
			
		||||
	iFieldNameIndex := i * 2
 | 
			
		||||
	jFieldNameIndex := j * 2
 | 
			
		||||
	iFieldName := s.Content[iFieldNameIndex].Value
 | 
			
		||||
	jFieldName := s.Content[jFieldNameIndex].Value
 | 
			
		||||
 | 
			
		||||
	// order by their precedence values looked up from the index
 | 
			
		||||
	iOrder, foundI := yaml.FieldOrder[iFieldName]
 | 
			
		||||
	jOrder, foundJ := yaml.FieldOrder[jFieldName]
 | 
			
		||||
	if foundI && foundJ {
 | 
			
		||||
		return iOrder < jOrder
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// known fields come before unknown fields
 | 
			
		||||
	if foundI {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if foundJ {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// neither field is known, sort them lexicographically
 | 
			
		||||
	return iFieldName < jFieldName
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// sortedSeqContents sorts the Contents field of a SequenceNode by the value of
 | 
			
		||||
// the elements sortField.
 | 
			
		||||
// e.g. it will sort spec.template.spec.containers by the value of the container `name` field
 | 
			
		||||
type sortedSeqContents struct {
 | 
			
		||||
	yaml.Node
 | 
			
		||||
	sortField string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s sortedSeqContents) Len() int {
 | 
			
		||||
	return len(s.Content)
 | 
			
		||||
}
 | 
			
		||||
func (s sortedSeqContents) Swap(i, j int) {
 | 
			
		||||
	s.Content[i], s.Content[j] = s.Content[j], s.Content[i]
 | 
			
		||||
}
 | 
			
		||||
func (s sortedSeqContents) Less(i, j int) bool {
 | 
			
		||||
	// primitive lists -- sort by the element's primitive values
 | 
			
		||||
	if s.sortField == "" {
 | 
			
		||||
		iValue := s.Content[i].Value
 | 
			
		||||
		jValue := s.Content[j].Value
 | 
			
		||||
		return iValue < jValue
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// map lists -- sort by the element's sortField values
 | 
			
		||||
	var iValue, jValue string
 | 
			
		||||
	for a := range s.Content[i].Content {
 | 
			
		||||
		if a%2 != 0 {
 | 
			
		||||
			continue // not a fieldNameIndex
 | 
			
		||||
		}
 | 
			
		||||
		// locate the index of the sortField field
 | 
			
		||||
		if s.Content[i].Content[a].Value == s.sortField {
 | 
			
		||||
			// a is the yaml node for the field key, a+1 is the node for the field value
 | 
			
		||||
			iValue = s.Content[i].Content[a+1].Value
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for a := range s.Content[j].Content {
 | 
			
		||||
		if a%2 != 0 {
 | 
			
		||||
			continue // not a fieldNameIndex
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// locate the index of the sortField field
 | 
			
		||||
		if s.Content[j].Content[a].Value == s.sortField {
 | 
			
		||||
			// a is the yaml node for the field key, a+1 is the node for the field value
 | 
			
		||||
			jValue = s.Content[j].Content[a+1].Value
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// compare the field values
 | 
			
		||||
	return iValue < jValue
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										117
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/grep.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										117
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/grep.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,117 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package filters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type GrepType int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	Regexp GrepType = 1 << iota
 | 
			
		||||
	GreaterThanEq
 | 
			
		||||
	GreaterThan
 | 
			
		||||
	LessThan
 | 
			
		||||
	LessThanEq
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GrepFilter filters RNodes with a matching field
 | 
			
		||||
type GrepFilter struct {
 | 
			
		||||
	Path        []string `yaml:"path,omitempty"`
 | 
			
		||||
	Value       string   `yaml:"value,omitempty"`
 | 
			
		||||
	MatchType   GrepType `yaml:"matchType,omitempty"`
 | 
			
		||||
	InvertMatch bool     `yaml:"invertMatch,omitempty"`
 | 
			
		||||
	Compare     func(a, b string) (int, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ kio.Filter = GrepFilter{}
 | 
			
		||||
 | 
			
		||||
func (f GrepFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	// compile the regular expression 1 time if we are matching using regex
 | 
			
		||||
	var reg *regexp.Regexp
 | 
			
		||||
	var err error
 | 
			
		||||
	if f.MatchType == Regexp || f.MatchType == 0 {
 | 
			
		||||
		reg, err = regexp.Compile(f.Value)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var output kio.ResourceNodeSlice
 | 
			
		||||
	for i := range input {
 | 
			
		||||
		node := input[i]
 | 
			
		||||
		val, err := node.Pipe(&yaml.PathMatcher{Path: f.Path})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if val == nil || len(val.Content()) == 0 {
 | 
			
		||||
			if f.InvertMatch {
 | 
			
		||||
				output = append(output, input[i])
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		found := false
 | 
			
		||||
		err = val.VisitElements(func(elem *yaml.RNode) error {
 | 
			
		||||
			// get the value
 | 
			
		||||
			var str string
 | 
			
		||||
			if f.MatchType == Regexp {
 | 
			
		||||
				style := elem.YNode().Style
 | 
			
		||||
				defer func() { elem.YNode().Style = style }()
 | 
			
		||||
				elem.YNode().Style = yaml.FlowStyle
 | 
			
		||||
				str, err = elem.String()
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				str = strings.TrimSpace(strings.ReplaceAll(str, `"`, ""))
 | 
			
		||||
			} else {
 | 
			
		||||
				// if not regexp, then it needs to parse into a quantity and comments will
 | 
			
		||||
				// break that
 | 
			
		||||
				str = elem.YNode().Value
 | 
			
		||||
				if str == "" {
 | 
			
		||||
					return nil
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if f.MatchType == Regexp || f.MatchType == 0 {
 | 
			
		||||
				if reg.MatchString(str) {
 | 
			
		||||
					found = true
 | 
			
		||||
				}
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			comp, err := f.Compare(str, f.Value)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if f.MatchType == GreaterThan && comp > 0 {
 | 
			
		||||
				found = true
 | 
			
		||||
			}
 | 
			
		||||
			if f.MatchType == GreaterThanEq && comp >= 0 {
 | 
			
		||||
				found = true
 | 
			
		||||
			}
 | 
			
		||||
			if f.MatchType == LessThan && comp < 0 {
 | 
			
		||||
				found = true
 | 
			
		||||
			}
 | 
			
		||||
			if f.MatchType == LessThanEq && comp <= 0 {
 | 
			
		||||
				found = true
 | 
			
		||||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if found == f.InvertMatch {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		output = append(output, input[i])
 | 
			
		||||
	}
 | 
			
		||||
	return output, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,38 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package filters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const LocalConfigAnnotation = "config.kubernetes.io/local-config"
 | 
			
		||||
 | 
			
		||||
// IsLocalConfig filters Resources using the config.kubernetes.io/local-config annotation
 | 
			
		||||
type IsLocalConfig struct {
 | 
			
		||||
	// IncludeLocalConfig will include local-config if set to true
 | 
			
		||||
	IncludeLocalConfig bool `yaml:"includeLocalConfig,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// ExcludeNonLocalConfig will exclude non local-config if set to true
 | 
			
		||||
	ExcludeNonLocalConfig bool `yaml:"excludeNonLocalConfig,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Filter implements kio.Filter
 | 
			
		||||
func (c *IsLocalConfig) Filter(inputs []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	var out []*yaml.RNode
 | 
			
		||||
	for i := range inputs {
 | 
			
		||||
		meta, err := inputs[i].GetMeta()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		_, local := meta.Annotations[LocalConfigAnnotation]
 | 
			
		||||
 | 
			
		||||
		if local && c.IncludeLocalConfig {
 | 
			
		||||
			out = append(out, inputs[i])
 | 
			
		||||
		} else if !local && !c.ExcludeNonLocalConfig {
 | 
			
		||||
			out = append(out, inputs[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										86
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										86
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,86 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
// Package merge contains libraries for merging Resources and Patches
 | 
			
		||||
package filters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml/merge2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// MergeFilter merges Resources with the Group/Version/Kind/Namespace/Name together using
 | 
			
		||||
// a 2-way merge strategy.
 | 
			
		||||
//
 | 
			
		||||
// - Fields set to null in the source will be cleared from the destination
 | 
			
		||||
// - Fields with matching keys will be merged recursively
 | 
			
		||||
// - Lists with an associative key (e.g. name) will have their elements merged using the key
 | 
			
		||||
// - List without an associative key will have the dest list replaced by the source list
 | 
			
		||||
type MergeFilter struct {
 | 
			
		||||
	Reverse bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ kio.Filter = MergeFilter{}
 | 
			
		||||
 | 
			
		||||
type mergeKey struct {
 | 
			
		||||
	apiVersion string
 | 
			
		||||
	kind       string
 | 
			
		||||
	namespace  string
 | 
			
		||||
	name       string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MergeFilter implements kio.Filter by merging Resources with the same G/V/K/NS/N
 | 
			
		||||
func (c MergeFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	// invert the merge precedence
 | 
			
		||||
	if c.Reverse {
 | 
			
		||||
		for i, j := 0, len(input)-1; i < j; i, j = i+1, j-1 {
 | 
			
		||||
			input[i], input[j] = input[j], input[i]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// index the Resources by G/V/K/NS/N
 | 
			
		||||
	index := map[mergeKey][]*yaml.RNode{}
 | 
			
		||||
	// retain the original ordering
 | 
			
		||||
	var order []mergeKey
 | 
			
		||||
	for i := range input {
 | 
			
		||||
		meta, err := input[i].GetMeta()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		key := mergeKey{
 | 
			
		||||
			apiVersion: meta.APIVersion,
 | 
			
		||||
			kind:       meta.Kind,
 | 
			
		||||
			namespace:  meta.Namespace,
 | 
			
		||||
			name:       meta.Name,
 | 
			
		||||
		}
 | 
			
		||||
		if _, found := index[key]; !found {
 | 
			
		||||
			order = append(order, key)
 | 
			
		||||
		}
 | 
			
		||||
		index[key] = append(index[key], input[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// merge each of the G/V/K/NS/N lists
 | 
			
		||||
	var output []*yaml.RNode
 | 
			
		||||
	var err error
 | 
			
		||||
	for _, k := range order {
 | 
			
		||||
		var merged *yaml.RNode
 | 
			
		||||
		resources := index[k]
 | 
			
		||||
		for i := range resources {
 | 
			
		||||
			patch := resources[i]
 | 
			
		||||
			if merged == nil {
 | 
			
		||||
				// first resources, don't merge it
 | 
			
		||||
				merged = resources[i]
 | 
			
		||||
			} else {
 | 
			
		||||
				merged, err = merge2.Merge(patch, merged, yaml.MergeOptions{
 | 
			
		||||
					ListIncreaseDirection: yaml.MergeOptionsListPrepend,
 | 
			
		||||
				})
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		output = append(output, merged)
 | 
			
		||||
	}
 | 
			
		||||
	return output, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										317
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										317
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,317 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package filters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml/merge3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	mergeSourceAnnotation = "config.kubernetes.io/merge-source"
 | 
			
		||||
	mergeSourceOriginal   = "original"
 | 
			
		||||
	mergeSourceUpdated    = "updated"
 | 
			
		||||
	mergeSourceDest       = "dest"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ResourceMatcher interface is used to match two resources based on IsSameResource implementation
 | 
			
		||||
// This is the way to group same logical resources in upstream, local and origin for merge
 | 
			
		||||
// The default way to group them is using GVKNN similar to how kubernetes server identifies resources
 | 
			
		||||
// Users of this library might have their own interpretation of grouping similar resources
 | 
			
		||||
// for e.g. if consumer adds a name-prefix to local resource, it should not be treated as new resource
 | 
			
		||||
// for updates etc.
 | 
			
		||||
// Hence, the callers of this library may pass different implementation for IsSameResource
 | 
			
		||||
type ResourceMatcher interface {
 | 
			
		||||
	IsSameResource(node1, node2 *yaml.RNode) bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResourceMergeStrategy is the return type from the Handle function in the
 | 
			
		||||
// ResourceHandler interface. It determines which version of a resource should
 | 
			
		||||
// be included in the output (if any).
 | 
			
		||||
type ResourceMergeStrategy int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Merge means the output to dest should be the 3-way merge of original,
 | 
			
		||||
	// updated and dest.
 | 
			
		||||
	Merge ResourceMergeStrategy = iota
 | 
			
		||||
	// KeepDest means the version of the resource in dest should be the output.
 | 
			
		||||
	KeepDest
 | 
			
		||||
	// KeepUpdated means the version of the resource in updated should be the
 | 
			
		||||
	// output.
 | 
			
		||||
	KeepUpdated
 | 
			
		||||
	// KeepOriginal means the version of the resource in original should be the
 | 
			
		||||
	// output.
 | 
			
		||||
	KeepOriginal
 | 
			
		||||
	// Skip means the resource should not be included in the output.
 | 
			
		||||
	Skip
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ResourceHandler interface is used to determine what should be done for a
 | 
			
		||||
// resource once the versions in original, updated and dest has been
 | 
			
		||||
// identified based on the ResourceMatcher. This allows users to customize
 | 
			
		||||
// what should be the result in dest if a resource has been deleted from
 | 
			
		||||
// upstream.
 | 
			
		||||
type ResourceHandler interface {
 | 
			
		||||
	Handle(original, updated, dest *yaml.RNode) (ResourceMergeStrategy, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Merge3 performs a 3-way merge on the original, updated, and destination packages.
 | 
			
		||||
type Merge3 struct {
 | 
			
		||||
	OriginalPath   string
 | 
			
		||||
	UpdatedPath    string
 | 
			
		||||
	DestPath       string
 | 
			
		||||
	MatchFilesGlob []string
 | 
			
		||||
	Matcher        ResourceMatcher
 | 
			
		||||
	Handler        ResourceHandler
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m Merge3) Merge() error {
 | 
			
		||||
	// Read the destination package.  The ReadWriter will take take of deleting files
 | 
			
		||||
	// for removed resources.
 | 
			
		||||
	var inputs []kio.Reader
 | 
			
		||||
	dest := &kio.LocalPackageReadWriter{
 | 
			
		||||
		PackagePath:    m.DestPath,
 | 
			
		||||
		MatchFilesGlob: m.MatchFilesGlob,
 | 
			
		||||
		SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceDest},
 | 
			
		||||
	}
 | 
			
		||||
	inputs = append(inputs, dest)
 | 
			
		||||
 | 
			
		||||
	// Read the original package
 | 
			
		||||
	inputs = append(inputs, kio.LocalPackageReader{
 | 
			
		||||
		PackagePath:    m.OriginalPath,
 | 
			
		||||
		MatchFilesGlob: m.MatchFilesGlob,
 | 
			
		||||
		SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceOriginal},
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// Read the updated package
 | 
			
		||||
	inputs = append(inputs, kio.LocalPackageReader{
 | 
			
		||||
		PackagePath:    m.UpdatedPath,
 | 
			
		||||
		MatchFilesGlob: m.MatchFilesGlob,
 | 
			
		||||
		SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceUpdated},
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	return kio.Pipeline{
 | 
			
		||||
		Inputs:  inputs,
 | 
			
		||||
		Filters: []kio.Filter{m},
 | 
			
		||||
		Outputs: []kio.Writer{dest},
 | 
			
		||||
	}.Execute()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Filter combines Resources with the same GVK + N + NS into tuples, and then merges them
 | 
			
		||||
func (m Merge3) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	// index the nodes by their identity
 | 
			
		||||
	matcher := m.Matcher
 | 
			
		||||
	if matcher == nil {
 | 
			
		||||
		matcher = &DefaultGVKNNMatcher{MergeOnPath: true}
 | 
			
		||||
	}
 | 
			
		||||
	handler := m.Handler
 | 
			
		||||
	if handler == nil {
 | 
			
		||||
		handler = &DefaultResourceHandler{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tl := tuples{matcher: matcher}
 | 
			
		||||
	for i := range nodes {
 | 
			
		||||
		if err := tl.add(nodes[i]); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// iterate over the inputs, merging as needed
 | 
			
		||||
	var output []*yaml.RNode
 | 
			
		||||
	for i := range tl.list {
 | 
			
		||||
		t := tl.list[i]
 | 
			
		||||
		strategy, err := handler.Handle(t.original, t.updated, t.dest)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		switch strategy {
 | 
			
		||||
		case Merge:
 | 
			
		||||
			node, err := t.merge()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			if node != nil {
 | 
			
		||||
				output = append(output, node)
 | 
			
		||||
			}
 | 
			
		||||
		case KeepDest:
 | 
			
		||||
			output = append(output, t.dest)
 | 
			
		||||
		case KeepUpdated:
 | 
			
		||||
			output = append(output, t.updated)
 | 
			
		||||
		case KeepOriginal:
 | 
			
		||||
			output = append(output, t.original)
 | 
			
		||||
		case Skip:
 | 
			
		||||
			// do nothing
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return output, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tuples combines nodes with the same GVK + N + NS
 | 
			
		||||
type tuples struct {
 | 
			
		||||
	list []*tuple
 | 
			
		||||
 | 
			
		||||
	// matcher matches the resources for merge
 | 
			
		||||
	matcher ResourceMatcher
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DefaultGVKNNMatcher holds the default matching of resources implementation based on
 | 
			
		||||
// Group, Version, Kind, Name and Namespace of the resource
 | 
			
		||||
type DefaultGVKNNMatcher struct {
 | 
			
		||||
	// MergeOnPath will use the relative filepath as part of the merge key.
 | 
			
		||||
	// This may be necessary if the directory contains multiple copies of
 | 
			
		||||
	// the same resource, or resources patches.
 | 
			
		||||
	MergeOnPath bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsSameResource returns true if metadata of node1 and metadata of node2 belongs to same logical resource
 | 
			
		||||
func (dm *DefaultGVKNNMatcher) IsSameResource(node1, node2 *yaml.RNode) bool {
 | 
			
		||||
	if node1 == nil || node2 == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if err := kioutil.CopyLegacyAnnotations(node1); err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if err := kioutil.CopyLegacyAnnotations(node2); err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	meta1, err := node1.GetMeta()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	meta2, err := node2.GetMeta()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if meta1.Name != meta2.Name {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if meta1.Namespace != meta2.Namespace {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if meta1.APIVersion != meta2.APIVersion {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if meta1.Kind != meta2.Kind {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if dm.MergeOnPath {
 | 
			
		||||
		// directories may contain multiple copies of a resource with the same
 | 
			
		||||
		// name, namespace, apiVersion and kind -- e.g. kustomize patches, or
 | 
			
		||||
		// multiple environments
 | 
			
		||||
		// mergeOnPath configures the merge logic to use the path as part of the
 | 
			
		||||
		// resource key
 | 
			
		||||
		if meta1.Annotations[kioutil.PathAnnotation] != meta2.Annotations[kioutil.PathAnnotation] {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// add adds a node to the list, combining it with an existing matching Resource if found
 | 
			
		||||
func (ts *tuples) add(node *yaml.RNode) error {
 | 
			
		||||
	for i := range ts.list {
 | 
			
		||||
		t := ts.list[i]
 | 
			
		||||
		if ts.matcher.IsSameResource(addedNode(t), node) {
 | 
			
		||||
			return t.add(node)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	t := &tuple{}
 | 
			
		||||
	if err := t.add(node); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	ts.list = append(ts.list, t)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// addedNode returns one on the existing added nodes in the tuple
 | 
			
		||||
func addedNode(t *tuple) *yaml.RNode {
 | 
			
		||||
	if t.updated != nil {
 | 
			
		||||
		return t.updated
 | 
			
		||||
	}
 | 
			
		||||
	if t.original != nil {
 | 
			
		||||
		return t.original
 | 
			
		||||
	}
 | 
			
		||||
	return t.dest
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tuple wraps an original, updated, and dest tuple for a given Resource
 | 
			
		||||
type tuple struct {
 | 
			
		||||
	original *yaml.RNode
 | 
			
		||||
	updated  *yaml.RNode
 | 
			
		||||
	dest     *yaml.RNode
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// add sets the corresponding tuple field for the node
 | 
			
		||||
func (t *tuple) add(node *yaml.RNode) error {
 | 
			
		||||
	meta, err := node.GetMeta()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	switch meta.Annotations[mergeSourceAnnotation] {
 | 
			
		||||
	case mergeSourceDest:
 | 
			
		||||
		if t.dest != nil {
 | 
			
		||||
			return duplicateError("local", meta.Annotations[kioutil.PathAnnotation])
 | 
			
		||||
		}
 | 
			
		||||
		t.dest = node
 | 
			
		||||
	case mergeSourceOriginal:
 | 
			
		||||
		if t.original != nil {
 | 
			
		||||
			return duplicateError("original upstream", meta.Annotations[kioutil.PathAnnotation])
 | 
			
		||||
		}
 | 
			
		||||
		t.original = node
 | 
			
		||||
	case mergeSourceUpdated:
 | 
			
		||||
		if t.updated != nil {
 | 
			
		||||
			return duplicateError("updated upstream", meta.Annotations[kioutil.PathAnnotation])
 | 
			
		||||
		}
 | 
			
		||||
		t.updated = node
 | 
			
		||||
	default:
 | 
			
		||||
		return fmt.Errorf("no source annotation for Resource")
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// merge performs a 3-way merge on the tuple
 | 
			
		||||
func (t *tuple) merge() (*yaml.RNode, error) {
 | 
			
		||||
	return merge3.Merge(t.dest, t.original, t.updated)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// duplicateError returns duplicate resources error
 | 
			
		||||
func duplicateError(source, filePath string) error {
 | 
			
		||||
	return fmt.Errorf(`found duplicate %q resources in file %q, please refer to "update" documentation for the fix`, source, filePath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DefaultResourceHandler is the default implementation of the ResourceHandler
 | 
			
		||||
// interface. It uses the following rules:
 | 
			
		||||
// * Keep dest if resource only exists in dest.
 | 
			
		||||
// * Keep updated if resource added in updated.
 | 
			
		||||
// * Delete dest if updated has been deleted.
 | 
			
		||||
// * Don't add the resource back if removed from dest.
 | 
			
		||||
// * Otherwise merge.
 | 
			
		||||
type DefaultResourceHandler struct{}
 | 
			
		||||
 | 
			
		||||
func (*DefaultResourceHandler) Handle(original, updated, dest *yaml.RNode) (ResourceMergeStrategy, error) {
 | 
			
		||||
	switch {
 | 
			
		||||
	case original == nil && updated == nil && dest != nil:
 | 
			
		||||
		// added locally -- keep dest
 | 
			
		||||
		return KeepDest, nil
 | 
			
		||||
	case updated != nil && dest == nil:
 | 
			
		||||
		// added in the update -- add update
 | 
			
		||||
		return KeepUpdated, nil
 | 
			
		||||
	case original != nil && updated == nil:
 | 
			
		||||
		// deleted in the update
 | 
			
		||||
		return Skip, nil
 | 
			
		||||
	case original != nil && dest == nil:
 | 
			
		||||
		// deleted locally
 | 
			
		||||
		return Skip, nil
 | 
			
		||||
	default:
 | 
			
		||||
		// dest and updated are non-nil -- merge them
 | 
			
		||||
		return Merge, nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/modify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/modify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package filters
 | 
			
		||||
							
								
								
									
										32
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/stripcomments.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/stripcomments.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,32 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package filters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type StripCommentsFilter struct{}
 | 
			
		||||
 | 
			
		||||
var _ kio.Filter = StripCommentsFilter{}
 | 
			
		||||
 | 
			
		||||
func (f StripCommentsFilter) Filter(slice []*yaml.RNode) ([]*yaml.RNode, error) {
 | 
			
		||||
	for i := range slice {
 | 
			
		||||
		stripComments(slice[i].YNode())
 | 
			
		||||
	}
 | 
			
		||||
	return slice, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func stripComments(node *yaml.Node) {
 | 
			
		||||
	if node == nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	node.HeadComment = ""
 | 
			
		||||
	node.LineComment = ""
 | 
			
		||||
	node.FootComment = ""
 | 
			
		||||
	for i := range node.Content {
 | 
			
		||||
		stripComments(node.Content[i])
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/ignorefilesmatcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/kio/ignorefilesmatcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -86,7 +86,7 @@ func (i *ignoreFilesMatcher) matchFile(path string) bool {
 | 
			
		||||
	return i.matchers[len(i.matchers)-1].matcher.Match(path, false)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// matchFile checks whether the directory given by the provided path matches
 | 
			
		||||
// matchDir checks whether the directory given by the provided path matches
 | 
			
		||||
// any of the patterns in the .krmignore file for the package.
 | 
			
		||||
func (i *ignoreFilesMatcher) matchDir(path string) bool {
 | 
			
		||||
	if len(i.matchers) == 0 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -64,7 +64,7 @@ func (fi bindataFileInfo) Mode() os.FileMode {
 | 
			
		||||
	return fi.mode
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Mode return file modify time
 | 
			
		||||
// ModTime return file modify time
 | 
			
		||||
func (fi bindataFileInfo) ModTime() time.Time {
 | 
			
		||||
	return fi.modTime
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -182,7 +182,7 @@ type ResourceSchema struct {
 | 
			
		||||
	Schema *spec.Schema
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsEmpty returns true if the ResourceSchema is empty
 | 
			
		||||
// IsMissingOrNull returns true if the ResourceSchema is missing or null
 | 
			
		||||
func (rs *ResourceSchema) IsMissingOrNull() bool {
 | 
			
		||||
	if rs == nil || rs.Schema == nil {
 | 
			
		||||
		return true
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,7 +19,6 @@ import (
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/fn/runtime/container"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/fn/runtime/exec"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
@@ -61,9 +60,6 @@ type RunFns struct {
 | 
			
		||||
	// and only use explicit sources
 | 
			
		||||
	NoFunctionsFromInput *bool
 | 
			
		||||
 | 
			
		||||
	// EnableStarlark will enable functions run as starlark scripts
 | 
			
		||||
	EnableStarlark bool
 | 
			
		||||
 | 
			
		||||
	// EnableExec will enable exec functions
 | 
			
		||||
	EnableExec bool
 | 
			
		||||
 | 
			
		||||
@@ -209,8 +205,6 @@ func (r RunFns) runFunctions(
 | 
			
		||||
				identifier = filter.Image
 | 
			
		||||
			case *exec.Filter:
 | 
			
		||||
				identifier = filter.Path
 | 
			
		||||
			case *starlark.Filter:
 | 
			
		||||
				identifier = filter.String()
 | 
			
		||||
			default:
 | 
			
		||||
				identifier = "unknown-type function"
 | 
			
		||||
			}
 | 
			
		||||
@@ -496,41 +490,6 @@ func (r *RunFns) ffp(spec runtimeutil.FunctionSpec, api *yaml.RNode, currentUser
 | 
			
		||||
		cf.Exec.DeferFailure = spec.DeferFailure
 | 
			
		||||
		return cf, nil
 | 
			
		||||
	}
 | 
			
		||||
	if r.EnableStarlark && (spec.Starlark.Path != "" || spec.Starlark.URL != "") {
 | 
			
		||||
		// the script path is relative to the function config file
 | 
			
		||||
		m, err := api.GetMeta()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.Wrap(err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var p string
 | 
			
		||||
		if spec.Starlark.Path != "" {
 | 
			
		||||
			pathAnno := m.Annotations[kioutil.PathAnnotation]
 | 
			
		||||
			if pathAnno == "" {
 | 
			
		||||
				pathAnno = m.Annotations[kioutil.LegacyPathAnnotation]
 | 
			
		||||
			}
 | 
			
		||||
			p = filepath.ToSlash(path.Clean(pathAnno))
 | 
			
		||||
 | 
			
		||||
			spec.Starlark.Path = filepath.ToSlash(path.Clean(spec.Starlark.Path))
 | 
			
		||||
			if filepath.IsAbs(spec.Starlark.Path) || path.IsAbs(spec.Starlark.Path) {
 | 
			
		||||
				return nil, errors.Errorf(
 | 
			
		||||
					"absolute function path %s not allowed", spec.Starlark.Path)
 | 
			
		||||
			}
 | 
			
		||||
			if strings.HasPrefix(spec.Starlark.Path, "..") {
 | 
			
		||||
				return nil, errors.Errorf(
 | 
			
		||||
					"function path %s not allowed to start with ../", spec.Starlark.Path)
 | 
			
		||||
			}
 | 
			
		||||
			p = filepath.ToSlash(filepath.Join(r.Path, filepath.Dir(p), spec.Starlark.Path))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		sf := &starlark.Filter{Name: spec.Starlark.Name, Path: p, URL: spec.Starlark.URL}
 | 
			
		||||
 | 
			
		||||
		sf.FunctionConfig = api
 | 
			
		||||
		sf.GlobalScope = r.GlobalScope
 | 
			
		||||
		sf.ResultsFile = resultsFile
 | 
			
		||||
		sf.DeferFailure = spec.DeferFailure
 | 
			
		||||
		return sf, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if r.EnableExec && spec.Exec.Path != "" {
 | 
			
		||||
		ef := &exec.Filter{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,7 +20,7 @@ const (
 | 
			
		||||
	BareSeqNodeWrappingKey = "bareSeqNodeWrappingKey"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// SeqIndentType holds the indentation style for sequence nodes
 | 
			
		||||
// SequenceIndentStyle holds the indentation style for sequence nodes
 | 
			
		||||
type SequenceIndentStyle string
 | 
			
		||||
 | 
			
		||||
// EncoderOptions are options that can be used to configure the encoder,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/merge3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/merge3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,45 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
// Package merge contains libraries for merging fields from one RNode to another
 | 
			
		||||
// RNode
 | 
			
		||||
package merge3
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml/walk"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Merge(dest, original, update *yaml.RNode) (*yaml.RNode, error) {
 | 
			
		||||
	// if update == nil && original != nil => declarative deletion
 | 
			
		||||
 | 
			
		||||
	return walk.Walker{
 | 
			
		||||
		Visitor:            Visitor{},
 | 
			
		||||
		VisitKeysAsScalars: true,
 | 
			
		||||
		Sources:            []*yaml.RNode{dest, original, update}}.Walk()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func MergeStrings(dest, original, update string, infer bool) (string, error) {
 | 
			
		||||
	srcOriginal, err := yaml.Parse(original)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	srcUpdated, err := yaml.Parse(update)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	d, err := yaml.Parse(dest)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := walk.Walker{
 | 
			
		||||
		InferAssociativeLists: infer,
 | 
			
		||||
		Visitor:               Visitor{},
 | 
			
		||||
		VisitKeysAsScalars:    true,
 | 
			
		||||
		Sources:               []*yaml.RNode{d, srcOriginal, srcUpdated}}.Walk()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	return result.String()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										172
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/visitor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										172
									
								
								vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/visitor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,172 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package merge3
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/openapi"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml"
 | 
			
		||||
	"sigs.k8s.io/kustomize/kyaml/yaml/walk"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ConflictStrategy uint
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// TODO: Support more strategies
 | 
			
		||||
	TakeUpdate ConflictStrategy = 1 + iota
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Visitor struct{}
 | 
			
		||||
 | 
			
		||||
func (m Visitor) VisitMap(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.RNode, error) {
 | 
			
		||||
	if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() {
 | 
			
		||||
		// explicitly cleared from either dest or update
 | 
			
		||||
		return walk.ClearNode, nil
 | 
			
		||||
	}
 | 
			
		||||
	if nodes.Dest() == nil && nodes.Updated() == nil {
 | 
			
		||||
		// implicitly cleared missing from both dest and update
 | 
			
		||||
		return walk.ClearNode, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if nodes.Dest() == nil {
 | 
			
		||||
		// not cleared, but missing from the dest
 | 
			
		||||
		// initialize a new value that can be recursively merged
 | 
			
		||||
		return yaml.NewRNode(&yaml.Node{Kind: yaml.MappingNode}), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// recursively merge the dest with the original and updated
 | 
			
		||||
	return nodes.Dest(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m Visitor) visitAList(nodes walk.Sources, _ *openapi.ResourceSchema) (*yaml.RNode, error) {
 | 
			
		||||
	if yaml.IsMissingOrNull(nodes.Updated()) && !yaml.IsMissingOrNull(nodes.Origin()) {
 | 
			
		||||
		// implicitly cleared from update -- element was deleted
 | 
			
		||||
		return walk.ClearNode, nil
 | 
			
		||||
	}
 | 
			
		||||
	if yaml.IsMissingOrNull(nodes.Dest()) {
 | 
			
		||||
		// not cleared, but missing from the dest
 | 
			
		||||
		// initialize a new value that can be recursively merged
 | 
			
		||||
		return yaml.NewRNode(&yaml.Node{Kind: yaml.SequenceNode}), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// recursively merge the dest with the original and updated
 | 
			
		||||
	return nodes.Dest(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m Visitor) VisitScalar(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.RNode, error) {
 | 
			
		||||
	if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() {
 | 
			
		||||
		// explicitly cleared from either dest or update
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	if yaml.IsMissingOrNull(nodes.Updated()) != yaml.IsMissingOrNull(nodes.Origin()) {
 | 
			
		||||
		// value added or removed in update
 | 
			
		||||
		return nodes.Updated(), nil
 | 
			
		||||
	}
 | 
			
		||||
	if yaml.IsMissingOrNull(nodes.Updated()) && yaml.IsMissingOrNull(nodes.Origin()) {
 | 
			
		||||
		// value added or removed in update
 | 
			
		||||
		return nodes.Dest(), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	values, err := m.getStrValues(nodes)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (values.Dest == "" || values.Dest == values.Origin) && values.Origin != values.Update {
 | 
			
		||||
		// if local is nil or is unchanged but there is new update
 | 
			
		||||
		return nodes.Updated(), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if nodes.Updated().YNode().Value != nodes.Origin().YNode().Value {
 | 
			
		||||
		// value changed in update
 | 
			
		||||
		return nodes.Updated(), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// unchanged between origin and update, keep the dest
 | 
			
		||||
	return nodes.Dest(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m Visitor) visitNAList(nodes walk.Sources) (*yaml.RNode, error) {
 | 
			
		||||
	if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() {
 | 
			
		||||
		// explicitly cleared from either dest or update
 | 
			
		||||
		return walk.ClearNode, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if yaml.IsMissingOrNull(nodes.Updated()) != yaml.IsMissingOrNull(nodes.Origin()) {
 | 
			
		||||
		// value added or removed in update
 | 
			
		||||
		return nodes.Updated(), nil
 | 
			
		||||
	}
 | 
			
		||||
	if yaml.IsMissingOrNull(nodes.Updated()) && yaml.IsMissingOrNull(nodes.Origin()) {
 | 
			
		||||
		// value not present in source or dest
 | 
			
		||||
		return nodes.Dest(), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// compare origin and update values to see if they have changed
 | 
			
		||||
	values, err := m.getStrValues(nodes)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if values.Update != values.Origin {
 | 
			
		||||
		// value changed in update
 | 
			
		||||
		return nodes.Updated(), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// unchanged between origin and update, keep the dest
 | 
			
		||||
	return nodes.Dest(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m Visitor) VisitList(nodes walk.Sources, s *openapi.ResourceSchema, kind walk.ListKind) (*yaml.RNode, error) {
 | 
			
		||||
	if kind == walk.AssociativeList {
 | 
			
		||||
		return m.visitAList(nodes, s)
 | 
			
		||||
	}
 | 
			
		||||
	// non-associative list
 | 
			
		||||
	return m.visitNAList(nodes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m Visitor) getStrValues(nodes walk.Sources) (strValues, error) {
 | 
			
		||||
	var uStr, oStr, dStr string
 | 
			
		||||
	var err error
 | 
			
		||||
	if nodes.Updated() != nil && nodes.Updated().YNode() != nil {
 | 
			
		||||
		s := nodes.Updated().YNode().Style
 | 
			
		||||
		defer func() {
 | 
			
		||||
			nodes.Updated().YNode().Style = s
 | 
			
		||||
		}()
 | 
			
		||||
		nodes.Updated().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle
 | 
			
		||||
		uStr, err = nodes.Updated().String()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return strValues{}, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if nodes.Origin() != nil && nodes.Origin().YNode() != nil {
 | 
			
		||||
		s := nodes.Origin().YNode().Style
 | 
			
		||||
		defer func() {
 | 
			
		||||
			nodes.Origin().YNode().Style = s
 | 
			
		||||
		}()
 | 
			
		||||
		nodes.Origin().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle
 | 
			
		||||
		oStr, err = nodes.Origin().String()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return strValues{}, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if nodes.Dest() != nil && nodes.Dest().YNode() != nil {
 | 
			
		||||
		s := nodes.Dest().YNode().Style
 | 
			
		||||
		defer func() {
 | 
			
		||||
			nodes.Dest().YNode().Style = s
 | 
			
		||||
		}()
 | 
			
		||||
		nodes.Dest().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle
 | 
			
		||||
		dStr, err = nodes.Dest().String()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return strValues{}, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return strValues{Origin: oStr, Update: uStr, Dest: dStr}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type strValues struct {
 | 
			
		||||
	Origin string
 | 
			
		||||
	Update string
 | 
			
		||||
	Dest   string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ walk.Visitor = Visitor{}
 | 
			
		||||
		Reference in New Issue
	
	Block a user