从包的给定路径中提取类型名称的最简单的工作示例

时间:2015-07-03 11:32:04

标签: go abstract-syntax-tree

我是golang AST包的新手,也是像astutils这样的go工具。目前,我有点无法理解斯金格的例子,并为了我自己的目的而修改它。

https://github.com/golang/tools/blob/master/cmd/stringer/stringer.go

是否有一个简单的提取包路径中所有已定义类型名称列表的工作示例?

1 个答案:

答案 0 :(得分:4)

我想出了一个打印所有(顶级)类型名称的程序示例。解析目录,获取包,然后走它。

fs := token.NewFileSet()
pkgs, err := parser.ParseDir(fs, dir, nil, 0)
// Check err.
pkg, ok := pkgs["pkgname"]
// Check ok.
ast.Walk(VisitorFunc(FindTypes), pkg)

VisitorFuncFindTypes定义为

type VisitorFunc func(n ast.Node) ast.Visitor

func (f VisitorFunc) Visit(n ast.Node) ast.Visitor { return f(n) }

func FindTypes(n ast.Node) ast.Visitor {
    switch n := n.(type) {
    case *ast.Package:
        return VisitorFunc(FindTypes)
    case *ast.File:
        return VisitorFunc(FindTypes)
    case *ast.GenDecl:
        if n.Tok == token.TYPE {
            return VisitorFunc(FindTypes)
        }
    case *ast.TypeSpec:
        fmt.Println(n.Name.Name)
    }
    return nil
}

游乐场的完整代码:http://play.golang.org/p/Rk_zmrmD0k(由于不允许进行FS操作,因此无法在那里工作。)

编辑:这是一个适用于Playground的版本,由Ivan Black撰写评论:https://play.golang.org/p/yLV6-asPas