diff options
Diffstat (limited to 'vendor/golang.org/x/tools/internal')
6 files changed, 145 insertions, 27 deletions
diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go index f75336834..67256dc39 100644 --- a/vendor/golang.org/x/tools/internal/gocommand/invoke.go +++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -264,8 +264,10 @@ func cmdDebugStr(cmd *exec.Cmd) string {  	env := make(map[string]string)  	for _, kv := range cmd.Env {  		split := strings.SplitN(kv, "=", 2) -		k, v := split[0], split[1] -		env[k] = v +		if len(split) == 2 { +			k, v := split[0], split[1] +			env[k] = v +		}  	}  	var args []string diff --git a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go index 9702094c5..d9950b1f0 100644 --- a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go +++ b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go @@ -23,6 +23,8 @@ var GetGoCmdRunner = func(config interface{}) *gocommand.Runner { return nil }  var SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) {}  var TypecheckCgo int +var DepsErrors int // must be set as a LoadMode to call GetDepsErrors +var ForTest int    // must be set as a LoadMode to call GetForTest  var SetModFlag = func(config interface{}, value string) {}  var SetModFile = func(config interface{}, value string) {} diff --git a/vendor/golang.org/x/tools/internal/typeparams/common.go b/vendor/golang.org/x/tools/internal/typeparams/common.go index ab6b30b83..25a1426d3 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/common.go +++ b/vendor/golang.org/x/tools/internal/typeparams/common.go @@ -16,11 +16,10 @@  // 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. +// restrictions on a type parameter.  // -// See the example/README.md for a more detailed guide on how to update tools -// to support generics. +// An external version of these APIs is available in the +// golang.org/x/exp/typeparams module.  package typeparams  import ( @@ -121,15 +120,15 @@ func OriginMethod(fn *types.Func) *types.Func {  //  // For example, consider the following type declarations:  // -//  type Interface[T any] interface { -//  	Accept(T) -//  } +//	type Interface[T any] interface { +//		Accept(T) +//	}  // -//  type Container[T any] struct { -//  	Element T -//  } +//	type Container[T any] struct { +//		Element T +//	}  // -//  func (c Container[T]) Accept(t T) { c.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. diff --git a/vendor/golang.org/x/tools/internal/typeparams/coretype.go b/vendor/golang.org/x/tools/internal/typeparams/coretype.go new file mode 100644 index 000000000..993135ec9 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/coretype.go @@ -0,0 +1,122 @@ +// Copyright 2022 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 ( +	"go/types" +) + +// CoreType returns the core type of T or nil if T does not have a core type. +// +// See https://go.dev/ref/spec#Core_types for the definition of a core type. +func CoreType(T types.Type) types.Type { +	U := T.Underlying() +	if _, ok := U.(*types.Interface); !ok { +		return U // for non-interface types, +	} + +	terms, err := _NormalTerms(U) +	if len(terms) == 0 || err != nil { +		// len(terms) -> empty type set of interface. +		// err != nil => U is invalid, exceeds complexity bounds, or has an empty type set. +		return nil // no core type. +	} + +	U = terms[0].Type().Underlying() +	var identical int // i in [0,identical) => Identical(U, terms[i].Type().Underlying()) +	for identical = 1; identical < len(terms); identical++ { +		if !types.Identical(U, terms[identical].Type().Underlying()) { +			break +		} +	} + +	if identical == len(terms) { +		// https://go.dev/ref/spec#Core_types +		// "There is a single type U which is the underlying type of all types in the type set of T" +		return U +	} +	ch, ok := U.(*types.Chan) +	if !ok { +		return nil // no core type as identical < len(terms) and U is not a channel. +	} +	// https://go.dev/ref/spec#Core_types +	// "the type chan E if T contains only bidirectional channels, or the type chan<- E or +	// <-chan E depending on the direction of the directional channels present." +	for chans := identical; chans < len(terms); chans++ { +		curr, ok := terms[chans].Type().Underlying().(*types.Chan) +		if !ok { +			return nil +		} +		if !types.Identical(ch.Elem(), curr.Elem()) { +			return nil // channel elements are not identical. +		} +		if ch.Dir() == types.SendRecv { +			// ch is bidirectional. We can safely always use curr's direction. +			ch = curr +		} else if curr.Dir() != types.SendRecv && ch.Dir() != curr.Dir() { +			// ch and curr are not bidirectional and not the same direction. +			return nil +		} +	} +	return ch +} + +// _NormalTerms returns a slice of terms representing the normalized structural +// type restrictions of a type, if any. +// +// For all types other than *types.TypeParam, *types.Interface, and +// *types.Union, this is just a single term with Tilde() == false and +// Type() == typ. For *types.TypeParam, *types.Interface, and *types.Union, see +// below. +// +// 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. +// +// _NormalTerms 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, _NormalTerms +// returns a slice of tilde terms corresponding to the terms of the union in +// the normalized structural restriction. An error is returned if the type is +// invalid, exceeds complexity bounds, or has an empty type set. In the latter +// case, _NormalTerms returns ErrEmptyTypeSet. +// +// _NormalTerms makes no guarantees about the order of terms, except that it +// is deterministic. +func _NormalTerms(typ types.Type) ([]*Term, error) { +	switch typ := typ.(type) { +	case *TypeParam: +		return StructuralTerms(typ) +	case *Union: +		return UnionTermSet(typ) +	case *types.Interface: +		return InterfaceTermSet(typ) +	default: +		return []*Term{NewTerm(false, typ)}, nil +	} +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/normalize.go b/vendor/golang.org/x/tools/internal/typeparams/normalize.go index 090f142a5..9c631b651 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/normalize.go +++ b/vendor/golang.org/x/tools/internal/typeparams/normalize.go @@ -24,20 +24,22 @@ var ErrEmptyTypeSet = errors.New("empty type set")  // 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 +// +//	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 A interface{ ~string|~[]byte }  // -//  type B interface{ int|string } +//	type B interface{ int|string }  // -//  type C interface { ~string|~int } +//	type C interface { ~string|~int }  // -//  type T[P interface{ A|B; C }] 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, diff --git a/vendor/golang.org/x/tools/internal/typeparams/termlist.go b/vendor/golang.org/x/tools/internal/typeparams/termlist.go index 10857d504..933106a23 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/termlist.go +++ b/vendor/golang.org/x/tools/internal/typeparams/termlist.go @@ -97,15 +97,6 @@ func (xl termlist) norm() termlist {  	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()  | 
