【发布时间】:2018-02-27 02:17:21
【问题描述】:
我正在尝试使用 ast 列出函数中的所有函数调用。但是很难理解它应该如何使用。我已经能够做到这一点。
set := token.NewFileSet()
packs, err := parser.ParseFile(set, serviceFile, nil, 0)
if err != nil {
fmt.Println("Failed to parse package:", err)
os.Exit(1)
}
funcs := []*ast.FuncDecl{}
for _, d := range packs.Decls {
if fn, isFn := d.(*ast.FuncDecl); isFn {
funcs = append(funcs, fn)
}
}
我检查了函数。我去funcs[n1].Body.List[n2]。
但在此之后,我不明白我应该如何阅读底层data.X.Fun.data.Sel.name(从 gogland 的评估中获得)以获取被调用函数的名称。
【问题讨论】:
-
我发现在尝试了解如何使用 go/ast 包时,print 示例树很有帮助。如果你需要区分函数调用和转换,使用 go/types 可能更容易。
-
编写需要检查的函数,编写类似于golang.org/pkg/go/ast/#Print的代码,加载并检查您的代码(直接传递func.Body节点)。 +/-gist.github.com/mh-cbon/3ed5d9c39e9635cfed0f896000098133。这将对使用 ast 有很大帮助。