aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeChecker.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-09-21 14:50:01 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-09-24 13:15:28 +0200
commit112d08118b5f892ba98a465ef8cf8896448245f8 (patch)
treeee204d7447d765c35bedaf1b54ffbdb8e86a1c73 /src/dotty/tools/dotc/transform/TreeChecker.scala
parent23064fce9629fdf001c3138fcd8c87ba4a398a37 (diff)
downloaddotty-112d08118b5f892ba98a465ef8cf8896448245f8.tar.gz
dotty-112d08118b5f892ba98a465ef8cf8896448245f8.tar.bz2
dotty-112d08118b5f892ba98a465ef8cf8896448245f8.zip
More accurate or postcondition conchecking in TreeChecker
Previous postcondition checking did not take into account that phases are not flat - they consist in part of macro phases that contain miniphases. In fact the whole set up in Run is dubiuos - we should eliminate the problem at the root, as described in the TODO in run.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeChecker.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index 6d6a88e36..cf32df61b 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -35,11 +35,23 @@ import java.lang.AssertionError
class TreeChecker {
import ast.tpd._
+ private def previousPhases(phases: List[Phase])(implicit ctx: Context): List[Phase] = phases match {
+ case (phase: TreeTransformer) :: phases1 =>
+ val subPhases = phase.transformations.map(_.phase)
+ val previousSubPhases = previousPhases(subPhases.toList)
+ if (previousSubPhases.length == subPhases.length) previousSubPhases ::: previousPhases(phases1)
+ else previousSubPhases
+ case phase :: phases1 if phase ne ctx.phase =>
+ phase :: previousPhases(phases1)
+ case _ =>
+ Nil
+ }
+
def check(phasesToRun: Seq[Phase], ctx: Context) = {
println(s"checking ${ctx.compilationUnit} after phase ${ctx.phase.prev}")
val checkingCtx = ctx.fresh
.setTyperState(ctx.typerState.withReporter(new ThrowingReporter(ctx.typerState.reporter)))
- val checker = new Checker(phasesToRun.takeWhile(_ ne ctx.phase))
+ val checker = new Checker(previousPhases(phasesToRun.toList)(ctx))
checker.typedExpr(ctx.compilationUnit.tpdTree)(checkingCtx)
}