Skip to content

Commit 2ac1401

Browse files
Merge pull request #5477 from poechsel/treeutils-missing-cases
Add missing cases to treeUtils (TypeLambdaTree, Bind, Block, MatchType)
2 parents 3a3d5a3 + 846196a commit 2ac1401

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

library/src/scala/tasty/reflect/TreeUtils.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ trait TreeUtils
1616
def foldTree(x: X, tree: Tree)(implicit ctx: Context): X
1717
def foldTypeTree(x: X, tree: TypeOrBoundsTree)(implicit ctx: Context): X
1818
def foldCaseDef(x: X, tree: CaseDef)(implicit ctx: Context): X
19+
def foldTypeCaseDef(x: X, tree: TypeCaseDef)(implicit ctx: Context): X
1920
def foldPattern(x: X, tree: Pattern)(implicit ctx: Context): X
2021

2122
def foldTrees(x: X, trees: Iterable[Tree])(implicit ctx: Context): X = (x /: trees)(foldTree)
2223
def foldTypeTrees(x: X, trees: Iterable[TypeOrBoundsTree])(implicit ctx: Context): X = (x /: trees)(foldTypeTree)
2324
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)
2426
def foldPatterns(x: X, trees: Iterable[Pattern])(implicit ctx: Context): X = (x /: trees)(foldPattern)
2527
private def foldParents(x: X, trees: Iterable[TermOrTypeTree])(implicit ctx: Context): X = (x /: trees)(foldOverTermOrTypeTree)
2628

@@ -97,13 +99,22 @@ trait TreeUtils
9799
case TypeTree.Applied(tpt, args) => foldTypeTrees(foldTypeTree(x, tpt), args)
98100
case TypeTree.ByName(result) => foldTypeTree(x, result)
99101
case TypeTree.Annotated(arg, annot) => foldTree(foldTypeTree(x, arg), annot)
102+
case TypeTree.TypeLambdaTree(typedefs, arg) => foldTypeTree(foldTrees(x, typedefs), arg)
103+
case TypeTree.Bind(_, tbt) => foldTypeTree(x, tbt)
104+
case TypeTree.Block(typedefs, tpt) => foldTypeTree(foldTrees(x, typedefs), tpt)
105+
case TypeTree.MatchType(boundopt, selector, cases) =>
106+
foldTypeCaseDefs(foldTypeTree(boundopt.fold(x)(foldTypeTree(x, _)), selector), cases)
100107
case TypeBoundsTree(lo, hi) => foldTypeTree(foldTypeTree(x, lo), hi)
101108
}
102109

103110
def foldOverCaseDef(x: X, tree: CaseDef)(implicit ctx: Context): X = tree match {
104111
case CaseDef(pat, guard, body) => foldTree(foldTrees(foldPattern(x, pat), guard), body)
105112
}
106113

114+
def foldOverTypeCaseDef(x: X, tree: TypeCaseDef)(implicit ctx: Context): X = tree match {
115+
case TypeCaseDef(pat, body) => foldTypeTree(foldTypeTree(x, pat), body)
116+
}
117+
107118
def foldOverPattern(x: X, tree: Pattern)(implicit ctx: Context): X = tree match {
108119
case Pattern.Value(v) => foldTree(x, v)
109120
case Pattern.Bind(_, body) => foldPattern(x, body)
@@ -124,16 +135,19 @@ trait TreeUtils
124135
def traverseTree(tree: Tree)(implicit ctx: Context): Unit = traverseTreeChildren(tree)
125136
def traverseTypeTree(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = traverseTypeTreeChildren(tree)
126137
def traverseCaseDef(tree: CaseDef)(implicit ctx: Context): Unit = traverseCaseDefChildren(tree)
138+
def traverseTypeCaseDef(tree: TypeCaseDef)(implicit ctx: Context): Unit = traverseTypeCaseDefChildren(tree)
127139
def traversePattern(tree: Pattern)(implicit ctx: Context): Unit = traversePatternChildren(tree)
128140

129141
def foldTree(x: Unit, tree: Tree)(implicit ctx: Context): Unit = traverseTree(tree)
130142
def foldTypeTree(x: Unit, tree: TypeOrBoundsTree)(implicit ctx: Context) = traverseTypeTree(tree)
131143
def foldCaseDef(x: Unit, tree: CaseDef)(implicit ctx: Context) = traverseCaseDef(tree)
144+
def foldTypeCaseDef(x: Unit, tree: TypeCaseDef)(implicit ctx: Context) = traverseTypeCaseDef(tree)
132145
def foldPattern(x: Unit, tree: Pattern)(implicit ctx: Context) = traversePattern(tree)
133146

134147
protected def traverseTreeChildren(tree: Tree)(implicit ctx: Context): Unit = foldOverTree((), tree)
135148
protected def traverseTypeTreeChildren(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = foldOverTypeTree((), tree)
136149
protected def traverseCaseDefChildren(tree: CaseDef)(implicit ctx: Context): Unit = foldOverCaseDef((), tree)
150+
protected def traverseTypeCaseDefChildren(tree: TypeCaseDef)(implicit ctx: Context): Unit = foldOverTypeCaseDef((), tree)
137151
protected def traversePatternChildren(tree: Pattern)(implicit ctx: Context): Unit = foldOverPattern((), tree)
138152

139153
}

0 commit comments

Comments
 (0)