@@ -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