vendor c/common@main
Required for using the newly added pod exit policies. Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
This commit is contained in:
		
							parent
							
								
									80315b9c86
								
							
						
					
					
						commit
						77d872ea38
					
				
							
								
								
									
										2
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										2
									
								
								go.mod
								
								
								
								
							|  | @ -12,7 +12,7 @@ require ( | |||
| 	github.com/containernetworking/cni v1.1.0 | ||||
| 	github.com/containernetworking/plugins v1.1.1 | ||||
| 	github.com/containers/buildah v1.25.2-0.20220423102655-8f2bb8876f3f | ||||
| 	github.com/containers/common v0.47.5-0.20220425182415-4081e6be9356 | ||||
| 	github.com/containers/common v0.47.5-0.20220429111201-21d83cf7c533 | ||||
| 	github.com/containers/conmon v2.0.20+incompatible | ||||
| 	github.com/containers/image/v5 v5.21.1-0.20220425080628-be085685e524 | ||||
| 	github.com/containers/ocicrypt v1.1.3 | ||||
|  |  | |||
							
								
								
									
										20
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										20
									
								
								go.sum
								
								
								
								
							|  | @ -287,8 +287,9 @@ github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0 | |||
| github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= | ||||
| github.com/containerd/containerd v1.5.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= | ||||
| github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= | ||||
| github.com/containerd/containerd v1.6.2 h1:pcaPUGbYW8kBw6OgIZwIVIeEhdWVrBzsoCfVJ5BjrLU= | ||||
| github.com/containerd/containerd v1.6.2/go.mod h1:sidY30/InSE1j2vdD1ihtKoJz+lWdaXMdiAeIupaf+s= | ||||
| github.com/containerd/containerd v1.6.3 h1:JfgUEIAH07xDWk6kqz0P3ArZt+KJ9YeihSC9uyFtSKg= | ||||
| github.com/containerd/containerd v1.6.3/go.mod h1:gCVGrYRYFm2E8GmuUIbj/NGD7DLZQLzSJQazjVKDOig= | ||||
| github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= | ||||
| github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= | ||||
| github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= | ||||
|  | @ -308,6 +309,7 @@ github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZH | |||
| github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= | ||||
| github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= | ||||
| github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= | ||||
| github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= | ||||
| github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= | ||||
| github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= | ||||
| github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= | ||||
|  | @ -318,6 +320,7 @@ github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6T | |||
| github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= | ||||
| github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= | ||||
| github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= | ||||
| github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= | ||||
| github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= | ||||
| github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= | ||||
| github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= | ||||
|  | @ -358,8 +361,8 @@ github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19 | |||
| github.com/containers/buildah v1.25.2-0.20220423102655-8f2bb8876f3f h1:a5Zjz9EXUDOelPdJKJiXBfDzQS1ynXL3rc16O93tcXo= | ||||
| github.com/containers/buildah v1.25.2-0.20220423102655-8f2bb8876f3f/go.mod h1:fHTZF4uEZGIlR8oM0fhNvU0wYQOtDpuar8/PxTtdvR0= | ||||
| github.com/containers/common v0.47.5-0.20220421111103-112a47964ddb/go.mod h1:r80nWTmJrG9EoLkuI6WfbWQDUNQVqkVuB8Oaj1VVjOA= | ||||
| github.com/containers/common v0.47.5-0.20220425182415-4081e6be9356 h1:eJ1ghvyswTLRywF4YYEWrzZyOFEzlD1FUPLzJSz+wKo= | ||||
| github.com/containers/common v0.47.5-0.20220425182415-4081e6be9356/go.mod h1:r80nWTmJrG9EoLkuI6WfbWQDUNQVqkVuB8Oaj1VVjOA= | ||||
| github.com/containers/common v0.47.5-0.20220429111201-21d83cf7c533 h1:ppbtd7X6Itf6Mq1vQ5WPLpYNmXE3W34/8O7v4NwBXs4= | ||||
| github.com/containers/common v0.47.5-0.20220429111201-21d83cf7c533/go.mod h1:qhkfBkVP+96bHzTE3j0TYJC7OSqpJLxbXnVWPa5XJnc= | ||||
| github.com/containers/conmon v2.0.20+incompatible h1:YbCVSFSCqFjjVwHTPINGdMX1F6JXHGTUje2ZYobNrkg= | ||||
| github.com/containers/conmon v2.0.20+incompatible/go.mod h1:hgwZ2mtuDrppv78a/cOBNiCm6O0UMWGx1mu7P00nu5I= | ||||
| github.com/containers/image/v5 v5.19.2-0.20220224100137-1045fb70b094/go.mod h1:XoYK6kE0dpazFNcuS+a8lra+QfbC6s8tzv+cUuCrZpE= | ||||
|  | @ -1068,8 +1071,9 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k | |||
| github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= | ||||
| github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= | ||||
| github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= | ||||
| github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= | ||||
| github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= | ||||
| github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= | ||||
| github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= | ||||
| github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= | ||||
| github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= | ||||
| github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||
|  | @ -1093,6 +1097,7 @@ github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM | |||
| github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= | ||||
| github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= | ||||
| github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= | ||||
| github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= | ||||
| github.com/opencontainers/image-spec v1.0.3-0.20211202193544-a5463b7f9c84/go.mod h1:Qnt1q4cjDNQI9bT832ziho5Iw2BhK8o1KwLOwW56VP4= | ||||
| github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= | ||||
| github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= | ||||
|  | @ -1413,6 +1418,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de | |||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||
| github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||
| github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||
| github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= | ||||
| github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= | ||||
| github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= | ||||
|  | @ -1546,6 +1552,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |||
| golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= | ||||
| golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= | ||||
| 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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
|  | @ -1613,6 +1620,7 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx | |||
| golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
|  | @ -1775,6 +1783,7 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc | |||
| golang.org/x/sys v0.0.0-20211001092434-39dca1131b70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
|  | @ -1920,8 +1929,9 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | |||
| golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= | ||||
| golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= | ||||
| golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= | ||||
| golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= | ||||
| golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| 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= | ||||
|  |  | |||
|  | @ -349,6 +349,9 @@ type EngineConfig struct { | |||
| 	// OCIRuntimes are the set of configured OCI runtimes (default is runc).
 | ||||
| 	OCIRuntimes map[string][]string `toml:"runtimes,omitempty"` | ||||
| 
 | ||||
| 	// PodExitPolicy determines the behaviour when the last container of a pod exits.
 | ||||
| 	PodExitPolicy PodExitPolicy `toml:"pod_exit_policy,omitempty"` | ||||
| 
 | ||||
| 	// PullPolicy determines whether to pull image before creating or running a container
 | ||||
| 	// default is "missing"
 | ||||
| 	PullPolicy string `toml:"pull_policy,omitempty"` | ||||
|  |  | |||
|  | @ -506,6 +506,9 @@ default_sysctls = [ | |||
| # | ||||
| #num_locks = 2048 | ||||
| 
 | ||||
| # Set the exit policy of the pod when the last container exits. | ||||
| #pod_exit_policy = "continue" | ||||
| 
 | ||||
| # Whether to pull new image before running a container | ||||
| # | ||||
| #pull_policy = "missing" | ||||
|  |  | |||
|  | @ -388,6 +388,8 @@ func defaultConfigFromMemory() (*EngineConfig, error) { | |||
| 	c.MachineEnabled = false | ||||
| 	c.ChownCopiedFiles = true | ||||
| 
 | ||||
| 	c.PodExitPolicy = defaultPodExitPolicy | ||||
| 
 | ||||
| 	return c, nil | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,36 @@ | |||
| package config | ||||
| 
 | ||||
| import "fmt" | ||||
| 
 | ||||
| // PodExitPolicies includes the supported pod exit policies.
 | ||||
| var PodExitPolicies = []string{string(PodExitPolicyContinue), string(PodExitPolicyStop)} | ||||
| 
 | ||||
| // PodExitPolicy determines a pod's exit and stop behaviour.
 | ||||
| type PodExitPolicy string | ||||
| 
 | ||||
| const ( | ||||
| 	// PodExitPolicyContinue instructs the pod to continue running when the
 | ||||
| 	// last container has exited.
 | ||||
| 	PodExitPolicyContinue PodExitPolicy = "continue" | ||||
| 	// PodExitPolicyStop instructs the pod to stop when the last container
 | ||||
| 	// has exited.
 | ||||
| 	PodExitPolicyStop = "stop" | ||||
| 	// PodExitPolicyUnsupported implies an internal error.
 | ||||
| 	// Negative for backwards compat.
 | ||||
| 	PodExitPolicyUnsupported = "invalid" | ||||
| 
 | ||||
| 	defaultPodExitPolicy = PodExitPolicyContinue | ||||
| ) | ||||
| 
 | ||||
| // ParsePodExitPolicy parses the specified policy and returns an error if it is
 | ||||
| // invalid.
 | ||||
| func ParsePodExitPolicy(policy string) (PodExitPolicy, error) { | ||||
| 	switch policy { | ||||
| 	case "", string(PodExitPolicyContinue): | ||||
| 		return PodExitPolicyContinue, nil | ||||
| 	case string(PodExitPolicyStop): | ||||
| 		return PodExitPolicyStop, nil | ||||
| 	default: | ||||
| 		return PodExitPolicyUnsupported, fmt.Errorf("invalid pod exit policy: %q", policy) | ||||
| 	} | ||||
| } | ||||
|  | @ -9,7 +9,11 @@ package inspector | |||
| // The initial map-based implementation was too slow;
 | ||||
| // see https://go-review.googlesource.com/c/tools/+/135655/1/go/ast/inspector/inspector.go#196
 | ||||
| 
 | ||||
| import "go/ast" | ||||
| import ( | ||||
| 	"go/ast" | ||||
| 
 | ||||
| 	"golang.org/x/tools/internal/typeparams" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	nArrayType = iota | ||||
|  | @ -47,6 +51,7 @@ const ( | |||
| 	nImportSpec | ||||
| 	nIncDecStmt | ||||
| 	nIndexExpr | ||||
| 	nIndexListExpr | ||||
| 	nInterfaceType | ||||
| 	nKeyValueExpr | ||||
| 	nLabeledStmt | ||||
|  | @ -164,6 +169,8 @@ func typeOf(n ast.Node) uint64 { | |||
| 		return 1 << nIncDecStmt | ||||
| 	case *ast.IndexExpr: | ||||
| 		return 1 << nIndexExpr | ||||
| 	case *typeparams.IndexListExpr: | ||||
| 		return 1 << nIndexListExpr | ||||
| 	case *ast.InterfaceType: | ||||
| 		return 1 << nInterfaceType | ||||
| 	case *ast.KeyValueExpr: | ||||
|  |  | |||
|  | @ -0,0 +1,180 @@ | |||
| // Copyright 2021 The Go 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 typeparams contains common utilities for writing tools that interact
 | ||||
| // with generic Go code, as introduced with Go 1.18.
 | ||||
| //
 | ||||
| // Many of the types and functions in this package are proxies for the new APIs
 | ||||
| // introduced in the standard library with Go 1.18. For example, the
 | ||||
| // typeparams.Union type is an alias for go/types.Union, and the ForTypeSpec
 | ||||
| // function returns the value of the go/ast.TypeSpec.TypeParams field. At Go
 | ||||
| // versions older than 1.18 these helpers are implemented as stubs, allowing
 | ||||
| // users of this package to write code that handles generic constructs inline,
 | ||||
| // even if the Go version being used to compile does not support generics.
 | ||||
| //
 | ||||
| // Additionally, this package contains common utilities for working with the
 | ||||
| // new generic constructs, to supplement the standard library APIs. Notably,
 | ||||
| // the StructuralTerms API computes a minimal representation of the structural
 | ||||
| // restrictions on a type parameter. In the future, this API may be available
 | ||||
| // from go/types.
 | ||||
| //
 | ||||
| // See the example/README.md for a more detailed guide on how to update tools
 | ||||
| // to support generics.
 | ||||
| package typeparams | ||||
| 
 | ||||
| import ( | ||||
| 	"go/ast" | ||||
| 	"go/token" | ||||
| 	"go/types" | ||||
| ) | ||||
| 
 | ||||
| // UnpackIndexExpr extracts data from AST nodes that represent index
 | ||||
| // expressions.
 | ||||
| //
 | ||||
| // For an ast.IndexExpr, the resulting indices slice will contain exactly one
 | ||||
| // index expression. For an ast.IndexListExpr (go1.18+), it may have a variable
 | ||||
| // number of index expressions.
 | ||||
| //
 | ||||
| // For nodes that don't represent index expressions, the first return value of
 | ||||
| // UnpackIndexExpr will be nil.
 | ||||
| func UnpackIndexExpr(n ast.Node) (x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) { | ||||
| 	switch e := n.(type) { | ||||
| 	case *ast.IndexExpr: | ||||
| 		return e.X, e.Lbrack, []ast.Expr{e.Index}, e.Rbrack | ||||
| 	case *IndexListExpr: | ||||
| 		return e.X, e.Lbrack, e.Indices, e.Rbrack | ||||
| 	} | ||||
| 	return nil, token.NoPos, nil, token.NoPos | ||||
| } | ||||
| 
 | ||||
| // PackIndexExpr returns an *ast.IndexExpr or *ast.IndexListExpr, depending on
 | ||||
| // the cardinality of indices. Calling PackIndexExpr with len(indices) == 0
 | ||||
| // will panic.
 | ||||
| func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) ast.Expr { | ||||
| 	switch len(indices) { | ||||
| 	case 0: | ||||
| 		panic("empty indices") | ||||
| 	case 1: | ||||
| 		return &ast.IndexExpr{ | ||||
| 			X:      x, | ||||
| 			Lbrack: lbrack, | ||||
| 			Index:  indices[0], | ||||
| 			Rbrack: rbrack, | ||||
| 		} | ||||
| 	default: | ||||
| 		return &IndexListExpr{ | ||||
| 			X:       x, | ||||
| 			Lbrack:  lbrack, | ||||
| 			Indices: indices, | ||||
| 			Rbrack:  rbrack, | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // IsTypeParam reports whether t is a type parameter.
 | ||||
| func IsTypeParam(t types.Type) bool { | ||||
| 	_, ok := t.(*TypeParam) | ||||
| 	return ok | ||||
| } | ||||
| 
 | ||||
| // OriginMethod returns the origin method associated with the method fn.
 | ||||
| // For methods on a non-generic receiver base type, this is just
 | ||||
| // fn. However, for methods with a generic receiver, OriginMethod returns the
 | ||||
| // corresponding method in the method set of the origin type.
 | ||||
| //
 | ||||
| // As a special case, if fn is not a method (has no receiver), OriginMethod
 | ||||
| // returns fn.
 | ||||
| func OriginMethod(fn *types.Func) *types.Func { | ||||
| 	recv := fn.Type().(*types.Signature).Recv() | ||||
| 	if recv == nil { | ||||
| 
 | ||||
| 		return fn | ||||
| 	} | ||||
| 	base := recv.Type() | ||||
| 	p, isPtr := base.(*types.Pointer) | ||||
| 	if isPtr { | ||||
| 		base = p.Elem() | ||||
| 	} | ||||
| 	named, isNamed := base.(*types.Named) | ||||
| 	if !isNamed { | ||||
| 		// Receiver is a *types.Interface.
 | ||||
| 		return fn | ||||
| 	} | ||||
| 	if ForNamed(named).Len() == 0 { | ||||
| 		// Receiver base has no type parameters, so we can avoid the lookup below.
 | ||||
| 		return fn | ||||
| 	} | ||||
| 	orig := NamedTypeOrigin(named) | ||||
| 	gfn, _, _ := types.LookupFieldOrMethod(orig, true, fn.Pkg(), fn.Name()) | ||||
| 	return gfn.(*types.Func) | ||||
| } | ||||
| 
 | ||||
| // GenericAssignableTo is a generalization of types.AssignableTo that
 | ||||
| // implements the following rule for uninstantiated generic types:
 | ||||
| //
 | ||||
| // If V and T are generic named types, then V is considered assignable to T if,
 | ||||
| // for every possible instantation of V[A_1, ..., A_N], the instantiation
 | ||||
| // T[A_1, ..., A_N] is valid and V[A_1, ..., A_N] implements T[A_1, ..., A_N].
 | ||||
| //
 | ||||
| // If T has structural constraints, they must be satisfied by V.
 | ||||
| //
 | ||||
| // For example, consider the following type declarations:
 | ||||
| //
 | ||||
| //  type Interface[T any] interface {
 | ||||
| //  	Accept(T)
 | ||||
| //  }
 | ||||
| //
 | ||||
| //  type Container[T any] struct {
 | ||||
| //  	Element T
 | ||||
| //  }
 | ||||
| //
 | ||||
| //  func (c Container[T]) Accept(t T) { c.Element = t }
 | ||||
| //
 | ||||
| // In this case, GenericAssignableTo reports that instantiations of Container
 | ||||
| // are assignable to the corresponding instantiation of Interface.
 | ||||
| func GenericAssignableTo(ctxt *Context, V, T types.Type) bool { | ||||
| 	// If V and T are not both named, or do not have matching non-empty type
 | ||||
| 	// parameter lists, fall back on types.AssignableTo.
 | ||||
| 
 | ||||
| 	VN, Vnamed := V.(*types.Named) | ||||
| 	TN, Tnamed := T.(*types.Named) | ||||
| 	if !Vnamed || !Tnamed { | ||||
| 		return types.AssignableTo(V, T) | ||||
| 	} | ||||
| 
 | ||||
| 	vtparams := ForNamed(VN) | ||||
| 	ttparams := ForNamed(TN) | ||||
| 	if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || NamedTypeArgs(VN).Len() != 0 || NamedTypeArgs(TN).Len() != 0 { | ||||
| 		return types.AssignableTo(V, T) | ||||
| 	} | ||||
| 
 | ||||
| 	// V and T have the same (non-zero) number of type params. Instantiate both
 | ||||
| 	// with the type parameters of V. This must always succeed for V, and will
 | ||||
| 	// succeed for T if and only if the type set of each type parameter of V is a
 | ||||
| 	// subset of the type set of the corresponding type parameter of T, meaning
 | ||||
| 	// that every instantiation of V corresponds to a valid instantiation of T.
 | ||||
| 
 | ||||
| 	// Minor optimization: ensure we share a context across the two
 | ||||
| 	// instantiations below.
 | ||||
| 	if ctxt == nil { | ||||
| 		ctxt = NewContext() | ||||
| 	} | ||||
| 
 | ||||
| 	var targs []types.Type | ||||
| 	for i := 0; i < vtparams.Len(); i++ { | ||||
| 		targs = append(targs, vtparams.At(i)) | ||||
| 	} | ||||
| 
 | ||||
| 	vinst, err := Instantiate(ctxt, V, targs, true) | ||||
| 	if err != nil { | ||||
| 		panic("type parameters should satisfy their own constraints") | ||||
| 	} | ||||
| 
 | ||||
| 	tinst, err := Instantiate(ctxt, T, targs, true) | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
| 	return types.AssignableTo(vinst, tinst) | ||||
| } | ||||
|  | @ -0,0 +1,12 @@ | |||
| // Copyright 2021 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build !go1.18
 | ||||
| // +build !go1.18
 | ||||
| 
 | ||||
| package typeparams | ||||
| 
 | ||||
| // Enabled reports whether type parameters are enabled in the current build
 | ||||
| // environment.
 | ||||
| const Enabled = false | ||||
|  | @ -0,0 +1,15 @@ | |||
| // Copyright 2021 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build go1.18
 | ||||
| // +build go1.18
 | ||||
| 
 | ||||
| package typeparams | ||||
| 
 | ||||
| // Note: this constant is in a separate file as this is the only acceptable
 | ||||
| // diff between the <1.18 API of this package and the 1.18 API.
 | ||||
| 
 | ||||
| // Enabled reports whether type parameters are enabled in the current build
 | ||||
| // environment.
 | ||||
| const Enabled = true | ||||
|  | @ -0,0 +1,216 @@ | |||
| // Copyright 2021 The Go 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 typeparams | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"go/types" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| //go:generate go run copytermlist.go
 | ||||
| 
 | ||||
| const debug = false | ||||
| 
 | ||||
| var ErrEmptyTypeSet = errors.New("empty type set") | ||||
| 
 | ||||
| // StructuralTerms returns a slice of terms representing the normalized
 | ||||
| // structural type restrictions of a type parameter, if any.
 | ||||
| //
 | ||||
| // Structural type restrictions of a type parameter are created via
 | ||||
| // non-interface types embedded in its constraint interface (directly, or via a
 | ||||
| // chain of interface embeddings). For example, in the declaration
 | ||||
| //  type T[P interface{~int; m()}] int
 | ||||
| // the structural restriction of the type parameter P is ~int.
 | ||||
| //
 | ||||
| // With interface embedding and unions, the specification of structural type
 | ||||
| // restrictions may be arbitrarily complex. For example, consider the
 | ||||
| // following:
 | ||||
| //
 | ||||
| //  type A interface{ ~string|~[]byte }
 | ||||
| //
 | ||||
| //  type B interface{ int|string }
 | ||||
| //
 | ||||
| //  type C interface { ~string|~int }
 | ||||
| //
 | ||||
| //  type T[P interface{ A|B; C }] int
 | ||||
| //
 | ||||
| // In this example, the structural type restriction of P is ~string|int: A|B
 | ||||
| // expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int,
 | ||||
| // which when intersected with C (~string|~int) yields ~string|int.
 | ||||
| //
 | ||||
| // StructuralTerms computes these expansions and reductions, producing a
 | ||||
| // "normalized" form of the embeddings. A structural restriction is normalized
 | ||||
| // if it is a single union containing no interface terms, and is minimal in the
 | ||||
| // sense that removing any term changes the set of types satisfying the
 | ||||
| // constraint. It is left as a proof for the reader that, modulo sorting, there
 | ||||
| // is exactly one such normalized form.
 | ||||
| //
 | ||||
| // Because the minimal representation always takes this form, StructuralTerms
 | ||||
| // returns a slice of tilde terms corresponding to the terms of the union in
 | ||||
| // the normalized structural restriction. An error is returned if the
 | ||||
| // constraint interface is invalid, exceeds complexity bounds, or has an empty
 | ||||
| // type set. In the latter case, StructuralTerms returns ErrEmptyTypeSet.
 | ||||
| //
 | ||||
| // StructuralTerms makes no guarantees about the order of terms, except that it
 | ||||
| // is deterministic.
 | ||||
| func StructuralTerms(tparam *TypeParam) ([]*Term, error) { | ||||
| 	constraint := tparam.Constraint() | ||||
| 	if constraint == nil { | ||||
| 		return nil, fmt.Errorf("%s has nil constraint", tparam) | ||||
| 	} | ||||
| 	iface, _ := constraint.Underlying().(*types.Interface) | ||||
| 	if iface == nil { | ||||
| 		return nil, fmt.Errorf("constraint is %T, not *types.Interface", constraint.Underlying()) | ||||
| 	} | ||||
| 	return InterfaceTermSet(iface) | ||||
| } | ||||
| 
 | ||||
| // InterfaceTermSet computes the normalized terms for a constraint interface,
 | ||||
| // returning an error if the term set cannot be computed or is empty. In the
 | ||||
| // latter case, the error will be ErrEmptyTypeSet.
 | ||||
| //
 | ||||
| // See the documentation of StructuralTerms for more information on
 | ||||
| // normalization.
 | ||||
| func InterfaceTermSet(iface *types.Interface) ([]*Term, error) { | ||||
| 	return computeTermSet(iface) | ||||
| } | ||||
| 
 | ||||
| // UnionTermSet computes the normalized terms for a union, returning an error
 | ||||
| // if the term set cannot be computed or is empty. In the latter case, the
 | ||||
| // error will be ErrEmptyTypeSet.
 | ||||
| //
 | ||||
| // See the documentation of StructuralTerms for more information on
 | ||||
| // normalization.
 | ||||
| func UnionTermSet(union *Union) ([]*Term, error) { | ||||
| 	return computeTermSet(union) | ||||
| } | ||||
| 
 | ||||
| func computeTermSet(typ types.Type) ([]*Term, error) { | ||||
| 	tset, err := computeTermSetInternal(typ, make(map[types.Type]*termSet), 0) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if tset.terms.isEmpty() { | ||||
| 		return nil, ErrEmptyTypeSet | ||||
| 	} | ||||
| 	if tset.terms.isAll() { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 	var terms []*Term | ||||
| 	for _, term := range tset.terms { | ||||
| 		terms = append(terms, NewTerm(term.tilde, term.typ)) | ||||
| 	} | ||||
| 	return terms, nil | ||||
| } | ||||
| 
 | ||||
| // A termSet holds the normalized set of terms for a given type.
 | ||||
| //
 | ||||
| // The name termSet is intentionally distinct from 'type set': a type set is
 | ||||
| // all types that implement a type (and includes method restrictions), whereas
 | ||||
| // a term set just represents the structural restrictions on a type.
 | ||||
| type termSet struct { | ||||
| 	complete bool | ||||
| 	terms    termlist | ||||
| } | ||||
| 
 | ||||
| func indentf(depth int, format string, args ...interface{}) { | ||||
| 	fmt.Fprintf(os.Stderr, strings.Repeat(".", depth)+format+"\n", args...) | ||||
| } | ||||
| 
 | ||||
| func computeTermSetInternal(t types.Type, seen map[types.Type]*termSet, depth int) (res *termSet, err error) { | ||||
| 	if t == nil { | ||||
| 		panic("nil type") | ||||
| 	} | ||||
| 
 | ||||
| 	if debug { | ||||
| 		indentf(depth, "%s", t.String()) | ||||
| 		defer func() { | ||||
| 			if err != nil { | ||||
| 				indentf(depth, "=> %s", err) | ||||
| 			} else { | ||||
| 				indentf(depth, "=> %s", res.terms.String()) | ||||
| 			} | ||||
| 		}() | ||||
| 	} | ||||
| 
 | ||||
| 	const maxTermCount = 100 | ||||
| 	if tset, ok := seen[t]; ok { | ||||
| 		if !tset.complete { | ||||
| 			return nil, fmt.Errorf("cycle detected in the declaration of %s", t) | ||||
| 		} | ||||
| 		return tset, nil | ||||
| 	} | ||||
| 
 | ||||
| 	// Mark the current type as seen to avoid infinite recursion.
 | ||||
| 	tset := new(termSet) | ||||
| 	defer func() { | ||||
| 		tset.complete = true | ||||
| 	}() | ||||
| 	seen[t] = tset | ||||
| 
 | ||||
| 	switch u := t.Underlying().(type) { | ||||
| 	case *types.Interface: | ||||
| 		// The term set of an interface is the intersection of the term sets of its
 | ||||
| 		// embedded types.
 | ||||
| 		tset.terms = allTermlist | ||||
| 		for i := 0; i < u.NumEmbeddeds(); i++ { | ||||
| 			embedded := u.EmbeddedType(i) | ||||
| 			if _, ok := embedded.Underlying().(*TypeParam); ok { | ||||
| 				return nil, fmt.Errorf("invalid embedded type %T", embedded) | ||||
| 			} | ||||
| 			tset2, err := computeTermSetInternal(embedded, seen, depth+1) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			tset.terms = tset.terms.intersect(tset2.terms) | ||||
| 		} | ||||
| 	case *Union: | ||||
| 		// The term set of a union is the union of term sets of its terms.
 | ||||
| 		tset.terms = nil | ||||
| 		for i := 0; i < u.Len(); i++ { | ||||
| 			t := u.Term(i) | ||||
| 			var terms termlist | ||||
| 			switch t.Type().Underlying().(type) { | ||||
| 			case *types.Interface: | ||||
| 				tset2, err := computeTermSetInternal(t.Type(), seen, depth+1) | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
| 				terms = tset2.terms | ||||
| 			case *TypeParam, *Union: | ||||
| 				// A stand-alone type parameter or union is not permitted as union
 | ||||
| 				// term.
 | ||||
| 				return nil, fmt.Errorf("invalid union term %T", t) | ||||
| 			default: | ||||
| 				if t.Type() == types.Typ[types.Invalid] { | ||||
| 					continue | ||||
| 				} | ||||
| 				terms = termlist{{t.Tilde(), t.Type()}} | ||||
| 			} | ||||
| 			tset.terms = tset.terms.union(terms) | ||||
| 			if len(tset.terms) > maxTermCount { | ||||
| 				return nil, fmt.Errorf("exceeded max term count %d", maxTermCount) | ||||
| 			} | ||||
| 		} | ||||
| 	case *TypeParam: | ||||
| 		panic("unreachable") | ||||
| 	default: | ||||
| 		// For all other types, the term set is just a single non-tilde term
 | ||||
| 		// holding the type itself.
 | ||||
| 		if u != types.Typ[types.Invalid] { | ||||
| 			tset.terms = termlist{{false, t}} | ||||
| 		} | ||||
| 	} | ||||
| 	return tset, nil | ||||
| } | ||||
| 
 | ||||
| // under is a facade for the go/types internal function of the same name. It is
 | ||||
| // used by typeterm.go.
 | ||||
| func under(t types.Type) types.Type { | ||||
| 	return t.Underlying() | ||||
| } | ||||
|  | @ -0,0 +1,172 @@ | |||
| // Copyright 2021 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // Code generated by copytermlist.go DO NOT EDIT.
 | ||||
| 
 | ||||
| package typeparams | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"go/types" | ||||
| ) | ||||
| 
 | ||||
| // A termlist represents the type set represented by the union
 | ||||
| // t1 ∪ y2 ∪ ... tn of the type sets of the terms t1 to tn.
 | ||||
| // A termlist is in normal form if all terms are disjoint.
 | ||||
| // termlist operations don't require the operands to be in
 | ||||
| // normal form.
 | ||||
| type termlist []*term | ||||
| 
 | ||||
| // allTermlist represents the set of all types.
 | ||||
| // It is in normal form.
 | ||||
| var allTermlist = termlist{new(term)} | ||||
| 
 | ||||
| // String prints the termlist exactly (without normalization).
 | ||||
| func (xl termlist) String() string { | ||||
| 	if len(xl) == 0 { | ||||
| 		return "∅" | ||||
| 	} | ||||
| 	var buf bytes.Buffer | ||||
| 	for i, x := range xl { | ||||
| 		if i > 0 { | ||||
| 			buf.WriteString(" ∪ ") | ||||
| 		} | ||||
| 		buf.WriteString(x.String()) | ||||
| 	} | ||||
| 	return buf.String() | ||||
| } | ||||
| 
 | ||||
| // isEmpty reports whether the termlist xl represents the empty set of types.
 | ||||
| func (xl termlist) isEmpty() bool { | ||||
| 	// If there's a non-nil term, the entire list is not empty.
 | ||||
| 	// If the termlist is in normal form, this requires at most
 | ||||
| 	// one iteration.
 | ||||
| 	for _, x := range xl { | ||||
| 		if x != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| // isAll reports whether the termlist xl represents the set of all types.
 | ||||
| func (xl termlist) isAll() bool { | ||||
| 	// If there's a 𝓤 term, the entire list is 𝓤.
 | ||||
| 	// If the termlist is in normal form, this requires at most
 | ||||
| 	// one iteration.
 | ||||
| 	for _, x := range xl { | ||||
| 		if x != nil && x.typ == nil { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // norm returns the normal form of xl.
 | ||||
| func (xl termlist) norm() termlist { | ||||
| 	// Quadratic algorithm, but good enough for now.
 | ||||
| 	// TODO(gri) fix asymptotic performance
 | ||||
| 	used := make([]bool, len(xl)) | ||||
| 	var rl termlist | ||||
| 	for i, xi := range xl { | ||||
| 		if xi == nil || used[i] { | ||||
| 			continue | ||||
| 		} | ||||
| 		for j := i + 1; j < len(xl); j++ { | ||||
| 			xj := xl[j] | ||||
| 			if xj == nil || used[j] { | ||||
| 				continue | ||||
| 			} | ||||
| 			if u1, u2 := xi.union(xj); u2 == nil { | ||||
| 				// If we encounter a 𝓤 term, the entire list is 𝓤.
 | ||||
| 				// Exit early.
 | ||||
| 				// (Note that this is not just an optimization;
 | ||||
| 				// if we continue, we may end up with a 𝓤 term
 | ||||
| 				// and other terms and the result would not be
 | ||||
| 				// in normal form.)
 | ||||
| 				if u1.typ == nil { | ||||
| 					return allTermlist | ||||
| 				} | ||||
| 				xi = u1 | ||||
| 				used[j] = true // xj is now unioned into xi - ignore it in future iterations
 | ||||
| 			} | ||||
| 		} | ||||
| 		rl = append(rl, xi) | ||||
| 	} | ||||
| 	return rl | ||||
| } | ||||
| 
 | ||||
| // If the type set represented by xl is specified by a single (non-𝓤) term,
 | ||||
| // structuralType returns that type. Otherwise it returns nil.
 | ||||
| func (xl termlist) structuralType() types.Type { | ||||
| 	if nl := xl.norm(); len(nl) == 1 { | ||||
| 		return nl[0].typ // if nl.isAll() then typ is nil, which is ok
 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // union returns the union xl ∪ yl.
 | ||||
| func (xl termlist) union(yl termlist) termlist { | ||||
| 	return append(xl, yl...).norm() | ||||
| } | ||||
| 
 | ||||
| // intersect returns the intersection xl ∩ yl.
 | ||||
| func (xl termlist) intersect(yl termlist) termlist { | ||||
| 	if xl.isEmpty() || yl.isEmpty() { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	// Quadratic algorithm, but good enough for now.
 | ||||
| 	// TODO(gri) fix asymptotic performance
 | ||||
| 	var rl termlist | ||||
| 	for _, x := range xl { | ||||
| 		for _, y := range yl { | ||||
| 			if r := x.intersect(y); r != nil { | ||||
| 				rl = append(rl, r) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return rl.norm() | ||||
| } | ||||
| 
 | ||||
| // equal reports whether xl and yl represent the same type set.
 | ||||
| func (xl termlist) equal(yl termlist) bool { | ||||
| 	// TODO(gri) this should be more efficient
 | ||||
| 	return xl.subsetOf(yl) && yl.subsetOf(xl) | ||||
| } | ||||
| 
 | ||||
| // includes reports whether t ∈ xl.
 | ||||
| func (xl termlist) includes(t types.Type) bool { | ||||
| 	for _, x := range xl { | ||||
| 		if x.includes(t) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // supersetOf reports whether y ⊆ xl.
 | ||||
| func (xl termlist) supersetOf(y *term) bool { | ||||
| 	for _, x := range xl { | ||||
| 		if y.subsetOf(x) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // subsetOf reports whether xl ⊆ yl.
 | ||||
| func (xl termlist) subsetOf(yl termlist) bool { | ||||
| 	if yl.isEmpty() { | ||||
| 		return xl.isEmpty() | ||||
| 	} | ||||
| 
 | ||||
| 	// each term x of xl must be a subset of yl
 | ||||
| 	for _, x := range xl { | ||||
| 		if !yl.supersetOf(x) { | ||||
| 			return false // x is not a subset yl
 | ||||
| 		} | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
							
								
								
									
										197
									
								
								vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										197
									
								
								vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,197 @@ | |||
| // Copyright 2021 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build !go1.18
 | ||||
| // +build !go1.18
 | ||||
| 
 | ||||
| package typeparams | ||||
| 
 | ||||
| import ( | ||||
| 	"go/ast" | ||||
| 	"go/token" | ||||
| 	"go/types" | ||||
| ) | ||||
| 
 | ||||
| func unsupported() { | ||||
| 	panic("type parameters are unsupported at this go version") | ||||
| } | ||||
| 
 | ||||
| // IndexListExpr is a placeholder type, as type parameters are not supported at
 | ||||
| // this Go version. Its methods panic on use.
 | ||||
| type IndexListExpr struct { | ||||
| 	ast.Expr | ||||
| 	X       ast.Expr   // expression
 | ||||
| 	Lbrack  token.Pos  // position of "["
 | ||||
| 	Indices []ast.Expr // index expressions
 | ||||
| 	Rbrack  token.Pos  // position of "]"
 | ||||
| } | ||||
| 
 | ||||
| // ForTypeSpec returns an empty field list, as type parameters on not supported
 | ||||
| // at this Go version.
 | ||||
| func ForTypeSpec(*ast.TypeSpec) *ast.FieldList { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // ForFuncType returns an empty field list, as type parameters are not
 | ||||
| // supported at this Go version.
 | ||||
| func ForFuncType(*ast.FuncType) *ast.FieldList { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // TypeParam is a placeholder type, as type parameters are not supported at
 | ||||
| // this Go version. Its methods panic on use.
 | ||||
| type TypeParam struct{ types.Type } | ||||
| 
 | ||||
| func (*TypeParam) Index() int             { unsupported(); return 0 } | ||||
| func (*TypeParam) Constraint() types.Type { unsupported(); return nil } | ||||
| func (*TypeParam) Obj() *types.TypeName   { unsupported(); return nil } | ||||
| 
 | ||||
| // TypeParamList is a placeholder for an empty type parameter list.
 | ||||
| type TypeParamList struct{} | ||||
| 
 | ||||
| func (*TypeParamList) Len() int          { return 0 } | ||||
| func (*TypeParamList) At(int) *TypeParam { unsupported(); return nil } | ||||
| 
 | ||||
| // TypeList is a placeholder for an empty type list.
 | ||||
| type TypeList struct{} | ||||
| 
 | ||||
| func (*TypeList) Len() int          { return 0 } | ||||
| func (*TypeList) At(int) types.Type { unsupported(); return nil } | ||||
| 
 | ||||
| // NewTypeParam is unsupported at this Go version, and panics.
 | ||||
| func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam { | ||||
| 	unsupported() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // SetTypeParamConstraint is unsupported at this Go version, and panics.
 | ||||
| func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) { | ||||
| 	unsupported() | ||||
| } | ||||
| 
 | ||||
| // NewSignatureType calls types.NewSignature, panicking if recvTypeParams or
 | ||||
| // typeParams is non-empty.
 | ||||
| func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature { | ||||
| 	if len(recvTypeParams) != 0 || len(typeParams) != 0 { | ||||
| 		panic("signatures cannot have type parameters at this Go version") | ||||
| 	} | ||||
| 	return types.NewSignature(recv, params, results, variadic) | ||||
| } | ||||
| 
 | ||||
| // ForSignature returns an empty slice.
 | ||||
| func ForSignature(*types.Signature) *TypeParamList { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // RecvTypeParams returns a nil slice.
 | ||||
| func RecvTypeParams(sig *types.Signature) *TypeParamList { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // IsComparable returns false, as no interfaces are type-restricted at this Go
 | ||||
| // version.
 | ||||
| func IsComparable(*types.Interface) bool { | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // IsMethodSet returns true, as no interfaces are type-restricted at this Go
 | ||||
| // version.
 | ||||
| func IsMethodSet(*types.Interface) bool { | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| // IsImplicit returns false, as no interfaces are implicit at this Go version.
 | ||||
| func IsImplicit(*types.Interface) bool { | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // MarkImplicit does nothing, because this Go version does not have implicit
 | ||||
| // interfaces.
 | ||||
| func MarkImplicit(*types.Interface) {} | ||||
| 
 | ||||
| // ForNamed returns an empty type parameter list, as type parameters are not
 | ||||
| // supported at this Go version.
 | ||||
| func ForNamed(*types.Named) *TypeParamList { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // SetForNamed panics if tparams is non-empty.
 | ||||
| func SetForNamed(_ *types.Named, tparams []*TypeParam) { | ||||
| 	if len(tparams) > 0 { | ||||
| 		unsupported() | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // NamedTypeArgs returns nil.
 | ||||
| func NamedTypeArgs(*types.Named) *TypeList { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // NamedTypeOrigin is the identity method at this Go version.
 | ||||
| func NamedTypeOrigin(named *types.Named) types.Type { | ||||
| 	return named | ||||
| } | ||||
| 
 | ||||
| // Term holds information about a structural type restriction.
 | ||||
| type Term struct { | ||||
| 	tilde bool | ||||
| 	typ   types.Type | ||||
| } | ||||
| 
 | ||||
| func (m *Term) Tilde() bool      { return m.tilde } | ||||
| func (m *Term) Type() types.Type { return m.typ } | ||||
| func (m *Term) String() string { | ||||
| 	pre := "" | ||||
| 	if m.tilde { | ||||
| 		pre = "~" | ||||
| 	} | ||||
| 	return pre + m.typ.String() | ||||
| } | ||||
| 
 | ||||
| // NewTerm is unsupported at this Go version, and panics.
 | ||||
| func NewTerm(tilde bool, typ types.Type) *Term { | ||||
| 	return &Term{tilde, typ} | ||||
| } | ||||
| 
 | ||||
| // Union is a placeholder type, as type parameters are not supported at this Go
 | ||||
| // version. Its methods panic on use.
 | ||||
| type Union struct{ types.Type } | ||||
| 
 | ||||
| func (*Union) Len() int         { return 0 } | ||||
| func (*Union) Term(i int) *Term { unsupported(); return nil } | ||||
| 
 | ||||
| // NewUnion is unsupported at this Go version, and panics.
 | ||||
| func NewUnion(terms []*Term) *Union { | ||||
| 	unsupported() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // InitInstanceInfo is a noop at this Go version.
 | ||||
| func InitInstanceInfo(*types.Info) {} | ||||
| 
 | ||||
| // Instance is a placeholder type, as type parameters are not supported at this
 | ||||
| // Go version.
 | ||||
| type Instance struct { | ||||
| 	TypeArgs *TypeList | ||||
| 	Type     types.Type | ||||
| } | ||||
| 
 | ||||
| // GetInstances returns a nil map, as type parameters are not supported at this
 | ||||
| // Go version.
 | ||||
| func GetInstances(info *types.Info) map[*ast.Ident]Instance { return nil } | ||||
| 
 | ||||
| // Context is a placeholder type, as type parameters are not supported at
 | ||||
| // this Go version.
 | ||||
| type Context struct{} | ||||
| 
 | ||||
| // NewContext returns a placeholder Context instance.
 | ||||
| func NewContext() *Context { | ||||
| 	return &Context{} | ||||
| } | ||||
| 
 | ||||
| // Instantiate is unsupported on this Go version, and panics.
 | ||||
| func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) { | ||||
| 	unsupported() | ||||
| 	return nil, nil | ||||
| } | ||||
							
								
								
									
										151
									
								
								vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										151
									
								
								vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,151 @@ | |||
| // Copyright 2021 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build go1.18
 | ||||
| // +build go1.18
 | ||||
| 
 | ||||
| package typeparams | ||||
| 
 | ||||
| import ( | ||||
| 	"go/ast" | ||||
| 	"go/types" | ||||
| ) | ||||
| 
 | ||||
| // IndexListExpr is an alias for ast.IndexListExpr.
 | ||||
| type IndexListExpr = ast.IndexListExpr | ||||
| 
 | ||||
| // ForTypeSpec returns n.TypeParams.
 | ||||
| func ForTypeSpec(n *ast.TypeSpec) *ast.FieldList { | ||||
| 	if n == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return n.TypeParams | ||||
| } | ||||
| 
 | ||||
| // ForFuncType returns n.TypeParams.
 | ||||
| func ForFuncType(n *ast.FuncType) *ast.FieldList { | ||||
| 	if n == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return n.TypeParams | ||||
| } | ||||
| 
 | ||||
| // TypeParam is an alias for types.TypeParam
 | ||||
| type TypeParam = types.TypeParam | ||||
| 
 | ||||
| // TypeParamList is an alias for types.TypeParamList
 | ||||
| type TypeParamList = types.TypeParamList | ||||
| 
 | ||||
| // TypeList is an alias for types.TypeList
 | ||||
| type TypeList = types.TypeList | ||||
| 
 | ||||
| // NewTypeParam calls types.NewTypeParam.
 | ||||
| func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam { | ||||
| 	return types.NewTypeParam(name, constraint) | ||||
| } | ||||
| 
 | ||||
| // SetTypeParamConstraint calls tparam.SetConstraint(constraint).
 | ||||
| func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) { | ||||
| 	tparam.SetConstraint(constraint) | ||||
| } | ||||
| 
 | ||||
| // NewSignatureType calls types.NewSignatureType.
 | ||||
| func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature { | ||||
| 	return types.NewSignatureType(recv, recvTypeParams, typeParams, params, results, variadic) | ||||
| } | ||||
| 
 | ||||
| // ForSignature returns sig.TypeParams()
 | ||||
| func ForSignature(sig *types.Signature) *TypeParamList { | ||||
| 	return sig.TypeParams() | ||||
| } | ||||
| 
 | ||||
| // RecvTypeParams returns sig.RecvTypeParams().
 | ||||
| func RecvTypeParams(sig *types.Signature) *TypeParamList { | ||||
| 	return sig.RecvTypeParams() | ||||
| } | ||||
| 
 | ||||
| // IsComparable calls iface.IsComparable().
 | ||||
| func IsComparable(iface *types.Interface) bool { | ||||
| 	return iface.IsComparable() | ||||
| } | ||||
| 
 | ||||
| // IsMethodSet calls iface.IsMethodSet().
 | ||||
| func IsMethodSet(iface *types.Interface) bool { | ||||
| 	return iface.IsMethodSet() | ||||
| } | ||||
| 
 | ||||
| // IsImplicit calls iface.IsImplicit().
 | ||||
| func IsImplicit(iface *types.Interface) bool { | ||||
| 	return iface.IsImplicit() | ||||
| } | ||||
| 
 | ||||
| // MarkImplicit calls iface.MarkImplicit().
 | ||||
| func MarkImplicit(iface *types.Interface) { | ||||
| 	iface.MarkImplicit() | ||||
| } | ||||
| 
 | ||||
| // ForNamed extracts the (possibly empty) type parameter object list from
 | ||||
| // named.
 | ||||
| func ForNamed(named *types.Named) *TypeParamList { | ||||
| 	return named.TypeParams() | ||||
| } | ||||
| 
 | ||||
| // SetForNamed sets the type params tparams on n. Each tparam must be of
 | ||||
| // dynamic type *types.TypeParam.
 | ||||
| func SetForNamed(n *types.Named, tparams []*TypeParam) { | ||||
| 	n.SetTypeParams(tparams) | ||||
| } | ||||
| 
 | ||||
| // NamedTypeArgs returns named.TypeArgs().
 | ||||
| func NamedTypeArgs(named *types.Named) *TypeList { | ||||
| 	return named.TypeArgs() | ||||
| } | ||||
| 
 | ||||
| // NamedTypeOrigin returns named.Orig().
 | ||||
| func NamedTypeOrigin(named *types.Named) types.Type { | ||||
| 	return named.Origin() | ||||
| } | ||||
| 
 | ||||
| // Term is an alias for types.Term.
 | ||||
| type Term = types.Term | ||||
| 
 | ||||
| // NewTerm calls types.NewTerm.
 | ||||
| func NewTerm(tilde bool, typ types.Type) *Term { | ||||
| 	return types.NewTerm(tilde, typ) | ||||
| } | ||||
| 
 | ||||
| // Union is an alias for types.Union
 | ||||
| type Union = types.Union | ||||
| 
 | ||||
| // NewUnion calls types.NewUnion.
 | ||||
| func NewUnion(terms []*Term) *Union { | ||||
| 	return types.NewUnion(terms) | ||||
| } | ||||
| 
 | ||||
| // InitInstanceInfo initializes info to record information about type and
 | ||||
| // function instances.
 | ||||
| func InitInstanceInfo(info *types.Info) { | ||||
| 	info.Instances = make(map[*ast.Ident]types.Instance) | ||||
| } | ||||
| 
 | ||||
| // Instance is an alias for types.Instance.
 | ||||
| type Instance = types.Instance | ||||
| 
 | ||||
| // GetInstances returns info.Instances.
 | ||||
| func GetInstances(info *types.Info) map[*ast.Ident]Instance { | ||||
| 	return info.Instances | ||||
| } | ||||
| 
 | ||||
| // Context is an alias for types.Context.
 | ||||
| type Context = types.Context | ||||
| 
 | ||||
| // NewContext calls types.NewContext.
 | ||||
| func NewContext() *Context { | ||||
| 	return types.NewContext() | ||||
| } | ||||
| 
 | ||||
| // Instantiate calls types.Instantiate.
 | ||||
| func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) { | ||||
| 	return types.Instantiate(ctxt, typ, targs, validate) | ||||
| } | ||||
|  | @ -0,0 +1,170 @@ | |||
| // Copyright 2021 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // Code generated by copytermlist.go DO NOT EDIT.
 | ||||
| 
 | ||||
| package typeparams | ||||
| 
 | ||||
| import "go/types" | ||||
| 
 | ||||
| // A term describes elementary type sets:
 | ||||
| //
 | ||||
| //   ∅:  (*term)(nil)     == ∅                      // set of no types (empty set)
 | ||||
| //   𝓤:  &term{}          == 𝓤                      // set of all types (𝓤niverse)
 | ||||
| //   T:  &term{false, T}  == {T}                    // set of type T
 | ||||
| //  ~t:  &term{true, t}   == {t' | under(t') == t}  // set of types with underlying type t
 | ||||
| //
 | ||||
| type term struct { | ||||
| 	tilde bool // valid if typ != nil
 | ||||
| 	typ   types.Type | ||||
| } | ||||
| 
 | ||||
| func (x *term) String() string { | ||||
| 	switch { | ||||
| 	case x == nil: | ||||
| 		return "∅" | ||||
| 	case x.typ == nil: | ||||
| 		return "𝓤" | ||||
| 	case x.tilde: | ||||
| 		return "~" + x.typ.String() | ||||
| 	default: | ||||
| 		return x.typ.String() | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // equal reports whether x and y represent the same type set.
 | ||||
| func (x *term) equal(y *term) bool { | ||||
| 	// easy cases
 | ||||
| 	switch { | ||||
| 	case x == nil || y == nil: | ||||
| 		return x == y | ||||
| 	case x.typ == nil || y.typ == nil: | ||||
| 		return x.typ == y.typ | ||||
| 	} | ||||
| 	// ∅ ⊂ x, y ⊂ 𝓤
 | ||||
| 
 | ||||
| 	return x.tilde == y.tilde && types.Identical(x.typ, y.typ) | ||||
| } | ||||
| 
 | ||||
| // union returns the union x ∪ y: zero, one, or two non-nil terms.
 | ||||
| func (x *term) union(y *term) (_, _ *term) { | ||||
| 	// easy cases
 | ||||
| 	switch { | ||||
| 	case x == nil && y == nil: | ||||
| 		return nil, nil // ∅ ∪ ∅ == ∅
 | ||||
| 	case x == nil: | ||||
| 		return y, nil // ∅ ∪ y == y
 | ||||
| 	case y == nil: | ||||
| 		return x, nil // x ∪ ∅ == x
 | ||||
| 	case x.typ == nil: | ||||
| 		return x, nil // 𝓤 ∪ y == 𝓤
 | ||||
| 	case y.typ == nil: | ||||
| 		return y, nil // x ∪ 𝓤 == 𝓤
 | ||||
| 	} | ||||
| 	// ∅ ⊂ x, y ⊂ 𝓤
 | ||||
| 
 | ||||
| 	if x.disjoint(y) { | ||||
| 		return x, y // x ∪ y == (x, y) if x ∩ y == ∅
 | ||||
| 	} | ||||
| 	// x.typ == y.typ
 | ||||
| 
 | ||||
| 	// ~t ∪ ~t == ~t
 | ||||
| 	// ~t ∪  T == ~t
 | ||||
| 	//  T ∪ ~t == ~t
 | ||||
| 	//  T ∪  T ==  T
 | ||||
| 	if x.tilde || !y.tilde { | ||||
| 		return x, nil | ||||
| 	} | ||||
| 	return y, nil | ||||
| } | ||||
| 
 | ||||
| // intersect returns the intersection x ∩ y.
 | ||||
| func (x *term) intersect(y *term) *term { | ||||
| 	// easy cases
 | ||||
| 	switch { | ||||
| 	case x == nil || y == nil: | ||||
| 		return nil // ∅ ∩ y == ∅ and ∩ ∅ == ∅
 | ||||
| 	case x.typ == nil: | ||||
| 		return y // 𝓤 ∩ y == y
 | ||||
| 	case y.typ == nil: | ||||
| 		return x // x ∩ 𝓤 == x
 | ||||
| 	} | ||||
| 	// ∅ ⊂ x, y ⊂ 𝓤
 | ||||
| 
 | ||||
| 	if x.disjoint(y) { | ||||
| 		return nil // x ∩ y == ∅ if x ∩ y == ∅
 | ||||
| 	} | ||||
| 	// x.typ == y.typ
 | ||||
| 
 | ||||
| 	// ~t ∩ ~t == ~t
 | ||||
| 	// ~t ∩  T ==  T
 | ||||
| 	//  T ∩ ~t ==  T
 | ||||
| 	//  T ∩  T ==  T
 | ||||
| 	if !x.tilde || y.tilde { | ||||
| 		return x | ||||
| 	} | ||||
| 	return y | ||||
| } | ||||
| 
 | ||||
| // includes reports whether t ∈ x.
 | ||||
| func (x *term) includes(t types.Type) bool { | ||||
| 	// easy cases
 | ||||
| 	switch { | ||||
| 	case x == nil: | ||||
| 		return false // t ∈ ∅ == false
 | ||||
| 	case x.typ == nil: | ||||
| 		return true // t ∈ 𝓤 == true
 | ||||
| 	} | ||||
| 	// ∅ ⊂ x ⊂ 𝓤
 | ||||
| 
 | ||||
| 	u := t | ||||
| 	if x.tilde { | ||||
| 		u = under(u) | ||||
| 	} | ||||
| 	return types.Identical(x.typ, u) | ||||
| } | ||||
| 
 | ||||
| // subsetOf reports whether x ⊆ y.
 | ||||
| func (x *term) subsetOf(y *term) bool { | ||||
| 	// easy cases
 | ||||
| 	switch { | ||||
| 	case x == nil: | ||||
| 		return true // ∅ ⊆ y == true
 | ||||
| 	case y == nil: | ||||
| 		return false // x ⊆ ∅ == false since x != ∅
 | ||||
| 	case y.typ == nil: | ||||
| 		return true // x ⊆ 𝓤 == true
 | ||||
| 	case x.typ == nil: | ||||
| 		return false // 𝓤 ⊆ y == false since y != 𝓤
 | ||||
| 	} | ||||
| 	// ∅ ⊂ x, y ⊂ 𝓤
 | ||||
| 
 | ||||
| 	if x.disjoint(y) { | ||||
| 		return false // x ⊆ y == false if x ∩ y == ∅
 | ||||
| 	} | ||||
| 	// x.typ == y.typ
 | ||||
| 
 | ||||
| 	// ~t ⊆ ~t == true
 | ||||
| 	// ~t ⊆ T == false
 | ||||
| 	//  T ⊆ ~t == true
 | ||||
| 	//  T ⊆  T == true
 | ||||
| 	return !x.tilde || y.tilde | ||||
| } | ||||
| 
 | ||||
| // disjoint reports whether x ∩ y == ∅.
 | ||||
| // x.typ and y.typ must not be nil.
 | ||||
| func (x *term) disjoint(y *term) bool { | ||||
| 	if debug && (x.typ == nil || y.typ == nil) { | ||||
| 		panic("invalid argument(s)") | ||||
| 	} | ||||
| 	ux := x.typ | ||||
| 	if y.tilde { | ||||
| 		ux = under(ux) | ||||
| 	} | ||||
| 	uy := y.typ | ||||
| 	if x.tilde { | ||||
| 		uy = under(uy) | ||||
| 	} | ||||
| 	return !types.Identical(ux, uy) | ||||
| } | ||||
|  | @ -63,7 +63,7 @@ github.com/container-orchestrated-devices/container-device-interface/pkg/cdi | |||
| github.com/container-orchestrated-devices/container-device-interface/specs-go | ||||
| # github.com/containerd/cgroups v1.0.3 | ||||
| github.com/containerd/cgroups/stats/v1 | ||||
| # github.com/containerd/containerd v1.6.2 | ||||
| # github.com/containerd/containerd v1.6.3 | ||||
| github.com/containerd/containerd/errdefs | ||||
| github.com/containerd/containerd/log | ||||
| github.com/containerd/containerd/pkg/userns | ||||
|  | @ -109,7 +109,7 @@ github.com/containers/buildah/pkg/rusage | |||
| github.com/containers/buildah/pkg/sshagent | ||||
| github.com/containers/buildah/pkg/util | ||||
| github.com/containers/buildah/util | ||||
| # github.com/containers/common v0.47.5-0.20220425182415-4081e6be9356 | ||||
| # github.com/containers/common v0.47.5-0.20220429111201-21d83cf7c533 | ||||
| ## explicit | ||||
| github.com/containers/common/libimage | ||||
| github.com/containers/common/libimage/manifests | ||||
|  | @ -767,8 +767,9 @@ golang.org/x/text/secure/bidirule | |||
| golang.org/x/text/transform | ||||
| golang.org/x/text/unicode/bidi | ||||
| golang.org/x/text/unicode/norm | ||||
| # golang.org/x/tools v0.1.7 | ||||
| # golang.org/x/tools v0.1.10 | ||||
| golang.org/x/tools/go/ast/inspector | ||||
| golang.org/x/tools/internal/typeparams | ||||
| # google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8 | ||||
| google.golang.org/genproto/googleapis/rpc/status | ||||
| # google.golang.org/grpc v1.44.0 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue