-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtraverse.go
77 lines (73 loc) · 1.74 KB
/
traverse.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package tmpl
import "text/template/parse"
// Visitor is a function that visits nodes in a parse.Tree traversal
type Visitor = func(parse.Node)
// Traverse is a depth-first traversal utility
// for all nodes in a text/template/parse.Tree
func Traverse(cur parse.Node, visitors ...Visitor) {
for _, visitor := range visitors {
visitor(cur)
}
switch node := cur.(type) {
case *parse.ActionNode:
if node.Pipe != nil {
Traverse(node.Pipe, visitors...)
}
case *parse.BoolNode:
case *parse.BranchNode:
if node.Pipe != nil {
Traverse(node.Pipe, visitors...)
}
if node.List != nil {
Traverse(node.List, visitors...)
}
if node.ElseList != nil {
Traverse(node.ElseList, visitors...)
}
case *parse.BreakNode:
case *parse.ChainNode:
case *parse.CommandNode:
if node.Args != nil {
for _, arg := range node.Args {
Traverse(arg, visitors...)
}
}
case *parse.CommentNode:
case *parse.ContinueNode:
case *parse.DotNode:
case *parse.FieldNode:
case *parse.IdentifierNode:
case *parse.IfNode:
Traverse(&node.BranchNode, visitors...)
case *parse.ListNode:
if node.Nodes != nil {
for _, child := range node.Nodes {
Traverse(child, visitors...)
}
}
case *parse.NilNode:
case *parse.NumberNode:
case *parse.PipeNode:
if node.Cmds != nil {
for _, cmd := range node.Cmds {
Traverse(cmd, visitors...)
}
}
if node.Decl != nil {
for _, decl := range node.Decl {
Traverse(decl, visitors...)
}
}
case *parse.RangeNode:
Traverse(&node.BranchNode, visitors...)
case *parse.StringNode:
case *parse.TemplateNode:
if node.Pipe != nil {
Traverse(node.Pipe, visitors...)
}
case *parse.TextNode:
case *parse.VariableNode:
case *parse.WithNode:
Traverse(&node.BranchNode, visitors...)
}
}