importPkg: support method linkname
This commit is contained in:
32
cl/import.go
32
cl/import.go
@@ -122,19 +122,27 @@ func (p *context) importPkg(pkg *types.Package, i *pkgInfo) {
|
|||||||
names := scope.Names()
|
names := scope.Names()
|
||||||
syms := newPkgSymInfo()
|
syms := newPkgSymInfo()
|
||||||
for _, name := range names {
|
for _, name := range names {
|
||||||
if token.IsExported(name) {
|
obj := scope.Lookup(name)
|
||||||
obj := scope.Lookup(name)
|
switch obj := obj.(type) {
|
||||||
switch obj := obj.(type) {
|
case *types.Func:
|
||||||
case *types.Func:
|
if pos := obj.Pos(); pos != token.NoPos {
|
||||||
if pos := obj.Pos(); pos != token.NoPos {
|
fullName, inPkgName := typesFuncName(pkgPath, obj)
|
||||||
fullName, inPkgName := typesFuncName(pkgPath, obj)
|
syms.addSym(fset, pos, fullName, inPkgName, false)
|
||||||
syms.addSym(fset, pos, fullName, inPkgName, false)
|
}
|
||||||
}
|
case *types.TypeName:
|
||||||
case *types.Var:
|
if !obj.IsAlias() {
|
||||||
if pos := obj.Pos(); pos != token.NoPos {
|
if t, ok := obj.Type().(*types.Named); ok {
|
||||||
syms.addSym(fset, pos, pkgPath+"."+name, name, true)
|
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)
|
syms.initLinknames(p)
|
||||||
@@ -201,7 +209,7 @@ func (p *context) initLink(line string, prefix int, f func(inPkgName string) (fu
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintln(os.Stderr, "==>", line)
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user