为了账号安全,请及时绑定邮箱和手机立即绑定

这是 ast 解析的正确行为吗?

这是 ast 解析的正确行为吗?

Go
有只小跳蛙 2022-08-24 15:39:47
我正在努力学习如何使用以及golang的ast库如何工作。我正在解析 https://github.com/modern-go/concurrent,避免测试文件和go_below_19.go,因为它会导致错误。我的问题是解析文件中的这些行,unbounded_executor.govar HandlePanic = func(recovered interface{}, funcName string) {    ErrorLogger.Println(fmt.Sprintf("%s panic: %v", funcName, recovered))    ErrorLogger.Println(string(debug.Stack()))}阿斯特。在这两种情况下,Ident 都有一个 nil obj。ErrorLogger但是,我认为它不应该是零,而应该引用这些行从,log.go// ErrorLogger is used to print out error, can be set to writer other than stderrvar ErrorLogger = log.New(os.Stderr, "", 0)是我错了,还是解析器有问题?我遵循了有关解析文件的几个参考,并重用了*令牌。文件跨每个文件设置,并使用 ParseComments 作为模式。编辑:围绕这一点有一个很大的代码库,因此演示这一点的代码将包括代码片段。这是在所有非测试go文件中使用相同的fset执行的,没有构建限制,不会阻止代码与1.16一起使用parsedFile, parseErr := parser.ParseFile(fset, filePath, nil, parser.ParseComments)
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

打电话给阿斯特。用于解析 AST 中的标识符的 NewPackage:


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 将返回未解决的符号错误。


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信