astrewrite provides a Walk()
function, similar to ast.Inspect() from the
ast package. The only difference is that the passed walk function can also
return a node, which is used to rewrite the parent node. This provides an easy
way to rewrite a given ast.Node while walking the AST.
package main
import (
"bytes"
"fmt"
"go/ast"
"go/parser"
"go/printer"
"go/token"
"github.com/barryz/astrewrite"
)
func main() {
src := `package main
type Foo struct{}`
fset := token.NewFileSet()
file, err := parser.ParseFile(fset, "foo.go", src, parser.ParseComments)
if err != nil {
panic(err)
}
rewriteFunc := func(n ast.Node) (ast.Node, bool) {
x, ok := n.(*ast.TypeSpec)
if !ok {
return n, true
}
// change struct type name to "Bar"
x.Name.Name = "Bar"
return x, true
}
rewritten := astrewrite.Walk(file, rewriteFunc)
var buf bytes.Buffer
printer.Fprint(&buf, fset, rewritten)
fmt.Println(buf.String())
// Output:
// package main
//
// type Bar struct{}
// Write ast change to file
filepath := "/path/to/your/source/code.go"
if err := astrewrite.WriteFile(fset, rewritten, filepath); err !=nil {
panic(err)
}
}