Skip to content
Snippets Groups Projects
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 =>