// 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 {
// 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
// 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
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
}
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
-}
// 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)
}
}
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