From 12116bae7f03be38f188698172cab814c8f2867a Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Mon, 30 Mar 2015 18:30:19 +0200
Subject: [PATCH] Refactor boolean decorations, add ==>

---
 library/lang/package.scala                    | 12 +++++-----
 .../leon/frontends/scalac/ASTExtractors.scala | 23 +++++++++++++++++--
 .../frontends/scalac/CodeExtraction.scala     |  2 ++
 3 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/library/lang/package.scala b/library/lang/package.scala
index a80e25cba..a598c251e 100644
--- a/library/lang/package.scala
+++ b/library/lang/package.scala
@@ -7,16 +7,16 @@ import scala.language.implicitConversions
 
 package object lang {
   @ignore
-  sealed class IsValid(val property : Boolean) {
+  implicit class BooleanDecorations(val underlying: Boolean) {
     def holds : Boolean = {
-      assert(property)
-      property
+      assert(underlying)
+      underlying
+    }
+    def ==> (that: Boolean): Boolean = {
+      !underlying || that
     }
   }
 
-  @ignore
-  implicit def any2IsValid(x: Boolean) : IsValid = new IsValid(x)
-
   @ignore
   object InvariantFunction {
     def invariant(x: Boolean): Unit = ()
diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
index 06ab50a2e..3d8df24e1 100644
--- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
+++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
@@ -155,12 +155,31 @@ trait ASTExtractors {
 
     object ExHoldsExpression {
       def unapply(tree: Select) : Option[Tree] = tree match {
-        case Select(Apply(ExSymbol("leon", "lang", "any2IsValid"), realExpr :: Nil), ExNamed("holds")) =>
-            Some(realExpr)
+        case Select(
+          Apply(ExSelected("leon", "lang", "package", "BooleanDecorations"), realExpr :: Nil),
+          ExNamed("holds")
+        ) => Some(realExpr)
         case _ => None
        }
     }
 
+    object ExImplies {
+      def unapply(tree: Apply) : Option[(Tree, Tree)] = tree match {
+        case
+          Apply(
+            Select(
+              Apply(
+                ExSelected("leon", "lang", "package", "BooleanDecorations"),
+                lhs :: Nil
+              ),
+              ExNamed("$eq$eq$greater")
+            ),
+            rhs :: Nil
+          ) => Some((lhs, rhs))
+        case _ => None
+      }
+    }
+
     object ExRequiredExpression {
       /** Extracts the 'require' contract from an expression (only if it's the
        * first call in the block). */
diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
index 3d89df12e..9e209b5d5 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -1541,6 +1541,8 @@ trait CodeExtraction extends ASTExtractors {
           CaseClass(CaseClassType(libraryCaseClass(str.pos, "leon.lang.string.String"), Seq()), Seq(charList))
 
 
+        case ExImplies(lhs, rhs) =>
+          Implies(extractTree(lhs), extractTree(rhs)).setPos(current.pos)
 
         case c @ ExCall(rec, sym, tps, args) =>
           val rrec = rec match {
-- 
GitLab