本篇文章向大家介绍《这是 ast 解析的正确行为吗》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。
问题内容
我正在学习如何使用 golang 的 ast 库以及如何工作。我正在解析 https://GitHub.com/modern-Go/concurrent,避免测试文件和 go_below_19.go,因为它会导致错误。
我的问题是解析文件 unbounded_executor.go 中的这些行,
var handlepanic = func(recovered interface{}, funcname string) {
errorlogger.println(fmt.sprintf("%s panic: %v", funcname, recovered))
errorlogger.println(string(debug.stack()))
}
两个实例中 errorlogger 的 ast.ident 都有一个 nil 对象。
但是,我相信它不应该为零,应该引用 log.go 中的这些行,
// errorlogger is used to print out error, can be set to writer other than stderr
var errorlogger = log.new(os.stderr, "", 0)
是我错了,还是解析器有问题?我遵循了一些有关解析文件的参考资料,并在每个文件中重用 *token.fileset 并使用 parsecomments 作为模式。
编辑:
围绕此有一个大型代码库,因此演示此内容的代码将包含片段。
这是在所有非测试 go 文件中使用相同的 fset 执行的,没有会阻止代码在 1.16 中使用的构建限制
parsedFile, parseErr := parser.ParseFile(fset, filePath, nil, parser.ParseComments)
正确答案
致电 ast.NewPackage 解析 ast 中的标识符:
fset := token.NewFileSet()
files := make(map[string]*ast.File)
for _, name := range []string{"unbounded_executor.go", "log.go"} {
f, err := parser.ParseFile(fset, name, nil, parser.ParseComments)
if err != nil {
log.Fatal(err)
}
files[name] = f
}
ast.NewPackage(fset, files, nil, nil)
ast.Inspect(files["unbounded_executor.go"], func(n ast.node) bool {
if n, ok := n.(*ast.Ident); ok && n.Name == "ErrorLogger" {
fmt.Println(n.Obj)
}
return true
})
由于未提供正确的导入程序,并且文件列表未包含包中的所有文件,因此 newpackage 返回未解析的符号错误。
到这里,我们也就讲完了《这是 ast 解析的正确行为吗》的内容了。