@@ -13,13 +13,9 @@ trait TreeUtils
13
13
14
14
// Ties the knot of the traversal: call `foldOver(x, tree))` to dive in the `tree` node.
15
15
def foldTree (x : X , tree : Tree )(implicit ctx : Context ): X
16
- def foldCaseDef (x : X , tree : CaseDef )(implicit ctx : Context ): X
17
- def foldTypeCaseDef (x : X , tree : TypeCaseDef )(implicit ctx : Context ): X
18
16
def foldPattern (x : X , tree : Pattern )(implicit ctx : Context ): X
19
17
20
18
def foldTrees (x : X , trees : Iterable [Tree ])(implicit ctx : Context ): X = (x /: trees)(foldTree)
21
- def foldCaseDefs (x : X , trees : Iterable [CaseDef ])(implicit ctx : Context ): X = (x /: trees)(foldCaseDef)
22
- def foldTypeCaseDefs (x : X , trees : Iterable [TypeCaseDef ])(implicit ctx : Context ): X = (x /: trees)(foldTypeCaseDef)
23
19
def foldPatterns (x : X , trees : Iterable [Pattern ])(implicit ctx : Context ): X = (x /: trees)(foldPattern)
24
20
25
21
def foldOverTree (x : X , tree : Tree )(implicit ctx : Context ): X = {
@@ -55,11 +51,11 @@ trait TreeUtils
55
51
val a = foldTree(x, meth)
56
52
tpt.fold(a)(b => foldTree(a, b))
57
53
case Term .Match (selector, cases) =>
58
- foldCaseDefs (foldTree(x, selector), cases)
54
+ foldTrees (foldTree(x, selector), cases)
59
55
case Term .Return (expr) =>
60
56
foldTree(x, expr)
61
57
case Term .Try (block, handler, finalizer) =>
62
- foldTrees(foldCaseDefs (foldTree(x, block), handler), finalizer)
58
+ foldTrees(foldTrees (foldTree(x, block), handler), finalizer)
63
59
case Term .Repeated (elems, elemtpt) =>
64
60
foldTrees(foldTree(x, elemtpt), elems)
65
61
case Term .Inlined (call, bindings, expansion) =>
@@ -93,20 +89,14 @@ trait TreeUtils
93
89
case TypeTree .TypeBind (_, tbt) => foldTree(x, tbt)
94
90
case TypeTree .TypeBlock (typedefs, tpt) => foldTree(foldTrees(x, typedefs), tpt)
95
91
case TypeTree .MatchType (boundopt, selector, cases) =>
96
- foldTypeCaseDefs (foldTree(boundopt.fold(x)(foldTree(x, _)), selector), cases)
92
+ foldTrees (foldTree(boundopt.fold(x)(foldTree(x, _)), selector), cases)
97
93
case WildcardTypeTree () => x
98
94
case TypeBoundsTree (lo, hi) => foldTree(foldTree(x, lo), hi)
95
+ case CaseDef (pat, guard, body) => foldTree(foldTrees(foldPattern(x, pat), guard), body)
96
+ case TypeCaseDef (pat, body) => foldTree(foldTree(x, pat), body)
99
97
}
100
98
}
101
99
102
- def foldOverCaseDef (x : X , tree : CaseDef )(implicit ctx : Context ): X = tree match {
103
- case CaseDef (pat, guard, body) => foldTree(foldTrees(foldPattern(x, pat), guard), body)
104
- }
105
-
106
- def foldOverTypeCaseDef (x : X , tree : TypeCaseDef )(implicit ctx : Context ): X = tree match {
107
- case TypeCaseDef (pat, body) => foldTree(foldTree(x, pat), body)
108
- }
109
-
110
100
def foldOverPattern (x : X , tree : Pattern )(implicit ctx : Context ): X = tree match {
111
101
case Pattern .Value (v) => foldTree(x, v)
112
102
case Pattern .Bind (_, body) => foldPattern(x, body)
@@ -120,18 +110,12 @@ trait TreeUtils
120
110
abstract class TreeTraverser extends TreeAccumulator [Unit ] {
121
111
122
112
def traverseTree (tree : Tree )(implicit ctx : Context ): Unit = traverseTreeChildren(tree)
123
- def traverseCaseDef (tree : CaseDef )(implicit ctx : Context ): Unit = traverseCaseDefChildren(tree)
124
- def traverseTypeCaseDef (tree : TypeCaseDef )(implicit ctx : Context ): Unit = traverseTypeCaseDefChildren(tree)
125
113
def traversePattern (tree : Pattern )(implicit ctx : Context ): Unit = traversePatternChildren(tree)
126
114
127
115
def foldTree (x : Unit , tree : Tree )(implicit ctx : Context ): Unit = traverseTree(tree)
128
- def foldCaseDef (x : Unit , tree : CaseDef )(implicit ctx : Context ) = traverseCaseDef(tree)
129
- def foldTypeCaseDef (x : Unit , tree : TypeCaseDef )(implicit ctx : Context ) = traverseTypeCaseDef(tree)
130
116
def foldPattern (x : Unit , tree : Pattern )(implicit ctx : Context ) = traversePattern(tree)
131
117
132
118
protected def traverseTreeChildren (tree : Tree )(implicit ctx : Context ): Unit = foldOverTree((), tree)
133
- protected def traverseCaseDefChildren (tree : CaseDef )(implicit ctx : Context ): Unit = foldOverCaseDef((), tree)
134
- protected def traverseTypeCaseDefChildren (tree : TypeCaseDef )(implicit ctx : Context ): Unit = foldOverTypeCaseDef((), tree)
135
119
protected def traversePatternChildren (tree : Pattern )(implicit ctx : Context ): Unit = foldOverPattern((), tree)
136
120
137
121
}
@@ -149,6 +133,10 @@ trait TreeUtils
149
133
case IsTypeTree (tree) => transformTypeTree(tree)
150
134
case IsTypeBoundsTree (tree) => tree // TODO traverse tree
151
135
case IsWildcardTypeTree (tree) => tree // TODO traverse tree
136
+ case IsCaseDef (tree) =>
137
+ transformCaseDef(tree)
138
+ case IsTypeCaseDef (tree) =>
139
+ transformTypeCaseDef(tree)
152
140
}
153
141
}
154
142
0 commit comments