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

跨包使用 go/parser

跨包使用 go/parser

Go
噜噜哒 2021-11-08 14:46:19
我使用go/parser来解析 golang 文件并检查它的 AST。我有一个特定的问题,我想使用 go/parser 但我遇到了障碍。考虑以下文件存在于 GOPATH/src 中$GOPATH/src/    example.go    example_package/        example_package.go以下是上述文件的内容例子.gopackage mainimport (    "example_package")type MyObject struct {    base *example_package.BaseObject}func DoMyThing(arg *example_package.FirstArg) {    arg.Write(10)}func DoMyAnotherThing() {}func main() {    example_package.GetItStarted(&MyObject{})}example_package.gopackage example_packagefunc GetItStarted(obj interface{}) {}type FirstArg interface {    Read() int    Write(x int)}type BaseObject struct {}func (p *BaseObject) DoSomething(arg *FirstArg, a int) {    arg.Write(arg.Read() + a)}我的意图是编写一个名为gen_structure这样使用的 go 程序$ gen_structure example.go输出将是> MyObject- DoMyThing(arg)- base    - DoSomething(arg, a)gen_structure 做了什么?它解析 example.go 和example_package.GetItStarted(&MyObject{})从 main() 函数内部的行中提取“MyObject” 。查找MyObject至少有一个参数且第一个参数为 type 的方法*package_example.FirstArg。它找到DoMyThing(并忽略DoMyAnotherThing)。标识成员base并查看内部(通过打开example_package)。应用与上述相同的过程来查找方法并查找 DoSomething使用收集的信息,它打印所需的输出。我知道我可以使用go/parser. 但是,我无法弄清楚如何跨包解析符号(在本例中为example_package)。我该怎么做呢?
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

调用ast.NewPackage来解析包名称。您将需要提供一个进口商返回一个* ast.Object对于给定的输入路径。如果您只想将名称解析为路径,导入程序可以简单地返回一个*ast.Object,其中Kind设置为ast.Pkg,Name设置为包的名称。导入器中的大部分繁重工作都可以通过go/build 完成包裹。如果要为目标包解析执行 AST,则需要解析包并返回包的 ast.Object。为了防止多次加载同一个包,请使用导入器的 map 参数作为先前加载的包的缓存。


这是一些未经测试的代码,用于从以下位置查找已解析的包路径*ast.SelectorExpr se:


    if x, _ := se.X.(*ast.Ident); x != nil {

        if obj := x.Obj; obj != nil && obj.Kind == ast.Pkg {

            if spec, _ := obj.Decl.(*ast.ImportSpec); spec != nil {

                if path, err := strconv.Unquote(spec.Path.Value); err == nil {

                    // path is resolved path for selector expression se.

                }

            }

         }

     }

该GO /类型的包装,也可用于获取此信息等等。我建议使用 go/types 而不是直接使用 go/ast。


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

添加回答

举报

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