mirror of
https://github.com/golang/go
synced 2024-10-04 15:09:59 +00:00
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 <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
e3b48af575
commit
9115a7ba4a
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue