summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-05-12 07:30:19 -0700
committerPaul Phillips <paulp@improving.org>2012-05-12 08:00:54 -0700
commita9a2fd7c479eb8d68bf7e58cd0f6084a2106ca7d (patch)
tree7b938818974b17f36e3e3e9e4f3d361bef62a936
parentd55ea54589730d0980fc5a15f84ae5c3d5b3bbf6 (diff)
downloadscala-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
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala27
-rw-r--r--test/files/run/t5527.check2
-rw-r--r--test/files/specialized/SI-5005.check2
3 files changed, 27 insertions, 4 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.
diff --git a/test/files/run/t5527.check b/test/files/run/t5527.check
index bb13928fd8..1518168c51 100644
--- a/test/files/run/t5527.check
+++ b/test/files/run/t5527.check
@@ -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>() = {
diff --git a/test/files/specialized/SI-5005.check b/test/files/specialized/SI-5005.check
index 9fc63a2b1d..81e8342dad 100644
--- a/test/files/specialized/SI-5005.check
+++ b/test/files/specialized/SI-5005.check
@@ -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] = {