Skip to content

Commit 0f6bcd3

Browse files
Merge pull request #14752 from dwijnand/fix-#1023
Test that TypeTrees are not in an unexpected tree
2 parents f2626de + 8f5ee23 commit 0f6bcd3

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,6 +1657,7 @@ object Trees {
16571657

16581658
abstract class TreeTraverser extends TreeAccumulator[Unit] {
16591659
def traverse(tree: Tree)(using Context): Unit
1660+
def traverse(trees: List[Tree])(using Context) = apply((), trees)
16601661
def apply(x: Unit, tree: Tree)(using Context): Unit = traverse(tree)
16611662
protected def traverseChildren(tree: Tree)(using Context): Unit = foldOver((), tree)
16621663
}

compiler/src/dotty/tools/dotc/transform/TreeChecker.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ class TreeChecker extends Phase with SymTransformer {
130130
assert(ctx.typerState.constraint.domainLambdas.isEmpty,
131131
i"non-empty constraint at end of $fusedPhase: ${ctx.typerState.constraint}, ownedVars = ${ctx.typerState.ownedVars.toList}%, %")
132132
assertSelectWrapsNew(ctx.compilationUnit.tpdTree)
133+
TreeNodeChecker.traverse(ctx.compilationUnit.tpdTree)
133134
}
134135

135136
val checkingCtx = ctx
@@ -677,4 +678,25 @@ object TreeChecker {
677678
tp
678679
}
679680
}.apply(tp0)
681+
682+
/** Run some additional checks on the nodes of the trees. Specifically:
683+
*
684+
* - TypeTree can only appear in TypeApply args, New, Typed tpt, Closure
685+
* tpt, SeqLiteral elemtpt, ValDef tpt, DefDef tpt, and TypeDef rhs.
686+
*/
687+
object TreeNodeChecker extends untpd.TreeTraverser:
688+
import untpd._
689+
def traverse(tree: Tree)(using Context) = tree match
690+
case t: TypeTree => assert(assertion = false, i"TypeTree not expected: $t")
691+
case t @ TypeApply(fun, _targs) => traverse(fun)
692+
case t @ New(_tpt) =>
693+
case t @ Typed(expr, _tpt) => traverse(expr)
694+
case t @ Closure(env, meth, _tpt) => traverse(env); traverse(meth)
695+
case t @ SeqLiteral(elems, _elemtpt) => traverse(elems)
696+
case t @ ValDef(_, _tpt, _) => traverse(t.rhs)
697+
case t @ DefDef(_, paramss, _tpt, _) => for params <- paramss do traverse(params); traverse(t.rhs)
698+
case t @ TypeDef(_, _rhs) =>
699+
case t @ Template(constr, parents, self, _) => traverse(constr); traverse(parents); traverse(self); traverse(t.body)
700+
case t => traverseChildren(t)
701+
end traverse
680702
}

0 commit comments

Comments
 (0)