1
0
mirror of https://github.com/golang/go synced 2024-11-24 01:40:12 -07:00

cmd/compile/internal/types2: remove asNamed

In the few remaining places where we use asNamed, if the argument
is indeed a *Named, we either don't need to look "inside" it, or
we call under() (which calls Named.underlying() which does resolve);
so there's no need for an implicit resolution (which was done by
asNamed). The only place where we do need to resolve is in lookup,
so added the explicit resolve call in that case.

Change-Id: Iff0a19fde7581e94149e89b9e48157c1981db105
Reviewed-on: https://go-review.googlesource.com/c/go/+/363441
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Robert Griesemer 2021-11-11 22:21:48 -08:00
parent 56e55a3889
commit bc0b98eeff
5 changed files with 12 additions and 22 deletions

View File

@ -727,7 +727,7 @@ func (check *Checker) collectMethods(obj *TypeName) {
// spec: "If the base type is a struct type, the non-blank method
// and field names must be distinct."
base := asNamed(obj.typ) // shouldn't fail but be conservative
base, _ := obj.typ.(*Named) // shouldn't fail but be conservative
if base != nil {
u := base.under()
if t, _ := u.(*Struct); t != nil {

View File

@ -50,8 +50,8 @@ func LookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (o
// Thus, if we have a named pointer type, proceed with the underlying
// pointer type but discard the result if it is a method since we would
// not have found it for T (see also issue 8590).
if t := asNamed(T); t != nil {
if p, _ := safeUnderlying(t).(*Pointer); p != nil {
if t, _ := T.(*Named); t != nil {
if p, _ := t.Underlying().(*Pointer); p != nil {
obj, index, indirect = lookupFieldOrMethod(p, false, false, pkg, name)
if _, ok := obj.(*Func); ok {
return nil, nil, false
@ -114,7 +114,7 @@ func lookupFieldOrMethod(T Type, addressable, checkFold bool, pkg *Package, name
// If we have a named type, we may have associated methods.
// Look for those first.
if named := asNamed(typ); named != nil {
if named, _ := typ.(*Named); named != nil {
if seen[named] {
// We have seen this type before, at a more shallow depth
// (note that multiples of this type at the current depth
@ -129,6 +129,7 @@ func lookupFieldOrMethod(T Type, addressable, checkFold bool, pkg *Package, name
seen[named] = true
// look for a matching attached method
named.resolve(nil)
if i, m := lookupMethodFold(named.methods, pkg, name, checkFold); m != nil {
// potential match
// caution: method may not have a proper signature yet

View File

@ -87,12 +87,3 @@ func structuralType(typ Type) Type {
}
return nil
}
// If t is a defined type, asNamed returns that type (possibly after resolving it), otherwise it returns nil.
func asNamed(t Type) *Named {
e, _ := t.(*Named)
if e != nil {
e.resolve(nil)
}
return e
}

View File

@ -235,14 +235,12 @@ func (u *unifier) nify(x, y Type, p *ifacePair) bool {
// If exact unification is known to fail because we attempt to
// match a type name against an unnamed type literal, consider
// the underlying type of the named type.
// (Subtle: We use hasName to include any type with a name (incl.
// basic types and type parameters. We use asNamed because we only
// want *Named types.)
switch {
case !hasName(x) && y != nil && asNamed(y) != nil:
return u.nify(x, under(y), p)
case x != nil && asNamed(x) != nil && !hasName(y):
return u.nify(under(x), y, p)
// (We use !hasName to exclude any type with a name, including
// basic types and type parameters; the rest are unamed types.)
if nx, _ := x.(*Named); nx != nil && !hasName(y) {
return u.nify(nx.under(), y, p)
} else if ny, _ := y.(*Named); ny != nil && !hasName(x) {
return u.nify(x, ny.under(), p)
}
}

View File

@ -240,7 +240,7 @@ func def(obj Object) {
return // nothing to do
}
// fix Obj link for named types
if typ := asNamed(obj.Type()); typ != nil {
if typ, _ := obj.Type().(*Named); typ != nil {
typ.obj = obj.(*TypeName)
}
// exported identifiers go into package unsafe