@@ -130,6 +130,7 @@ class TreeChecker extends Phase with SymTransformer {
130
130
assert(ctx.typerState.constraint.domainLambdas.isEmpty,
131
131
i " non-empty constraint at end of $fusedPhase: ${ctx.typerState.constraint}, ownedVars = ${ctx.typerState.ownedVars.toList}%, % " )
132
132
assertSelectWrapsNew(ctx.compilationUnit.tpdTree)
133
+ TreeNodeChecker .traverse(ctx.compilationUnit.tpdTree)
133
134
}
134
135
135
136
val checkingCtx = ctx
@@ -677,4 +678,25 @@ object TreeChecker {
677
678
tp
678
679
}
679
680
}.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
680
702
}
0 commit comments