【发布时间】:2015-12-08 12:55:16
【问题描述】:
我使用go/parser 来解析一个golang 文件并检查它的AST。我有一个特定的问题,我想使用 go/parser,但遇到了障碍。
考虑以下文件存在于 GOPATH/src 中
$GOPATH/src/
example.go
example_package/
example_package.go
以下是上述文件的内容
example.go
package main
import (
"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.go
package example_package
func 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 和
- 从 main() 函数内部的
example_package.GetItStarted(&MyObject{})行中提取“MyObject”。 - 在
MyObject上查找至少有一个参数且第一个参数为*package_example.FirstArg类型的方法。它会找到DoMyThing(并忽略DoMyAnotherThing)。 - 识别成员
base并查看内部(通过打开example_package)。 - 应用与上述相同的过程查找方法并找到
DoSomething - 使用收集的信息,打印所需的输出。
我知道我可以使用go/parser 中的功能解析同一目录中的单个文件或一堆文件。但是,我无法弄清楚如何跨包解析符号(在这种情况下,example_package)。
我该怎么做?
【问题讨论】:
标签: parsing go code-generation abstract-syntax-tree