From 3623ccd18f897a4c59ad65b9d304bf78385a8e81 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Mon, 17 Aug 2015 15:10:19 +0200
Subject: [PATCH] Define Printable for non-leon-trees

---
 src/main/scala/leon/purescala/Common.scala                | 2 +-
 src/main/scala/leon/purescala/Printable.scala             | 7 +++++++
 src/main/scala/leon/purescala/Types.scala                 | 4 +---
 src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala     | 1 +
 src/main/scala/leon/solvers/templates/UnrollingBank.scala | 5 +++--
 src/main/scala/leon/solvers/z3/FairZ3Solver.scala         | 5 +++++
 6 files changed, 18 insertions(+), 6 deletions(-)
 create mode 100644 src/main/scala/leon/purescala/Printable.scala

diff --git a/src/main/scala/leon/purescala/Common.scala b/src/main/scala/leon/purescala/Common.scala
index e10036a36..38206418d 100644
--- a/src/main/scala/leon/purescala/Common.scala
+++ b/src/main/scala/leon/purescala/Common.scala
@@ -11,7 +11,7 @@ import Definitions.Program
 object Common {
 
 
-  abstract class Tree extends Positioned with Serializable {
+  abstract class Tree extends Positioned with Serializable with Printable {
     def copiedFrom(o: Tree): this.type = {
       setPos(o)
       this
diff --git a/src/main/scala/leon/purescala/Printable.scala b/src/main/scala/leon/purescala/Printable.scala
new file mode 100644
index 000000000..27be03538
--- /dev/null
+++ b/src/main/scala/leon/purescala/Printable.scala
@@ -0,0 +1,7 @@
+package leon
+package purescala
+
+
+trait Printable {
+  def asString(implicit ctx: LeonContext): String
+}
diff --git a/src/main/scala/leon/purescala/Types.scala b/src/main/scala/leon/purescala/Types.scala
index b780cfb69..d39fda333 100644
--- a/src/main/scala/leon/purescala/Types.scala
+++ b/src/main/scala/leon/purescala/Types.scala
@@ -12,11 +12,9 @@ import TypeOps._
 
 object Types {
 
-  trait Typed {
+  trait Typed extends Printable {
     val getType: TypeTree
     def isTyped : Boolean = getType != Untyped
-
-    def asString(implicit ctx: LeonContext): String
   }
 
   class TypeErrorException(msg: String) extends Exception(msg)
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
index b3365ba28..26fb3d9a1 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
@@ -494,6 +494,7 @@ abstract class SMTLIBSolver(val context: LeonContext,
       case BVUMinus(u) => FixedSizeBitVectors.Neg(toSMT(u))
       case BVNot(u) => FixedSizeBitVectors.Not(toSMT(u))
       case Assert(a,_, b) => toSMT(IfExpr(a, b, Error(b.getType, "assertion failed")))
+
       case Equals(a,b) => Core.Equals(toSMT(a), toSMT(b))
       case Implies(a,b) => Core.Implies(toSMT(a), toSMT(b))
       case Plus(a,b) => Ints.Add(toSMT(a), toSMT(b))
diff --git a/src/main/scala/leon/solvers/templates/UnrollingBank.scala b/src/main/scala/leon/solvers/templates/UnrollingBank.scala
index 95a9e47ce..07bc7de6d 100644
--- a/src/main/scala/leon/solvers/templates/UnrollingBank.scala
+++ b/src/main/scala/leon/solvers/templates/UnrollingBank.scala
@@ -4,12 +4,13 @@ package leon
 package solvers
 package templates
 
+import purescala.Printable
 import purescala.Common._
 import purescala.Expressions._
 import purescala.Types._
 import utils._
 
-class UnrollingBank[T](ctx: LeonContext, templateGenerator: TemplateGenerator[T]) extends IncrementalState {
+class UnrollingBank[T <% Printable](ctx: LeonContext, templateGenerator: TemplateGenerator[T]) extends IncrementalState {
   implicit val debugSection = utils.DebugSectionSolver
   implicit val ctx0 = ctx
   val reporter = ctx.reporter
@@ -194,7 +195,7 @@ class UnrollingBank[T](ctx: LeonContext, templateGenerator: TemplateGenerator[T]
 
     reporter.debug("Generating clauses for: " + expr.asString)
     for (cls <- clauses) {
-      reporter.debug("  . " + cls)
+      reporter.debug("  . " + cls.asString(ctx))
     }
 
     clauses
diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
index 5a42c60c4..eef9ffb90 100644
--- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
@@ -7,6 +7,7 @@ package z3
 import utils._
 import _root_.z3.scala._
 
+import purescala.Printable
 import purescala.Common._
 import purescala.Definitions._
 import purescala.Expressions._
@@ -122,6 +123,10 @@ class FairZ3Solver(val context: LeonContext, val program: Program)
     }
   }
 
+  implicit val z3Printable = (z3: Z3AST) => new Printable {
+    def asString(implicit ctx: LeonContext) = z3.toString
+  }
+
   val templateGenerator = new TemplateGenerator(new TemplateEncoder[Z3AST] {
     def encodeId(id: Identifier): Z3AST = {
       idToFreshZ3Id(id)
-- 
GitLab