mirror of
https://github.com/golang/go
synced 2024-11-02 11:50:30 +00:00
go/types: implement NewTypeList and use it instead of composite literals
Also, simplify a bit of code in predicates.go. This is a backport of changes in CL 344615 that were made in addition to the changes of the original CL 343933; it brings go/types in sync with types2. Change-Id: I14cd4d4704d29894d0fbb8d129744d65e332ad22 Reviewed-on: https://go-review.googlesource.com/c/go/+/344570 Trust: Robert Griesemer <gri@golang.org> Trust: Dan Scales <danscales@google.com> Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
parent
6cf1d5d0fa
commit
647bef6c59
5 changed files with 14 additions and 8 deletions
|
@ -407,7 +407,7 @@ func (check *Checker) recordInferred(call ast.Expr, targs []Type, sig *Signature
|
|||
assert(call != nil)
|
||||
assert(sig != nil)
|
||||
if m := check.Inferred; m != nil {
|
||||
m[call] = Inferred{&TypeList{targs}, sig}
|
||||
m[call] = Inferred{NewTypeList(targs), sig}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@ func (check *Checker) instance(pos token.Pos, typ Type, targs []Type) (res Type)
|
|||
|
||||
tname := NewTypeName(pos, t.obj.pkg, t.obj.name, nil)
|
||||
named := check.newNamed(tname, t, nil, nil, nil) // methods and tparams are set when named is loaded
|
||||
named.targs = &TypeList{targs}
|
||||
named.targs = NewTypeList(targs)
|
||||
named.instance = &instance{pos}
|
||||
if check != nil {
|
||||
check.typMap[h] = named
|
||||
|
|
|
@ -312,16 +312,14 @@ func identical(x, y Type, cmpTags bool, p *ifacePair) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
if nargs := len(xargs); nargs > 0 {
|
||||
if len(xargs) > 0 {
|
||||
// Instances are identical if their original type and type arguments
|
||||
// are identical.
|
||||
if !Identical(x.orig, y.orig) {
|
||||
return false
|
||||
}
|
||||
for i := 0; i < nargs; i++ {
|
||||
xa := xargs[i]
|
||||
ya := yargs[i]
|
||||
if !Identical(xa, ya) {
|
||||
for i, xa := range xargs {
|
||||
if !Identical(xa, yargs[i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
|
|
@ -233,7 +233,7 @@ func (subst *subster) typ(typ Type) Type {
|
|||
// It's ok to provide a nil *Checker because the newly created type
|
||||
// doesn't need to be (lazily) expanded; it's expanded below.
|
||||
named := (*Checker)(nil).newNamed(tname, t.orig, nil, t.tparams, t.methods) // t is loaded, so tparams and methods are available
|
||||
named.targs = &TypeList{newTArgs}
|
||||
named.targs = NewTypeList(newTArgs)
|
||||
subst.typMap[h] = named
|
||||
t.expand(subst.typMap) // must happen after typMap update to avoid infinite recursion
|
||||
|
||||
|
|
|
@ -27,6 +27,14 @@ func (l *TParamList) list() []*TypeParam {
|
|||
// TypeList holds a list of types.
|
||||
type TypeList struct{ types []Type }
|
||||
|
||||
// NewTypeList returns a new TypeList with the types in list.
|
||||
func NewTypeList(list []Type) *TypeList {
|
||||
if len(list) == 0 {
|
||||
return nil
|
||||
}
|
||||
return &TypeList{list}
|
||||
}
|
||||
|
||||
// Len returns the number of types in the list.
|
||||
// It is safe to call on a nil receiver.
|
||||
func (l *TypeList) Len() int { return len(l.list()) }
|
||||
|
|
Loading…
Reference in a new issue