@@ -13,13 +13,11 @@ 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 foldTypeTree (x : X , tree : TypeOrBoundsTree )(implicit ctx : Context ): X
17
16
def foldCaseDef (x : X , tree : CaseDef )(implicit ctx : Context ): X
18
17
def foldTypeCaseDef (x : X , tree : TypeCaseDef )(implicit ctx : Context ): X
19
18
def foldPattern (x : X , tree : Pattern )(implicit ctx : Context ): X
20
19
21
20
def foldTrees (x : X , trees : Iterable [Tree ])(implicit ctx : Context ): X = (x /: trees)(foldTree)
22
- def foldTypeTrees (x : X , trees : Iterable [TypeOrBoundsTree ])(implicit ctx : Context ): X = (x /: trees)(foldTypeTree)
23
21
def foldCaseDefs (x : X , trees : Iterable [CaseDef ])(implicit ctx : Context ): X = (x /: trees)(foldCaseDef)
24
22
def foldTypeCaseDefs (x : X , trees : Iterable [TypeCaseDef ])(implicit ctx : Context ): X = (x /: trees)(foldTypeCaseDef)
25
23
def foldPatterns (x : X , trees : Iterable [Pattern ])(implicit ctx : Context ): X = (x /: trees)(foldPattern)
@@ -39,13 +37,13 @@ trait TreeUtils
39
37
case Term .Apply (fun, args) =>
40
38
foldTrees(foldTree(x, fun), args)
41
39
case Term .TypeApply (fun, args) =>
42
- foldTypeTrees (foldTree(x, fun), args)
40
+ foldTrees (foldTree(x, fun), args)
43
41
case Term .Literal (const) =>
44
42
x
45
43
case Term .New (tpt) =>
46
- foldTypeTree (x, tpt)
44
+ foldTree (x, tpt)
47
45
case Term .Typed (expr, tpt) =>
48
- foldTypeTree (foldTree(x, expr), tpt)
46
+ foldTree (foldTree(x, expr), tpt)
49
47
case Term .NamedArg (_, arg) =>
50
48
foldTree(x, arg)
51
49
case Term .Assign (lhs, rhs) =>
@@ -56,94 +54,88 @@ trait TreeUtils
56
54
foldTree(foldTree(foldTree(x, cond), thenp), elsep)
57
55
case Term .Lambda (meth, tpt) =>
58
56
val a = foldTree(x, meth)
59
- tpt.fold(a)(b => foldTypeTree (a, b))
57
+ tpt.fold(a)(b => foldTree (a, b))
60
58
case Term .Match (selector, cases) =>
61
59
foldCaseDefs(foldTree(x, selector), cases)
62
60
case Term .Return (expr) =>
63
61
foldTree(x, expr)
64
62
case Term .Try (block, handler, finalizer) =>
65
63
foldTrees(foldCaseDefs(foldTree(x, block), handler), finalizer)
66
64
case Term .Repeated (elems, elemtpt) =>
67
- foldTrees(foldTypeTree (x, elemtpt), elems)
65
+ foldTrees(foldTree (x, elemtpt), elems)
68
66
case Term .Inlined (call, bindings, expansion) =>
69
67
foldTree(foldTrees(x, bindings), expansion)
70
68
case IsDefinition (vdef @ ValDef (_, tpt, rhs)) =>
71
69
implicit val ctx = localCtx(vdef)
72
- foldTrees(foldTypeTree (x, tpt), rhs)
70
+ foldTrees(foldTree (x, tpt), rhs)
73
71
case IsDefinition (ddef @ DefDef (_, tparams, vparamss, tpt, rhs)) =>
74
72
implicit val ctx = localCtx(ddef)
75
- foldTrees(foldTypeTree ((foldTrees(x, tparams) /: vparamss)(foldTrees), tpt), rhs)
73
+ foldTrees(foldTree ((foldTrees(x, tparams) /: vparamss)(foldTrees), tpt), rhs)
76
74
case IsDefinition (tdef @ TypeDef (_, rhs)) =>
77
75
implicit val ctx = localCtx(tdef)
78
- foldTypeTree (x, rhs)
76
+ foldTree (x, rhs)
79
77
case IsDefinition (cdef @ ClassDef (_, constr, parents, derived, self, body)) =>
80
78
implicit val ctx = localCtx(cdef)
81
- foldTrees(foldTrees(foldTypeTrees (foldParents(foldTree(x, constr), parents), derived), self), body)
79
+ foldTrees(foldTrees(foldTrees (foldParents(foldTree(x, constr), parents), derived), self), body)
82
80
case Import (_, expr, _) =>
83
81
foldTree(x, expr)
84
82
case IsPackageClause (clause @ PackageClause (pid, stats)) =>
85
83
foldTrees(foldTree(x, pid), stats)(clause.symbol.localContext)
84
+ case TypeTree .Inferred () => x
85
+ case TypeTree .Ident (_) => x
86
+ case TypeTree .Select (qualifier, _) => foldTree(x, qualifier)
87
+ case TypeTree .Projection (qualifier, _) => foldTree(x, qualifier)
88
+ case TypeTree .Singleton (ref) => foldTree(x, ref)
89
+ case TypeTree .Refined (tpt, refinements) => foldTrees(foldTree(x, tpt), refinements)
90
+ case TypeTree .Applied (tpt, args) => foldTrees(foldTree(x, tpt), args)
91
+ case TypeTree .ByName (result) => foldTree(x, result)
92
+ case TypeTree .Annotated (arg, annot) => foldTree(foldTree(x, arg), annot)
93
+ case TypeTree .LambdaTypeTree (typedefs, arg) => foldTree(foldTrees(x, typedefs), arg)
94
+ case TypeTree .TypeBind (_, tbt) => foldTree(x, tbt)
95
+ case TypeTree .TypeBlock (typedefs, tpt) => foldTree(foldTrees(x, typedefs), tpt)
96
+ case TypeTree .MatchType (boundopt, selector, cases) =>
97
+ foldTypeCaseDefs(foldTree(boundopt.fold(x)(foldTree(x, _)), selector), cases)
98
+ case WildcardTypeTree () => x
99
+ case TypeBoundsTree (lo, hi) => foldTree(foldTree(x, lo), hi)
86
100
}
87
101
}
88
102
89
- def foldOverTypeTree (x : X , tree : TypeOrBoundsTree )(implicit ctx : Context ): X = tree match {
90
- case TypeTree .Inferred () => x
91
- case TypeTree .Ident (_) => x
92
- case TypeTree .Select (qualifier, _) => foldTree(x, qualifier)
93
- case TypeTree .Projection (qualifier, _) => foldTypeTree(x, qualifier)
94
- case TypeTree .Singleton (ref) => foldTree(x, ref)
95
- case TypeTree .Refined (tpt, refinements) => foldTrees(foldTypeTree(x, tpt), refinements)
96
- case TypeTree .Applied (tpt, args) => foldTypeTrees(foldTypeTree(x, tpt), args)
97
- case TypeTree .ByName (result) => foldTypeTree(x, result)
98
- case TypeTree .Annotated (arg, annot) => foldTree(foldTypeTree(x, arg), annot)
99
- case TypeTree .LambdaTypeTree (typedefs, arg) => foldTypeTree(foldTrees(x, typedefs), arg)
100
- case TypeTree .TypeBind (_, tbt) => foldTypeTree(x, tbt)
101
- case TypeTree .TypeBlock (typedefs, tpt) => foldTypeTree(foldTrees(x, typedefs), tpt)
102
- case TypeTree .MatchType (boundopt, selector, cases) =>
103
- foldTypeCaseDefs(foldTypeTree(boundopt.fold(x)(foldTypeTree(x, _)), selector), cases)
104
- case WildcardTypeTree () => x
105
- case TypeBoundsTree (lo, hi) => foldTypeTree(foldTypeTree(x, lo), hi)
106
- }
107
-
108
103
def foldOverCaseDef (x : X , tree : CaseDef )(implicit ctx : Context ): X = tree match {
109
104
case CaseDef (pat, guard, body) => foldTree(foldTrees(foldPattern(x, pat), guard), body)
110
105
}
111
106
112
107
def foldOverTypeCaseDef (x : X , tree : TypeCaseDef )(implicit ctx : Context ): X = tree match {
113
- case TypeCaseDef (pat, body) => foldTypeTree(foldTypeTree (x, pat), body)
108
+ case TypeCaseDef (pat, body) => foldTree(foldTree (x, pat), body)
114
109
}
115
110
116
111
def foldOverPattern (x : X , tree : Pattern )(implicit ctx : Context ): X = tree match {
117
112
case Pattern .Value (v) => foldTree(x, v)
118
113
case Pattern .Bind (_, body) => foldPattern(x, body)
119
114
case Pattern .Unapply (fun, implicits, patterns) => foldPatterns(foldTrees(foldTree(x, fun), implicits), patterns)
120
115
case Pattern .Alternatives (patterns) => foldPatterns(x, patterns)
121
- case Pattern .TypeTest (tpt) => foldTypeTree (x, tpt)
116
+ case Pattern .TypeTest (tpt) => foldTree (x, tpt)
122
117
}
123
118
124
119
private def foldTermOrTypeTree (x : X , tree : TermOrTypeTree )(implicit ctx : Context ): X = tree match {
125
120
case IsTerm (termOrTypeTree) => foldTree(x, termOrTypeTree)
126
- case IsTypeTree (termOrTypeTree) => foldTypeTree (x, termOrTypeTree)
121
+ case IsTypeTree (termOrTypeTree) => foldTree (x, termOrTypeTree)
127
122
}
128
123
129
124
}
130
125
131
126
abstract class TreeTraverser extends TreeAccumulator [Unit ] {
132
127
133
128
def traverseTree (tree : Tree )(implicit ctx : Context ): Unit = traverseTreeChildren(tree)
134
- def traverseTypeTree (tree : TypeOrBoundsTree )(implicit ctx : Context ): Unit = traverseTypeTreeChildren(tree)
135
129
def traverseCaseDef (tree : CaseDef )(implicit ctx : Context ): Unit = traverseCaseDefChildren(tree)
136
130
def traverseTypeCaseDef (tree : TypeCaseDef )(implicit ctx : Context ): Unit = traverseTypeCaseDefChildren(tree)
137
131
def traversePattern (tree : Pattern )(implicit ctx : Context ): Unit = traversePatternChildren(tree)
138
132
139
133
def foldTree (x : Unit , tree : Tree )(implicit ctx : Context ): Unit = traverseTree(tree)
140
- def foldTypeTree (x : Unit , tree : TypeOrBoundsTree )(implicit ctx : Context ) = traverseTypeTree(tree)
141
134
def foldCaseDef (x : Unit , tree : CaseDef )(implicit ctx : Context ) = traverseCaseDef(tree)
142
135
def foldTypeCaseDef (x : Unit , tree : TypeCaseDef )(implicit ctx : Context ) = traverseTypeCaseDef(tree)
143
136
def foldPattern (x : Unit , tree : Pattern )(implicit ctx : Context ) = traversePattern(tree)
144
137
145
138
protected def traverseTreeChildren (tree : Tree )(implicit ctx : Context ): Unit = foldOverTree((), tree)
146
- protected def traverseTypeTreeChildren (tree : TypeOrBoundsTree )(implicit ctx : Context ): Unit = foldOverTypeTree((), tree)
147
139
protected def traverseCaseDefChildren (tree : CaseDef )(implicit ctx : Context ): Unit = foldOverCaseDef((), tree)
148
140
protected def traverseTypeCaseDefChildren (tree : TypeCaseDef )(implicit ctx : Context ): Unit = foldOverTypeCaseDef((), tree)
149
141
protected def traversePatternChildren (tree : Pattern )(implicit ctx : Context ): Unit = foldOverPattern((), tree)
@@ -160,6 +152,9 @@ trait TreeUtils
160
152
Import .copy(tree)(tree.impliedOnly, transformTerm(tree.expr), tree.selectors)
161
153
case IsStatement (tree) =>
162
154
transformStatement(tree)
155
+ case IsTypeTree (tree) => transformTypeTree(tree)
156
+ case IsTypeBoundsTree (tree) => tree // TODO traverse tree
157
+ case IsWildcardTypeTree (tree) => tree // TODO traverse tree
163
158
}
164
159
}
165
160
@@ -234,6 +229,7 @@ trait TreeUtils
234
229
def transformTypeOrBoundsTree (tree : TypeOrBoundsTree )(implicit ctx : Context ): TypeOrBoundsTree = tree match {
235
230
case IsTypeTree (tree) => transformTypeTree(tree)
236
231
case IsTypeBoundsTree (tree) => tree // TODO traverse tree
232
+ case IsWildcardTypeTree (tree) => tree // TODO traverse tree
237
233
}
238
234
239
235
def transformTypeTree (tree : TypeTree )(implicit ctx : Context ): TypeTree = tree match {
0 commit comments