goastch
goastch copied to clipboard
golang AST matcher
#+TITLE: goastch (GO AST matCH)
- Introduction Inspired by [[http://clang.llvm.org/docs/LibASTMatchersReference.html][ast matcher]]. There are four different basic categories of matchers:
- Node Matchers: Matchers that match a specific type of AST node.
- Attributive Matchers: Matchers that match attributes on AST nodes.
- Logical Matchers: Matchers that allow logic between matchers.
- Traversal Matchers: Matchers that allow traversal between AST nodes.
-
Demo of ga toy [[./docs/imgs/ga.gif]]
-
Using as a lib Find 'ShortVarDecl' from a file, and binding these to 'bindID'. #+BEGIN_SRC go package main
import ( "fmt" "go/parser" "go/printer" "go/token" "log" "os"
"github.com/helloyi/goastch"
. "github.com/helloyi/goastch/goastcher"
)
func main() { g := HasDescendant(ShortVarDecl(Anything()).Bind("bindID"))
src := `package foo
func bar() {
a := []int{}
var b []int
c := []string{}
}`
fset := token.NewFileSet()
file, _ := parser.ParseFile(fset, "example", src, 0)
bindings, err := goastch.Find(file, nil, g)
if err != nil {
log.Fatalln(err)
}
for key, list := range bindings {
for _, node := range list {
fmt.Printf("%s: ", key)
_ = printer.Fprint(os.Stdout, fset, node)
fmt.Println()
}
}
} #+END_SRC