转到 AST : get all structs

标签 go abstract-syntax-tree

我希望能够获取所有结构。例如,假设我们有:

type SomeType struct {
    // ..
}

type someType2 struct {
    //..
}

我们的代码。

structs := getAllStructs(srcPath)  //gets SomeType and someType2

我有一些代码可以找到 srcPath 中的所有 .go 文件并对其执行 parser.ParseFile

有没有办法使用 ast , parser , packages等等...我可以在任何范围内一次获取所有结构吗?如果有一个不在包范围内的结构怎么办?我怎样才能在函数内部获得结构声明?喜欢:

func main() {
    
    type someType3 struct {
        //..
    }

}

最佳答案

Parse每个感兴趣的文件。 Inspect查找结构类型的文件。

fset := token.NewFileSet()
f, err := parser.ParseFile(fset, fileName, nil, 0)
if err != nil {
    log.Fatal(err)
}

// Collect the struct types in this slice.
var structTypes []*ast.StructType

// Use the Inspect function to walk AST looking for struct
// type nodes.
ast.Inspect(f, func(n ast.Node) bool {
    if n, ok := n.(*ast.StructType); ok {
         structTypes = append(structTypes, n)
    }
    return true
})

// The slice structTypes contains all *ast.StructTypes in the file.

关于转到 AST : get all structs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72959643/

相关文章:

go - 详细运行测试套件,但排除日志

go - 如何知道 2 个 go map 是否引用相同的数据

java - 如何使用JJTree构建抽象语法树?

parsing - 如何在 Haskell 中将 Haskell 源代码解析为 AST?

postgresql - 从 Postgres 扫描到带有指针的结构体

pointers - Golang转换自定义类型并将其指针分配给可行的

go - 有条件地停止其他goroutine

Python 最佳实践 : Abstract Syntax Trees

java - 如何使用 java 解析器在 AST 中构建 for 语句?

AST 方法解析中的 java.lang.IllegalArgumentException