var e *ifaceInfo
switch ename := f.Type.(type) {
case *ast.Ident:
- e = check.infoFromTypeName(ename, path)
+ e = check.infoFromTypeName(scope, ename, path)
case *ast.SelectorExpr:
- e = check.infoFromQualifiedTypeName(ename)
+ e = check.infoFromQualifiedTypeName(scope, ename)
default:
// The parser makes sure we only see one of the above.
// Constructed ASTs may contain other (invalid) nodes;
// which must denote a type whose underlying type is an interface.
// The same result qualifications apply as for infoFromTypeLit.
// infoFromTypeName should only be called from infoFromTypeLit.
-func (check *Checker) infoFromTypeName(name *ast.Ident, path []*TypeName) *ifaceInfo {
+func (check *Checker) infoFromTypeName(scope *Scope, name *ast.Ident, path []*TypeName) *ifaceInfo {
// A single call of infoFromTypeName handles a sequence of (possibly
// recursive) type declarations connected via unqualified type names.
// Each type declaration leading to another typename causes a "tail call"
typenameLoop:
// name must be a type name denoting a type whose underlying type is an interface
- obj := check.lookup(name.Name)
+ _, obj := scope.LookupParent(name.Name, check.pos)
if obj == nil {
return nil
}
goto typenameLoop
case *ast.SelectorExpr:
// type tname p.T
- return check.infoFromQualifiedTypeName(typ)
+ return check.infoFromQualifiedTypeName(decl.file, typ)
case *ast.InterfaceType:
// type tname interface{...}
return check.infoFromTypeLit(decl.file, typ, tname, path)
}
// infoFromQualifiedTypeName computes the method set for the given qualified type name, or nil.
-func (check *Checker) infoFromQualifiedTypeName(qname *ast.SelectorExpr) *ifaceInfo {
+func (check *Checker) infoFromQualifiedTypeName(scope *Scope, qname *ast.SelectorExpr) *ifaceInfo {
// see also Checker.selector
name, _ := qname.X.(*ast.Ident)
if name == nil {
return nil
}
- obj1 := check.lookup(name.Name)
+ _, obj1 := scope.LookupParent(name.Name, check.pos)
if obj1 == nil {
return nil
}