Permalink
Browse files

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
  • Loading branch information...
paulp committed May 12, 2012
1 parent d55ea54 commit a9a2fd7c479eb8d68bf7e58cd0f6084a2106ca7d
Showing with 27 additions and 4 deletions.
  1. +25 −2 src/compiler/scala/tools/nsc/Global.scala
  2. +1 −1 test/files/run/t5527.check
  3. +1 −1 test/files/specialized/SI-5005.check
@@ -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.
@@ -1,4 +1,4 @@
-[[syntax trees at end of parser]]// Scala source: newSource1
+[[syntax trees at end of parser]] // newSource1
package <empty> {
object UselessComments extends scala.AnyRef {
def <init>() = {
@@ -1,4 +1,4 @@
-[[syntax trees at end of specialize]]// Scala source: newSource1
+[[syntax trees at end of specialize]] // newSource1
package <empty> {
class C2[@specialized(scala.Boolean) U >: Nothing <: Any] extends Object {
def <init>(): C2[U] = {

0 comments on commit a9a2fd7

Please sign in to comment.