Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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 a9a2fd7
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 4 deletions.
27 changes: 25 additions & 2 deletions src/compiler/scala/tools/nsc/Global.scala
Expand Up @@ -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) = {
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion 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>() = {
Expand Down
2 changes: 1 addition & 1 deletion 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] = {
Expand Down

0 comments on commit a9a2fd7

Please sign in to comment.