aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeChecker.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-04-01 18:06:25 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-04-08 16:56:13 +0200
commit879a0b25f2129a1f723953f3cd8f8c82d8ff7f62 (patch)
tree8f08606d170f5b8d5f045d5639363aaa18d699fc /src/dotty/tools/dotc/transform/TreeChecker.scala
parentf573a56ddc2b4f3c55c3ce1d92903a239896b950 (diff)
downloaddotty-879a0b25f2129a1f723953f3cd8f8c82d8ff7f62.tar.gz
dotty-879a0b25f2129a1f723953f3cd8f8c82d8ff7f62.tar.bz2
dotty-879a0b25f2129a1f723953f3cd8f8c82d8ff7f62.zip
TreeCheckers use re-typing...
... to check whether tree types make sense. Still produces errors when enabled.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeChecker.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala37
1 files changed, 31 insertions, 6 deletions
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)
}
}
}