Aster
Easily get the golang syntax tree and modify the code.
Feature
- Convert the AST to
reflect.Type
-like types(Kind-Flags), as it would at runtime - Collect and package common syntax node types
- Provides easy-to-use traversal syntax node functionality
- Easily fetch and modify syntax node information
- Formatted output modified code
- Simpler, more natural way of metaprogramming
- ...
Go Version
- ≥go1.11
An Example
- Set struct tag
package main
import (
"flag"
"fmt"
"github.com/andeya/aster/aster"
"github.com/andeya/goutil"
)
var (
filename = flag.String("filename", "out/eg.structtag.go", "file name")
src = flag.String("src", `package test
type S struct {
Apple string
BananaPeel,car,OrangeWater string
E int
}
func F(){
type M struct {
N int
lowerCase string
}
}
`, "code text")
)
func setStructTag(fa aster.Facade) bool {
if fa.TypKind() != aster.Struct {
return true
}
for i := fa.NumFields() - 1; i >= 0; i-- {
field := fa.Field(i)
if !field.Exported() {
continue
}
field.Tags().Set(&aster.Tag{
Key: "json",
Name: goutil.SnakeString(field.Name()),
Options: []string{"omitempty"},
})
}
return true
}
func main() {
flag.Parse()
prog, _ := aster.LoadFile(*filename, *src)
prog.Inspect(setStructTag)
_ = prog.Rewrite()
}
- The output of the above program is:
package test
type S struct {
Apple string `json:"apple,omitempty"`
BananaPeel string `json:"banana_peel,omitempty"`
car string
OrangeWater string `json:"orange_water,omitempty"`
E int `json:"e,omitempty"`
}
func F() {
type M struct {
N int `json:"n,omitempty"`
lowerCase string
}
}
Task List
- Basic
- Array
- Slice
- Struct
- Pointer
- Tuple
- Signature // non-builtin function or method
- Interface
- Map
- Chan