-
Etienne Kneuss authoredEtienne Kneuss authored
PrettyPrinter.scala 14.27 KiB
/* Copyright 2009-2014 EPFL, Lausanne */
package leon
package purescala
import Common._
import Trees._
import TypeTrees._
import Definitions._
import utils._
import java.lang.StringBuffer
import PrinterHelpers._
case class PrinterContext(
current: Tree,
parent: Option[Tree],
lvl: Int,
printer: PrettyPrinter
)
object PrinterHelpers {
implicit class Printable(val f: PrinterContext => Any) extends AnyVal {
def print(ctx: PrinterContext) = f(ctx)
}
implicit class PrintingHelper(val sc: StringContext) extends AnyVal {
def p(args: Any*)(implicit ctx: PrinterContext): Unit = {
val printer = ctx.printer
val sb = printer.sb
var strings = sc.parts.iterator
var expressions = args.iterator
var extraInd = 0;
var firstElem = true;
while(strings.hasNext) {
val s = strings.next.stripMargin
// Compute indentation
var start = s.lastIndexOf('\n')
if(start >= 0 || firstElem) {
var i = start+1;
while(i < s.length && s(i) == ' ') {
i += 1
}
extraInd = (i-start-1)/2
}
firstElem = false
// Make sure new lines are also indented
sb.append(s.replaceAll("\n", "\n"+(" "*ctx.lvl)))
var nctx = ctx.copy(lvl = ctx.lvl + extraInd)
if (expressions.hasNext) {
val e = expressions.next
e match {
case (t1, t2) =>
nary(Seq(t1, t2), " -> ").print(nctx)
case ts: Seq[Any] =>
nary(ts).print(nctx)
case t: Tree =>