diff --git a/cl/import.go b/cl/import.go index e96b9f21..b264c542 100644 --- a/cl/import.go +++ b/cl/import.go @@ -122,19 +122,27 @@ func (p *context) importPkg(pkg *types.Package, i *pkgInfo) { names := scope.Names() syms := newPkgSymInfo() for _, name := range names { - if token.IsExported(name) { - obj := scope.Lookup(name) - switch obj := obj.(type) { - case *types.Func: - if pos := obj.Pos(); pos != token.NoPos { - fullName, inPkgName := typesFuncName(pkgPath, obj) - syms.addSym(fset, pos, fullName, inPkgName, false) - } - case *types.Var: - if pos := obj.Pos(); pos != token.NoPos { - syms.addSym(fset, pos, pkgPath+"."+name, name, true) + obj := scope.Lookup(name) + switch obj := obj.(type) { + case *types.Func: + if pos := obj.Pos(); pos != token.NoPos { + fullName, inPkgName := typesFuncName(pkgPath, obj) + syms.addSym(fset, pos, fullName, inPkgName, false) + } + case *types.TypeName: + if !obj.IsAlias() { + if t, ok := obj.Type().(*types.Named); ok { + for i, n := 0, t.NumMethods(); i < n; i++ { + fn := t.Method(i) + fullName, inPkgName := typesFuncName(pkgPath, fn) + syms.addSym(fset, fn.Pos(), fullName, inPkgName, false) + } } } + case *types.Var: + if pos := obj.Pos(); pos != token.NoPos { + syms.addSym(fset, pos, pkgPath+"."+name, name, true) + } } } syms.initLinknames(p) @@ -201,7 +209,7 @@ func (p *context) initLink(line string, prefix int, f func(inPkgName string) (fu } } else { fmt.Fprintln(os.Stderr, "==>", line) - fmt.Fprintf(os.Stderr, "linkname %s not found and ignored\n", inPkgName) + fmt.Fprintf(os.Stderr, "llgo: linkname %s not found and ignored\n", inPkgName) } } }