I can only agree, traversing or navigating Go AST is cumbersome for at least two reasons: 1. each type has its own fields - no uniform API is available 2. you often need type assertions on fields because they have interface type instead of concrete type
I developed a wrapper around them to mitigate these problems for my Go interpreter https://github.com/cosmos72/gomacro If you are interested, it is the package https://github.com/cosmos72/gomacro/tree/master/ast2 You may find it helps by providing an uniform API and removing the need for type assertions, but it still requires compile-time code, not CSS-style strings that can be created at runtime. A quick example: this uses plain go/ast ``` package main import ( "fmt" "go/ast" "go/parser" ) func main() { x, _ := parser.ParseExpr("foo[1 + 2 * 3]") // we want to extract the "3" var three string = x.(*ast.IndexExpr).Index.(*ast.BinaryExpr).Y.(*ast.BinaryExpr).Y.(*ast.BasicLit).Value fmt.Printf("%s\n", three) // prints 3 } ``` while this is the equivalent using github.com/cosmos72/gomacro/ast2 ``` package main import ( "fmt" "go/ast" "go/parser" "github.com/cosmos72/gomacro/ast2" ) func main() { x, _ := parser.ParseExpr("foo[1 + 2 * 3]") y := ast2.AnyToAst(x, nil) // wrap the existing AST. does not allocate memory. ythree := y.Get(1).Get(1).Get(1) // extract the "3" as ast2.Node // now unwrap it, getting the *ast.BasicLit and the Value inside it var three string = ast2.ToBasicLit(ythree).Value fmt.Printf("%s\n", three) // prints 3 } ``` On Tuesday, October 13, 2020 at 9:37:21 AM UTC+2 cpu...@gmail.com wrote: > Good morning. > > I've recently found myself writing a code generator for dynamic interface > composition at runtime. It became ugly and I had to pass in quite a number > of parameters that should have been available from reading the source code. > > In a second attempt I've reimplemented the generator using stringer-like > AST handling. It worked well but was cumbersome to code. > > Now an idea surfaced: wouldn't it make sense to implement a selector > interface on top of the golang AST, something like CSS or JQ selectors but > targeted at the go language constructs? I've stumbled across Guru but it > does seem to target a slightly different use case. > > Is anybody aware of such a selector lib/module or does the idea even sound > interesting? > > Cheers, > Andi > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/4af9f13d-6f41-45ff-80e9-e9dd77bd7b92n%40googlegroups.com.