diff --git a/src/main/scala/leon/purescala/ScalaPrinter.scala b/src/main/scala/leon/purescala/ScalaPrinter.scala index aa192763ce38c1af2a375f00a806fd0ccca0cf13..c2ef2fd313b745da8efb4f62a8a62971ad682208 100644 --- a/src/main/scala/leon/purescala/ScalaPrinter.scala +++ b/src/main/scala/leon/purescala/ScalaPrinter.scala @@ -10,60 +10,56 @@ object ScalaPrinter { import java.lang.StringBuffer def apply(tree: Expr): String = { - val retSB = pp(tree, new StringBuffer, 0) + val retSB = new StringBuffer + pp(tree, retSB, 0) retSB.toString } def apply(tpe: TypeTree): String = { - val retSB = pp(tpe, new StringBuffer, 0) + val retSB = new StringBuffer + pp(tpe, retSB, 0) retSB.toString } def apply(defn: Definition): String = { - val retSB = pp(defn, new StringBuffer, 0) + val retSB = new StringBuffer + pp(defn, retSB, 0) retSB.toString } - private def ind(sb: StringBuffer, lvl: Int) : StringBuffer = { - sb.append(" " * lvl) - sb + private def ind(sb: StringBuffer, lvl: Int) { + sb.append(" " * lvl) } // EXPRESSIONS // all expressions are printed in-line - private def ppUnary(sb: StringBuffer, expr: Expr, op1: String, op2: String, lvl: Int): StringBuffer = { - var nsb: StringBuffer = sb - nsb.append(op1) - nsb = pp(expr, nsb, lvl) - nsb.append(op2) - nsb + private def ppUnary(sb: StringBuffer, expr: Expr, op1: String, op2: String, lvl: Int) { + sb.append(op1) + pp(expr, sb, lvl) + sb.append(op2) } - private def ppBinary(sb: StringBuffer, left: Expr, right: Expr, op: String, lvl: Int): StringBuffer = { - var nsb: StringBuffer = sb - nsb.append("(") - nsb = pp(left, nsb, lvl) - nsb.append(op) - nsb = pp(right, nsb, lvl) - nsb.append(")") - nsb + private def ppBinary(sb: StringBuffer, left: Expr, right: Expr, op: String, lvl: Int) { + sb.append("(") + pp(left, sb, lvl) + sb.append(op) + pp(right, sb, lvl) + sb.append(")") } - private def ppNary(sb: StringBuffer, exprs: Seq[Expr], pre: String, op: String, post: String, lvl: Int): StringBuffer = { - var nsb = sb - nsb.append(pre) + private def ppNary(sb: StringBuffer, exprs: Seq[Expr], pre: String, op: String, post: String, lvl: Int) { + sb.append(pre) val sz = exprs.size var c = 0 exprs.foreach(ex => { - nsb = pp(ex, nsb, lvl) ; c += 1 ; if(c < sz) nsb.append(op) + pp(ex, sb, lvl) ; c += 1 ; if(c < sz) sb.append(op) }) - nsb.append(post) - nsb + sb.append(post) } - private def pp(tree: Expr, sb: StringBuffer, lvl: Int): StringBuffer = tree match { + private def pp(tree: Expr, sb: StringBuffer, lvl: Int): Unit = tree match { case Variable(id) => sb.append(id) case DeBruijnIndex(idx) => sys.error("Not Valid Scala") case LetTuple(ids,d,e) => { @@ -86,7 +82,6 @@ object ScalaPrinter { ind(sb, lvl) sb.append("}\n") ind(sb, lvl) - sb } case Let(b,d,e) => { sb.append("locally {\n") @@ -100,7 +95,6 @@ object ScalaPrinter { ind(sb, lvl) sb.append("}\n") ind(sb, lvl) - sb } case LetVar(b,d,e) => { sb.append("locally {\n") @@ -114,7 +108,6 @@ object ScalaPrinter { ind(sb, lvl) sb.append("}\n") ind(sb, lvl) - sb } case LetDef(fd,e) => { sb.append("\n") @@ -123,7 +116,6 @@ object ScalaPrinter { sb.append("\n") ind(sb, lvl) pp(e, sb, lvl) - sb } case And(exprs) => ppNary(sb, exprs, "(", " && ", ")", lvl) // \land case Or(exprs) => ppNary(sb, exprs, "(", " || ", ")", lvl) // \lor @@ -145,7 +137,6 @@ object ScalaPrinter { }) ind(sb, lvl) sb.append("}\n") - sb } case Assignment(lhs, rhs) => ppBinary(sb, lhs.toVariable, rhs, " = ", lvl) case wh@While(cond, body) => { @@ -172,60 +163,50 @@ object ScalaPrinter { case s@TupleSelect(t, i) => { pp(t, sb, lvl) sb.append("._" + i) - sb } case e@Epsilon(pred) => sys.error("Not Scala Code") case Waypoint(i, expr) => pp(expr, sb, lvl) case OptionSome(a) => { - var nsb = sb - nsb.append("Some(") - nsb = pp(a, nsb, lvl) - nsb.append(")") - nsb + sb.append("Some(") + pp(a, sb, lvl) + sb.append(")") } case OptionNone(_) => sb.append("None") case CaseClass(cd, args) => { - var nsb = sb - nsb.append(cd.id) - nsb = ppNary(nsb, args, "(", ", ", ")", lvl) - nsb + sb.append(cd.id) + ppNary(sb, args, "(", ", ", ")", lvl) } case CaseClassInstanceOf(cd, e) => { - var nsb = sb - nsb = pp(e, nsb, lvl) - nsb.append(".isInstanceOf[" + cd.id + "]") - nsb + pp(e, sb, lvl) + sb.append(".isInstanceOf[" + cd.id + "]") } - case CaseClassSelector(_, cc, id) => pp(cc, sb, lvl).append("." + id) + case CaseClassSelector(_, cc, id) => + pp(cc, sb, lvl) + sb.append("." + id) case FunctionInvocation(fd, args) => { - var nsb = sb - nsb.append(fd.id) - nsb = ppNary(nsb, args, "(", ", ", ")", lvl) - nsb + sb.append(fd.id) + ppNary(sb, args, "(", ", ", ")", lvl) } case AnonymousFunction(es, ev) => { - var nsb = sb - nsb.append("{") + sb.append("{") es.foreach { case (as, res) => - nsb = ppNary(nsb, as, "", " ", "", lvl) - nsb.append(" -> ") - nsb = pp(res, nsb, lvl) - nsb.append(", ") + ppNary(sb, as, "", " ", "", lvl) + sb.append(" -> ") + pp(res, sb, lvl) + sb.append(", ") } - nsb.append("else -> ") - nsb = pp(ev, nsb, lvl) - nsb.append("}") + sb.append("else -> ") + pp(ev, sb, lvl) + sb.append("}") } case AnonymousFunctionInvocation(id, args) => { - var nsb = sb - nsb.append(id) - nsb = ppNary(nsb, args, "(", ", ", ")", lvl) - nsb + sb.append(id) + ppNary(sb, args, "(", ", ", ")", lvl) } case Plus(l,r) => ppBinary(sb, l, r, " + ", lvl) case Minus(l,r) => ppBinary(sb, l, r, " - ", lvl) @@ -244,8 +225,12 @@ object ScalaPrinter { //case ElementOfSet(s,e) => ppBinary(sb, s, e, " \u2208 ", lvl) // \in //case SubsetOf(l,r) => ppBinary(sb, l, r, " \u2286 ", lvl) // \subseteq //case Not(SubsetOf(l,r)) => ppBinary(sb, l, r, " \u2288 ", lvl) // \notsubseteq - case SetMin(s) => pp(s, sb, lvl).append(".min") - case SetMax(s) => pp(s, sb, lvl).append(".max") + case SetMin(s) => + pp(s, sb, lvl) + sb.append(".min") + case SetMax(s) => + pp(s, sb, lvl) + sb.append(".max") // case SetUnion(l,r) => ppBinary(sb, l, r, " \u222A ", lvl) // \cup // case MultisetUnion(l,r) => ppBinary(sb, l, r, " \u222A ", lvl) // \cup // case MapUnion(l,r) => ppBinary(sb, l, r, " \u222A ", lvl) // \cup @@ -261,17 +246,13 @@ object ScalaPrinter { case SingletonMap(f,t) => ppBinary(sb, f, t, " -> ", lvl) case FiniteMap(rs) => ppNary(sb, rs, "Map(", ", ", ")", lvl) case MapGet(m,k) => { - var nsb = sb - pp(m, nsb, lvl) - nsb = ppNary(nsb, Seq(k), "(", ",", ")", lvl) - nsb + pp(m, sb, lvl) + ppNary(sb, Seq(k), "(", ",", ")", lvl) } case MapIsDefinedAt(m,k) => { - var nsb = sb - pp(m, nsb, lvl) - nsb.append(".isDefinedAt") - nsb = ppNary(nsb, Seq(k), "(", ",", ")", lvl) - nsb + pp(m, sb, lvl) + sb.append(".isDefinedAt") + ppNary(sb, Seq(k), "(", ",", ")", lvl) } case ArrayLength(a) => { pp(a, sb, lvl) @@ -315,71 +296,63 @@ object ScalaPrinter { } case Distinct(exprs) => { - var nsb = sb - nsb.append("distinct") - nsb = ppNary(nsb, exprs, "(", ", ", ")", lvl) - nsb + sb.append("distinct") + ppNary(sb, exprs, "(", ", ", ")", lvl) } case IfExpr(c, t, e) => { - var nsb = sb - nsb.append("(if (") - nsb = pp(c, nsb, lvl) - nsb.append(")\n") - ind(nsb, lvl+1) - nsb = pp(t, nsb, lvl+1) - nsb.append("\n") - ind(nsb, lvl) - nsb.append("else\n") - ind(nsb, lvl+1) - nsb = pp(e, nsb, lvl+1) - nsb.append(")") - nsb + sb.append("(if (") + pp(c, sb, lvl) + sb.append(")\n") + ind(sb, lvl+1) + pp(t, sb, lvl+1) + sb.append("\n") + ind(sb, lvl) + sb.append("else\n") + ind(sb, lvl+1) + pp(e, sb, lvl+1) + sb.append(")") } case Choose(ids, pred) => { - var nsb = sb - nsb.append("(choose { (") + sb.append("(choose { (") for (((id, tpe), i) <- ids.map(id => (id, id.getType)).zipWithIndex) { - nsb.append(id.toString+": ") - nsb = pp(tpe, nsb, lvl) + sb.append(id.toString+": ") + pp(tpe, sb, lvl) if (i != ids.size-1) { - nsb.append(", ") + sb.append(", ") } } - nsb.append(") =>\n") - ind(nsb, lvl+1) - nsb = pp(pred, nsb, lvl+1) - nsb.append("\n") - ind(nsb, lvl) - nsb.append("})") - nsb + sb.append(") =>\n") + ind(sb, lvl+1) + pp(pred, sb, lvl+1) + sb.append("\n") + ind(sb, lvl) + sb.append("})") } case mex @ MatchExpr(s, csc) => { - def ppc(sb: StringBuffer, p: Pattern): StringBuffer = p match { + def ppc(sb: StringBuffer, p: Pattern): Unit = p match { //case InstanceOfPattern(None, ctd) => //case InstanceOfPattern(Some(id), ctd) => case CaseClassPattern(bndr, ccd, subps) => { - var nsb = sb - bndr.foreach(b => nsb.append(b + " @ ")) - nsb.append(ccd.id).append("(") + bndr.foreach(b => sb.append(b + " @ ")) + sb.append(ccd.id).append("(") var c = 0 val sz = subps.size subps.foreach(sp => { - nsb = ppc(nsb, sp) + ppc(sb, sp) if(c < sz - 1) - nsb.append(", ") + sb.append(", ") c = c + 1 }) - nsb.append(")") + sb.append(")") } case WildcardPattern(None) => sb.append("_") case WildcardPattern(Some(id)) => sb.append(id) case InstanceOfPattern(bndr, ccd) => { - var nsb = sb - bndr.foreach(b => nsb.append(b + " : ")) - nsb.append(ccd.id) + bndr.foreach(b => sb.append(b + " : ")) + sb.append(ccd.id) } case TuplePattern(bndr, subPatterns) => { bndr.foreach(b => sb.append(b + " @ ")) @@ -394,30 +367,29 @@ object ScalaPrinter { case _ => sb.append("Pattern?") } - var nsb = sb - nsb.append("(") - nsb == pp(s, nsb, lvl) + sb.append("(") + pp(s, sb, lvl) // if(mex.posInfo != "") { - // nsb.append(" match@(" + mex.posInfo + ") {\n") + // sb.append(" match@(" + mex.posInfo + ") {\n") // } else { - nsb.append(" match {\n") + sb.append(" match {\n") // } csc.foreach(cs => { - ind(nsb, lvl+1) - nsb.append("case ") - nsb = ppc(nsb, cs.pattern) + ind(sb, lvl+1) + sb.append("case ") + ppc(sb, cs.pattern) cs.theGuard.foreach(g => { - nsb.append(" if ") - nsb = pp(g, nsb, lvl+1) + sb.append(" if ") + pp(g, sb, lvl+1) }) - nsb.append(" => ") - nsb = pp(cs.rhs, nsb, lvl+1) - nsb.append("\n") + sb.append(" => ") + pp(cs.rhs, sb, lvl+1) + sb.append("\n") }) - ind(nsb, lvl).append("}") - nsb.append(")") - nsb + ind(sb, lvl) + sb.append("}") + sb.append(")") } case ResultVariable() => sb.append("res") @@ -425,11 +397,9 @@ object ScalaPrinter { case Not(expr) => ppUnary(sb, expr, "!(", ")", lvl) // \neg case e @ Error(desc) => { - var nsb = sb - nsb.append("leon.Utils.error[") - nsb = pp(e.getType, nsb, lvl) - nsb.append("](\"" + desc + "\")") - nsb + sb.append("leon.Utils.error[") + pp(e.getType, sb, lvl) + sb.append("](\"" + desc + "\")") } case _ => sb.append("Expr?") @@ -437,38 +407,52 @@ object ScalaPrinter { // TYPE TREES // all type trees are printed in-line - private def ppNaryType(sb: StringBuffer, tpes: Seq[TypeTree], pre: String, op: String, post: String, lvl: Int): StringBuffer = { - var nsb = sb - nsb.append(pre) + private def ppNaryType(sb: StringBuffer, tpes: Seq[TypeTree], pre: String, op: String, post: String, lvl: Int) = { + sb.append(pre) val sz = tpes.size var c = 0 tpes.foreach(t => { - nsb = pp(t, nsb, lvl) ; c += 1 ; if(c < sz) nsb.append(op) + pp(t, sb, lvl) ; c += 1 ; if(c < sz) sb.append(op) }) - nsb.append(post) - nsb + sb.append(post) } - private def pp(tpe: TypeTree, sb: StringBuffer, lvl: Int): StringBuffer = tpe match { + private def pp(tpe: TypeTree, sb: StringBuffer, lvl: Int): Unit = tpe match { case Untyped => sb.append("???") case UnitType => sb.append("Unit") case Int32Type => sb.append("Int") case BooleanType => sb.append("Boolean") - case ArrayType(bt) => pp(bt, sb.append("Array["), lvl).append("]") - case SetType(bt) => pp(bt, sb.append("Set["), lvl).append("]") - case MapType(ft,tt) => pp(tt, pp(ft, sb.append("Map["), lvl).append(","), lvl).append("]") - case MultisetType(bt) => pp(bt, sb.append("Multiset["), lvl).append("]") - case OptionType(bt) => pp(bt, sb.append("Option["), lvl).append("]") + case ArrayType(bt) => + sb.append("Array[") + pp(bt, sb, lvl) + sb.append("]") + case SetType(bt) => + sb.append("Set[") + pp(bt, sb, lvl) + sb.append("]") + case MapType(ft,tt) => + sb.append("Map[") + pp(ft, sb, lvl) + sb.append(",") + pp(tt, sb, lvl) + sb.append("]") + case MultisetType(bt) => + sb.append("Multiset[") + pp(bt, sb, lvl) + sb.append("]") + case OptionType(bt) => + sb.append("Option[") + pp(bt, sb, lvl) + sb.append("]") case FunctionType(fts, tt) => { - var nsb = sb if (fts.size > 1) - nsb = ppNaryType(nsb, fts, "(", ", ", ")", lvl) + ppNaryType(sb, fts, "(", ", ", ")", lvl) else if (fts.size == 1) - nsb = pp(fts.head, nsb, lvl) - nsb.append(" => ") - pp(tt, nsb, lvl) + pp(fts.head, sb, lvl) + sb.append(" => ") + pp(tt, sb, lvl) } case TupleType(tpes) => ppNaryType(sb, tpes, "(", ", ", ")", lvl) case c: ClassType => sb.append(c.classDef.id) @@ -477,7 +461,7 @@ object ScalaPrinter { // DEFINITIONS // all definitions are printed with an end-of-line - private def pp(defn: Definition, sb: StringBuffer, lvl: Int): StringBuffer = { + private def pp(defn: Definition, sb: StringBuffer, lvl: Int): Unit = { defn match { case Program(id, mainObj) => { @@ -486,124 +470,119 @@ object ScalaPrinter { } case ObjectDef(id, defs, invs) => { - var nsb = sb - ind(nsb, lvl) - nsb.append("object ") - nsb.append(id) - nsb.append(" {\n") + ind(sb, lvl) + sb.append("object ") + sb.append(id) + sb.append(" {\n") var c = 0 val sz = defs.size defs.foreach(df => { - nsb = pp(df, nsb, lvl+1) + pp(df, sb, lvl+1) if(c < sz - 1) { - nsb.append("\n\n") + sb.append("\n\n") } c = c + 1 }) - nsb.append("\n") - ind(nsb, lvl).append("}\n") + sb.append("\n") + ind(sb, lvl) + sb.append("}\n") } case AbstractClassDef(id, parent) => { - var nsb = sb - ind(nsb, lvl) - nsb.append("sealed abstract class ") - nsb.append(id) - parent.foreach(p => nsb.append(" extends " + p.id)) - nsb + ind(sb, lvl) + sb.append("sealed abstract class ") + sb.append(id) + parent.foreach(p => sb.append(" extends " + p.id)) + sb } case CaseClassDef(id, parent, varDecls) => { - var nsb = sb - ind(nsb, lvl) - nsb.append("case class ") - nsb.append(id) - nsb.append("(") + ind(sb, lvl) + sb.append("case class ") + sb.append(id) + sb.append("(") var c = 0 val sz = varDecls.size varDecls.foreach(vd => { - nsb.append(vd.id) - nsb.append(": ") - nsb = pp(vd.tpe, nsb, lvl) + sb.append(vd.id) + sb.append(": ") + pp(vd.tpe, sb, lvl) if(c < sz - 1) { - nsb.append(", ") + sb.append(", ") } c = c + 1 }) - nsb.append(")") - parent.foreach(p => nsb.append(" extends " + p.id)) - nsb + sb.append(")") + parent.foreach(p => sb.append(" extends " + p.id)) + sb } case fd @ FunDef(id, rt, args, body, pre, post) => { - var nsb = sb //for(a <- fd.annotations) { - // ind(nsb, lvl) - // nsb.append("@" + a + "\n") + // ind(sb, lvl) + // sb.append("@" + a + "\n") //} - ind(nsb, lvl) - nsb.append("def ") - nsb.append(id) - nsb.append("(") + ind(sb, lvl) + sb.append("def ") + sb.append(id) + sb.append("(") val sz = args.size var c = 0 args.foreach(arg => { - nsb.append(arg.id) - nsb.append(" : ") - nsb = pp(arg.tpe, nsb, lvl) + sb.append(arg.id) + sb.append(" : ") + pp(arg.tpe, sb, lvl) if(c < sz - 1) { - nsb.append(", ") + sb.append(", ") } c = c + 1 }) - nsb.append(") : ") - nsb = pp(rt, nsb, lvl) - nsb.append(" = (") + sb.append(") : ") + pp(rt, sb, lvl) + sb.append(" = (") if(body.isDefined) { pre match { - case None => pp(body.get, nsb, lvl) + case None => pp(body.get, sb, lvl) case Some(prec) => { - nsb.append("{\n") - ind(nsb, lvl+1) - nsb.append("require(") - nsb = pp(prec, nsb, lvl+1) - nsb.append(")\n") - pp(body.get, nsb, lvl+1) - nsb.append("\n") - ind(nsb, lvl) - nsb.append("}") + sb.append("{\n") + ind(sb, lvl+1) + sb.append("require(") + pp(prec, sb, lvl+1) + sb.append(")\n") + pp(body.get, sb, lvl+1) + sb.append("\n") + ind(sb, lvl) + sb.append("}") } } } else - nsb.append("[unknown function implementation]") + sb.append("[unknown function implementation]") post match { case None => { - nsb.append(")") + sb.append(")") } case Some(postc) => { - nsb.append(" ensuring(res => ") //TODO, not very general solution... - nsb = pp(postc, nsb, lvl) - nsb.append("))") + sb.append(" ensuring(res => ") //TODO, not very general solution... + pp(postc, sb, lvl) + sb.append("))") } } - nsb + sb } case _ => sb.append("Defn?") } } } - -// vim: set ts=4 sw=4 et: