| // Copyright 2017 syzkaller project authors. All rights reserved. |
| // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. |
| |
| package ast |
| |
| // Walk calls callback cb for every top-level node in description. |
| // Note: it's not recursive. Use Recursive helper for recursive walk. |
| func (desc *Description) Walk(cb func(Node)) { |
| for _, n := range desc.Nodes { |
| cb(n) |
| } |
| } |
| |
| func Recursive(cb func(Node)) func(Node) { |
| var rec func(Node) |
| rec = func(n Node) { |
| cb(n) |
| n.Walk(rec) |
| } |
| return rec |
| } |
| |
| func (n *NewLine) Walk(cb func(Node)) {} |
| func (n *Comment) Walk(cb func(Node)) {} |
| func (n *Ident) Walk(cb func(Node)) {} |
| func (n *String) Walk(cb func(Node)) {} |
| func (n *Int) Walk(cb func(Node)) {} |
| |
| func (n *Include) Walk(cb func(Node)) { |
| cb(n.File) |
| } |
| |
| func (n *Incdir) Walk(cb func(Node)) { |
| cb(n.Dir) |
| } |
| |
| func (n *Define) Walk(cb func(Node)) { |
| cb(n.Name) |
| cb(n.Value) |
| } |
| |
| func (n *Resource) Walk(cb func(Node)) { |
| cb(n.Name) |
| cb(n.Base) |
| for _, v := range n.Values { |
| cb(v) |
| } |
| } |
| |
| func (n *TypeDef) Walk(cb func(Node)) { |
| cb(n.Name) |
| for _, a := range n.Args { |
| cb(a) |
| } |
| if n.Type != nil { |
| cb(n.Type) |
| } |
| if n.Struct != nil { |
| cb(n.Struct) |
| } |
| } |
| |
| func (n *Call) Walk(cb func(Node)) { |
| cb(n.Name) |
| for _, f := range n.Args { |
| cb(f) |
| } |
| if n.Ret != nil { |
| cb(n.Ret) |
| } |
| } |
| |
| func (n *Struct) Walk(cb func(Node)) { |
| cb(n.Name) |
| for _, f := range n.Fields { |
| cb(f) |
| } |
| for _, a := range n.Attrs { |
| cb(a) |
| } |
| for _, c := range n.Comments { |
| cb(c) |
| } |
| } |
| |
| func (n *IntFlags) Walk(cb func(Node)) { |
| cb(n.Name) |
| for _, v := range n.Values { |
| cb(v) |
| } |
| } |
| |
| func (n *StrFlags) Walk(cb func(Node)) { |
| cb(n.Name) |
| for _, v := range n.Values { |
| cb(v) |
| } |
| } |
| |
| func (n *Type) Walk(cb func(Node)) { |
| for _, t := range n.Args { |
| cb(t) |
| } |
| } |
| |
| func (n *Field) Walk(cb func(Node)) { |
| cb(n.Name) |
| cb(n.Type) |
| for _, c := range n.Comments { |
| cb(c) |
| } |
| } |