package ast
import "fmt"
type Visitor interface {
Visit(node Node) (w Visitor)
}
func Walk(v Visitor, node Node) {
if v = v.Visit(node); v == nil {
return
}
switch n := node.(type) {
case *File:
Walk(v, n.Body)
case Body:
for _, s := range n {
Walk(v, s)
}
case *AttributeStmt:
Walk(v, n.Name)
Walk(v, n.Value)
case *BlockStmt:
Walk(v, n.Body)
case *Ident:
case *IdentifierExpr:
Walk(v, n.Ident)
case *LiteralExpr:
case *ArrayExpr:
for _, e := range n.Elements {
Walk(v, e)
}
case *ObjectExpr:
for _, f := range n.Fields {
Walk(v, f.Name)
Walk(v, f.Value)
}
case *AccessExpr:
Walk(v, n.Value)
Walk(v, n.Name)
case *IndexExpr:
Walk(v, n.Value)
Walk(v, n.Index)
case *CallExpr:
Walk(v, n.Value)
for _, a := range n.Args {
Walk(v, a)
}
case *UnaryExpr:
Walk(v, n.Value)
case *BinaryExpr:
Walk(v, n.Left)
Walk(v, n.Right)
case *ParenExpr:
Walk(v, n.Inner)
default:
panic(fmt.Sprintf("river/ast: unexpected node type %T", n))
}
v.Visit(nil)
}