in build/walk.go [87:203]
func WalkOnce(v Expr, f func(x *Expr)) {
switch v := v.(type) {
case *File:
for i := range v.Stmt {
f(&v.Stmt[i])
}
case *DotExpr:
f(&v.X)
case *IndexExpr:
f(&v.X)
f(&v.Y)
case *KeyValueExpr:
f(&v.Key)
f(&v.Value)
case *SliceExpr:
f(&v.X)
if v.From != nil {
f(&v.From)
}
if v.To != nil {
f(&v.To)
}
if v.Step != nil {
f(&v.Step)
}
case *ParenExpr:
f(&v.X)
case *UnaryExpr:
f(&v.X)
case *BinaryExpr:
f(&v.X)
f(&v.Y)
case *AssignExpr:
f(&v.LHS)
f(&v.RHS)
case *LambdaExpr:
for i := range v.Params {
f(&v.Params[i])
}
for i := range v.Body {
f(&v.Body[i])
}
case *CallExpr:
f(&v.X)
for i := range v.List {
f(&v.List[i])
}
case *ListExpr:
for i := range v.List {
f(&v.List[i])
}
case *SetExpr:
for i := range v.List {
f(&v.List[i])
}
case *TupleExpr:
for i := range v.List {
f(&v.List[i])
}
case *DictExpr:
for i := range v.List {
e := Expr(v.List[i])
f(&e)
}
case *Comprehension:
f(&v.Body)
for _, c := range v.Clauses {
f(&c)
}
case *IfClause:
f(&v.Cond)
case *ForClause:
f(&v.Vars)
f(&v.X)
case *ConditionalExpr:
f(&v.Then)
f(&v.Test)
f(&v.Else)
case *LoadStmt:
module := (Expr)(v.Module)
f(&module)
v.Module = module.(*StringExpr)
for i := range v.From {
from := (Expr)(v.From[i])
f(&from)
v.From[i] = from.(*Ident)
to := (Expr)(v.To[i])
f(&to)
v.To[i] = to.(*Ident)
}
case *DefStmt:
for i := range v.Params {
f(&v.Params[i])
}
for i := range v.Body {
f(&v.Body[i])
}
case *IfStmt:
f(&v.Cond)
for i := range v.True {
f(&v.True[i])
}
for i := range v.False {
f(&v.False[i])
}
case *ForStmt:
f(&v.Vars)
f(&v.X)
for i := range v.Body {
f(&v.Body[i])
}
case *ReturnStmt:
if v.Result != nil {
f(&v.Result)
}
}
}