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.

Reply via email to