goastch icon indicating copy to clipboard operation
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