@@ -306,7 +306,7 @@ class TreeChecker extends Phase with SymTransformer {
306
306
sym.isEffectivelyErased && sym.is(Private ) && ! sym.initial.is(Private )
307
307
308
308
override def typed (tree : untpd.Tree , pt : Type = WildcardType )(using Context ): Tree = {
309
- checkTreeNode (tree)
309
+ TreeNodeChecker .run (tree)
310
310
val tpdTree = super .typed(tree, pt)
311
311
Typer .assertPositioned(tree)
312
312
if (ctx.erasedTypes)
@@ -648,102 +648,21 @@ object TreeChecker {
648
648
}
649
649
}.apply(tp0)
650
650
651
- private val PrivateErased = allOf(Private , Erased )
652
-
653
651
/** Check that the tree only contains legal children trees */
654
- def checkTreeNode (tree : untpd.Tree )(implicit ctx : Context ): Unit = {
655
- def assertNotTypeTree (t : untpd.Tree ): Unit = assert(! t.isInstanceOf [untpd.TypeTree ], tree)
656
-
657
- // TODO add many more sanity checks
658
- tree match {
659
- // case Ident(name) =>
660
- case Select (qualifier, name) =>
661
- // FIXME this assertion fails only in tests/run/scala2trait-lazyval.scala
662
- // assertNotTypeTree(qual)
663
- // case This(qual) =>
664
- //
665
- // case Super(qual, mix) =>
666
- case Apply (fun, args) =>
667
- assertNotTypeTree(fun)
668
- for (arg <- args) {
669
- assertNotTypeTree(arg)
670
- }
671
- case TypeApply (fun, args) =>
672
- assertNotTypeTree(fun)
673
- // case Literal(const) =>
674
- //
675
- // case New(tpt) =>
676
- case Typed (expr, tpt) =>
677
- assertNotTypeTree(expr)
678
- // case NamedArg(name, arg) =>
679
- case Assign (lhs, rhs) =>
680
- assertNotTypeTree(lhs)
681
- assertNotTypeTree(rhs)
682
- case Block (stats, expr) =>
683
- for (stat <- stats) {
684
- assertNotTypeTree(stat)
685
- }
686
- assertNotTypeTree(expr)
687
- case If (cond, thenp, elsep) =>
688
- assertNotTypeTree(cond)
689
- assertNotTypeTree(thenp)
690
- assertNotTypeTree(elsep)
691
- // case Closure(env, meth, tpt) =>
692
- case Match (selector, cases) =>
693
- assertNotTypeTree(selector)
694
- case CaseDef (pat, guard, body) =>
695
- assertNotTypeTree(guard)
696
- assertNotTypeTree(body)
697
- case Return (expr, from) =>
698
- assertNotTypeTree(expr)
699
- case Try (block, handler, finalizer) =>
700
- assertNotTypeTree(block)
701
- assertNotTypeTree(finalizer)
702
- case SeqLiteral (elems, elemtpt) =>
703
- for (elem <- elems) {
704
- assertNotTypeTree(elem)
705
- }
706
- case Inlined (call, bindings, expansion) =>
707
- assertNotTypeTree(call)
708
- // case TypeTree() =>
709
- //
710
- // case SingletonTypeTree(ref) =>
711
- //
712
- // case AndTypeTree(left, right) =>
713
- //
714
- // case OrTypeTree(left, right) =>
715
- //
716
- // case RefinedTypeTree(tpt, refinements) =>
717
- //
718
- // case AppliedTypeTree(tpt, args) =>
719
- //
720
- // case LambdaTypeTree(tparams, body) =>
721
- //
722
- // case ByNameTypeTree(result) =>
723
- //
724
- // case TypeBoundsTree(lo, hi) =>
725
- //
726
- // case Bind(name, body) =>
727
- //
728
- // case Alternative(trees) =>
729
- //
730
- // case UnApply(fun, implicits, patterns) =>
731
- case tree @ ValDef (name, tpt, _) =>
732
- assertNotTypeTree(tree.rhs)
733
- case tree @ DefDef (name, tparams, vparamss, tpt, _) =>
734
- assertNotTypeTree(tree.rhs)
735
- // case TypeDef(name, rhs) =>
736
- //
737
- // case tree @ Template(constr, parents, self, _) =>
738
- //
739
- // case Import(expr, selectors) =>
740
- //
741
- // case PackageDef(pid, stats) =>
742
- //
743
- // case Annotated(arg, annot) =>
744
- //
745
- // case Thicket(ts) =>
746
- case _ =>
747
- }
748
- }
652
+ object TreeNodeChecker extends untpd.TreeTraverser :
653
+ import untpd ._
654
+ def run (tree : Tree )(using Context ) = if ! tree.isInstanceOf [TypeTree ] then traverse(tree)
655
+ def traverse (tree : Tree )(using Context ) = tree match
656
+ case t : TypeTree => assert(assertion = false , t)
657
+ case t @ TypeApply (fun, _targs) => traverse(fun)
658
+ case t @ New (_tpt) =>
659
+ case t @ Typed (expr, _tpt) => traverse(expr)
660
+ case t @ Closure (env, meth, _tpt) => traverse(env); traverse(meth)
661
+ case t @ SeqLiteral (elems, _elemtpt) => traverse(elems)
662
+ case t @ ValDef (_, _tpt, _) => traverse(t.rhs)
663
+ case t @ DefDef (_, paramss, _tpt, _) => for params <- paramss do traverse(params); traverse(t.rhs)
664
+ case t @ TypeDef (_, _rhs) =>
665
+ case t @ Template (constr, _parents, self, _) => traverse(constr); traverse(self); traverse(t.body)
666
+ case t => traverseChildren(t)
667
+ end traverse
749
668
}
0 commit comments