@@ -16,11 +16,13 @@ trait TreeUtils
16
16
def foldTree (x : X , tree : Tree )(implicit ctx : Context ): X
17
17
def foldTypeTree (x : X , tree : TypeOrBoundsTree )(implicit ctx : Context ): X
18
18
def foldCaseDef (x : X , tree : CaseDef )(implicit ctx : Context ): X
19
+ def foldTypeCaseDef (x : X , tree : TypeCaseDef )(implicit ctx : Context ): X
19
20
def foldPattern (x : X , tree : Pattern )(implicit ctx : Context ): X
20
21
21
22
def foldTrees (x : X , trees : Iterable [Tree ])(implicit ctx : Context ): X = (x /: trees)(foldTree)
22
23
def foldTypeTrees (x : X , trees : Iterable [TypeOrBoundsTree ])(implicit ctx : Context ): X = (x /: trees)(foldTypeTree)
23
24
def foldCaseDefs (x : X , trees : Iterable [CaseDef ])(implicit ctx : Context ): X = (x /: trees)(foldCaseDef)
25
+ def foldTypeCaseDefs (x : X , trees : Iterable [TypeCaseDef ])(implicit ctx : Context ): X = (x /: trees)(foldTypeCaseDef)
24
26
def foldPatterns (x : X , trees : Iterable [Pattern ])(implicit ctx : Context ): X = (x /: trees)(foldPattern)
25
27
private def foldParents (x : X , trees : Iterable [TermOrTypeTree ])(implicit ctx : Context ): X = (x /: trees)(foldOverTermOrTypeTree)
26
28
@@ -97,13 +99,25 @@ trait TreeUtils
97
99
case TypeTree .Applied (tpt, args) => foldTypeTrees(foldTypeTree(x, tpt), args)
98
100
case TypeTree .ByName (result) => foldTypeTree(x, result)
99
101
case TypeTree .Annotated (arg, annot) => foldTree(foldTypeTree(x, arg), annot)
102
+ case TypeTree .TypeLambdaTree (typedefs, arg) => foldTrees(foldTypeTree(x, arg), typedefs)
103
+ case TypeTree .Bind (_, tbt) => foldTypeTree(x, tbt)
104
+ case TypeTree .Block (typedefs, tpt) => foldTrees(foldTypeTree(x, tpt), typedefs)
105
+ case TypeTree .MatchType (boundopt, selector, cases) => {
106
+ val bound_fold_result = boundopt.map(foldTypeTree(x, _)).getOrElse(x)
107
+ foldTypeCaseDefs(foldTypeTree(bound_fold_result, selector), cases)
108
+ }
100
109
case TypeBoundsTree (lo, hi) => foldTypeTree(foldTypeTree(x, lo), hi)
101
110
}
102
111
103
112
def foldOverCaseDef (x : X , tree : CaseDef )(implicit ctx : Context ): X = tree match {
104
113
case CaseDef (pat, guard, body) => foldTree(foldTrees(foldPattern(x, pat), guard), body)
105
114
}
106
115
116
+ def foldOverTypeCaseDef (x : X , tree : TypeCaseDef )(implicit ctx : Context ): X = tree match {
117
+ case TypeCaseDef (pat, body) => foldTypeTree(foldTypeTree(x, pat), body)
118
+ }
119
+
120
+
107
121
def foldOverPattern (x : X , tree : Pattern )(implicit ctx : Context ): X = tree match {
108
122
case Pattern .Value (v) => foldTree(x, v)
109
123
case Pattern .Bind (_, body) => foldPattern(x, body)
@@ -124,16 +138,19 @@ trait TreeUtils
124
138
def traverseTree (tree : Tree )(implicit ctx : Context ): Unit = traverseTreeChildren(tree)
125
139
def traverseTypeTree (tree : TypeOrBoundsTree )(implicit ctx : Context ): Unit = traverseTypeTreeChildren(tree)
126
140
def traverseCaseDef (tree : CaseDef )(implicit ctx : Context ): Unit = traverseCaseDefChildren(tree)
141
+ def traverseTypeCaseDef (tree : TypeCaseDef )(implicit ctx : Context ): Unit = traverseTypeCaseDefChildren(tree)
127
142
def traversePattern (tree : Pattern )(implicit ctx : Context ): Unit = traversePatternChildren(tree)
128
143
129
144
def foldTree (x : Unit , tree : Tree )(implicit ctx : Context ): Unit = traverseTree(tree)
130
145
def foldTypeTree (x : Unit , tree : TypeOrBoundsTree )(implicit ctx : Context ) = traverseTypeTree(tree)
131
146
def foldCaseDef (x : Unit , tree : CaseDef )(implicit ctx : Context ) = traverseCaseDef(tree)
147
+ def foldTypeCaseDef (x : Unit , tree : TypeCaseDef )(implicit ctx : Context ) = traverseTypeCaseDef(tree)
132
148
def foldPattern (x : Unit , tree : Pattern )(implicit ctx : Context ) = traversePattern(tree)
133
149
134
150
protected def traverseTreeChildren (tree : Tree )(implicit ctx : Context ): Unit = foldOverTree((), tree)
135
151
protected def traverseTypeTreeChildren (tree : TypeOrBoundsTree )(implicit ctx : Context ): Unit = foldOverTypeTree((), tree)
136
152
protected def traverseCaseDefChildren (tree : CaseDef )(implicit ctx : Context ): Unit = foldOverCaseDef((), tree)
153
+ protected def traverseTypeCaseDefChildren (tree : TypeCaseDef )(implicit ctx : Context ): Unit = foldOverTypeCaseDef((), tree)
137
154
protected def traversePatternChildren (tree : Pattern )(implicit ctx : Context ): Unit = foldOverPattern((), tree)
138
155
139
156
}
0 commit comments