From 879a0b25f2129a1f723953f3cd8f8c82d8ff7f62 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 1 Apr 2014 18:06:25 +0200 Subject: TreeCheckers use re-typing... ... to check whether tree types make sense. Still produces errors when enabled. --- src/dotty/tools/dotc/transform/TreeChecker.scala | 37 ++++++++++++++++++++---- 1 file changed, 31 insertions(+), 6 deletions(-) (limited to 'src/dotty/tools/dotc/transform/TreeChecker.scala') diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala index 5913875b8..f52c5bc1c 100644 --- a/src/dotty/tools/dotc/transform/TreeChecker.scala +++ b/src/dotty/tools/dotc/transform/TreeChecker.scala @@ -12,8 +12,10 @@ import core.Constants._ import core.StdNames._ import core.Decorators._ import core.transform.Erasure.isUnboundedGeneric +import typer._ import typer.ErrorReporting._ import ast.Trees._ +import ast.{tpd, untpd} /** This transform eliminates patterns. Right now it's a dummy. * Awaiting the real pattern matcher. @@ -23,14 +25,37 @@ class TreeChecker { def check(ctx: Context) = { println(s"checking ${ctx.compilationUnit} after phase ${ctx.phase.prev}") - Checker.transform(ctx.compilationUnit.tpdTree)(ctx) + Checker.typedExpr(ctx.compilationUnit.tpdTree)(ctx) } - object Checker extends TreeMap { - override def transform(tree: Tree)(implicit ctx: Context) = { - println(i"checking $tree") - assert(tree.isEmpty || tree.hasType, tree.show) - super.transform(tree) + object Checker extends ReTyper { + override def typed(tree: untpd.Tree, pt: Type)(implicit ctx: Context) = + if (tree.isEmpty) tree.asInstanceOf[Tree] + else { + assert(tree.hasType, tree.show) + val tree1 = super.typed(tree, pt) + def sameType(tp1: Type, tp2: Type) = + (tp1 eq tp2) || // accept NoType / NoType + (tp1 =:= tp2) + def divergenceMsg = + s"""Types differ + |Original type : ${tree.typeOpt.show} + |After checking: ${tree1.tpe.show} + |Original tree : ${tree.show} + |After checking: ${tree1.show} + """.stripMargin + assert(sameType(tree1.tpe, tree.typeOpt), divergenceMsg) + tree1 + } + + override def typedIdent(tree: untpd.Ident, pt: Type)(implicit ctx: Context): Tree = { + assert(tree.isTerm, tree.show) + super.typedIdent(tree, pt) + } + + override def typedSelect(tree: untpd.Select, pt: Type)(implicit ctx: Context): Tree = { + assert(tree.isTerm, tree.show) + super.typedSelect(tree, pt) } } } -- cgit v1.2.3