From: Robert Findley Date: Thu, 18 Nov 2021 00:04:17 +0000 (-0500) Subject: go/types: remove asNamed X-Git-Tag: go1.18beta1~259 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9115a7ba4a7e198befe26d69b740a34b495e1db5;p=gostls13.git go/types: remove asNamed This is a port of CL 363441 from types2 to go/types, with an additional adjustment in methodset.go. Change-Id: Ia04dcfb70bb9f6af6f45175dee3334dba7b2768e Reviewed-on: https://go-review.googlesource.com/c/go/+/364895 Trust: Robert Findley Run-TryBot: Robert Findley TryBot-Result: Go Bot Reviewed-by: Robert Griesemer --- diff --git a/src/go/types/decl.go b/src/go/types/decl.go index 4f28553aa6..600467620c 100644 --- a/src/go/types/decl.go +++ b/src/go/types/decl.go @@ -795,7 +795,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 { diff --git a/src/go/types/lookup.go b/src/go/types/lookup.go index 16a9890199..1462d30b30 100644 --- a/src/go/types/lookup.go +++ b/src/go/types/lookup.go @@ -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, pkg, name) if _, ok := obj.(*Func); ok { return nil, nil, false @@ -114,7 +114,7 @@ func lookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (o // 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 bool, pkg *Package, name string) (o seen[named] = true // look for a matching attached method + named.resolve(nil) if i, m := lookupMethod(named.methods, pkg, name); m != nil { // potential match // caution: method may not have a proper signature yet diff --git a/src/go/types/methodset.go b/src/go/types/methodset.go index 89e4b57627..e17be7c41a 100644 --- a/src/go/types/methodset.go +++ b/src/go/types/methodset.go @@ -111,7 +111,7 @@ func NewMethodSet(T Type) *MethodSet { // 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 diff --git a/src/go/types/type.go b/src/go/types/type.go index dcf678a27a..1d672135b8 100644 --- a/src/go/types/type.go +++ b/src/go/types/type.go @@ -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 -} diff --git a/src/go/types/unify.go b/src/go/types/unify.go index 6cd653aee1..5dcb35f6ec 100644 --- a/src/go/types/unify.go +++ b/src/go/types/unify.go @@ -241,14 +241,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) } } diff --git a/src/go/types/universe.go b/src/go/types/universe.go index e30ab12bc3..edda56fc0d 100644 --- a/src/go/types/universe.go +++ b/src/go/types/universe.go @@ -244,7 +244,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