diff options
author | Paul Phillips <paulp@improving.org> | 2012-05-12 07:30:19 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-05-12 08:00:54 -0700 |
commit | a9a2fd7c479eb8d68bf7e58cd0f6084a2106ca7d (patch) | |
tree | 7b938818974b17f36e3e3e9e4f3d361bef62a936 /src/compiler | |
parent | d55ea54589730d0980fc5a15f84ae5c3d5b3bbf6 (diff) | |
download | scala-a9a2fd7c479eb8d68bf7e58cd0f6084a2106ca7d.tar.gz scala-a9a2fd7c479eb8d68bf7e58cd0f6084a2106ca7d.tar.bz2 scala-a9a2fd7c479eb8d68bf7e58cd0f6084a2106ca7d.zip |
Clutch modification to tree printing.
Don't print trees under -Xprint:all if they're identical to the
tree printed at the previous phase. It only works for a single
compilation unit but that is a huge step forward for us debuggers.
For instance this file:
trait Foo { def f = 5 }
used to produce 332 lines of output and now produces 92, with
zero loss of information. It ends with:
[[syntax trees at end of cleanup]] // a.scala: tree is unchanged since mixin
[[syntax trees at end of icode]] // a.scala: tree is unchanged since mixin
[[syntax trees at end of inliner]] // a.scala: tree is unchanged since mixin
[[syntax trees at end of inlineExceptionHandlers]] // a.scala: tree is unchanged since mixin
[[syntax trees at end of closelim]] // a.scala: tree is unchanged since mixin
[[syntax trees at end of dce]] // a.scala: tree is unchanged since mixin
[[syntax trees at end of jvm]] // a.scala: tree is unchanged since mixin
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/Global.scala | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index de270a76f1..49a644ba3a 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -130,7 +130,28 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb object nodePrinters extends { val global: Global.this.type = Global.this } with NodePrinters { + var lastPrintedPhase: Phase = NoPhase + var lastPrintedSource: String = "" infolevel = InfoLevel.Verbose + + def showUnit(unit: CompilationUnit) { + print(" // " + unit.source) + if (unit.body == null) println(": tree is null") + else { + val source = util.stringFromWriter(w => newTreePrinter(w) print unit.body) + + // treePrinter show unit.body + if (lastPrintedSource == source) + println(": tree is unchanged since " + lastPrintedPhase) + else { + lastPrintedPhase = phase.prev // since we're running inside "afterPhase" + lastPrintedSource = source + println("") + println(source) + println("") + } + } + } } def withInfoLevel[T](infolevel: nodePrinters.InfoLevel.Value)(op: => T) = { @@ -1588,8 +1609,10 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb } // class Run def printAllUnits() { - print("[[syntax trees at end of " + phase + "]]") - afterPhase(phase) { currentRun.units foreach (treePrinter.print(_)) } + print("[[syntax trees at end of %25s]]".format(phase)) + afterPhase(phase)(currentRun.units foreach { unit => + nodePrinters showUnit unit + }) } /** We resolve the class/object ambiguity by passing a type/term name. |