go - 这是 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()))
}
两个实例中的 ast.IdentErrorLogger
都有一个 nil obj。
但是,我认为它不应该是 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 返回未解决的符号错误。
推荐阅读
- mongodb - 蒙戈 | 警告:没有隐式会话:逻辑会话仅在服务器版本 3.6 和更高版本上受支持
- java - java程序在不同平台上执行速度一样吗?
- ros - 将点云数据从毫米波传感器转换为激光扫描
- phoenix-framework - 困境:我应该使用模块插件还是功能插件:Phoenix
- javascript - 如何为六边形网格着色,使其没有相同颜色的邻居?
- java - 尝试设置 GWT 项目时未找到注释处理器“com.google.web.bindery.requestfactory.apt.RfValidator”错误
- spring-boot - Spring Boot自定义异常未在日志中打印
- ios - 我设置了所有约束,但我仍然得到一个奇怪的行为。甚至在故事板中
- shell - 分别从文本文件中处理具有特定模式边界的代码行?
- javascript - 如何在JS中将巨数转换为纯数