From 105e2905914ea18c087c50d329f350a6b987021d Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Tue, 30 Oct 2012 15:53:23 +0100
Subject: [PATCH] Extract sys.error into purescala trees

---
 src/main/scala/leon/plugin/CodeExtraction.scala  |  4 ++++
 src/main/scala/leon/plugin/Extractors.scala      | 16 ++++++++++++++++
 src/main/scala/leon/purescala/ScalaPrinter.scala |  2 +-
 src/main/scala/leon/purescala/TreeOps.scala      |  4 ++++
 .../scala/leon/synthesis/FileInterface.scala     |  2 +-
 5 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/main/scala/leon/plugin/CodeExtraction.scala b/src/main/scala/leon/plugin/CodeExtraction.scala
index 8f48d8629..5ada9b223 100644
--- a/src/main/scala/leon/plugin/CodeExtraction.scala
+++ b/src/main/scala/leon/plugin/CodeExtraction.scala
@@ -534,6 +534,9 @@ trait CodeExtraction extends Extractors {
             val tupleType = TupleType(tupleExprs.map(expr => bestRealType(expr.getType)))
             Tuple(tupleExprs).setType(tupleType)
           }
+          case ExErrorExpression(str) =>
+            Error(str).setType(scalaType2PureScala(unit, silent)(nextExpr.tpe))
+
           case ExTupleExtract(tuple, index) => {
             val tupleExpr = rec(tuple)
             val TupleType(tpes) = tupleExpr.getType
@@ -1051,6 +1054,7 @@ trait CodeExtraction extends Extractors {
       case tpe if tpe == IntClass.tpe => Int32Type
       case tpe if tpe == BooleanClass.tpe => BooleanType
       case tpe if tpe == UnitClass.tpe => UnitType
+      case tpe if tpe == NothingClass.tpe => BottomType
       case TypeRef(_, sym, btt :: Nil) if isSetTraitSym(sym) => SetType(rec(btt))
       case TypeRef(_, sym, btt :: Nil) if isMultisetTraitSym(sym) => MultisetType(rec(btt))
       case TypeRef(_, sym, btt :: Nil) if isOptionClassSym(sym) => OptionType(rec(btt))
diff --git a/src/main/scala/leon/plugin/Extractors.scala b/src/main/scala/leon/plugin/Extractors.scala
index 824519548..e736f7536 100644
--- a/src/main/scala/leon/plugin/Extractors.scala
+++ b/src/main/scala/leon/plugin/Extractors.scala
@@ -175,6 +175,22 @@ trait Extractors {
       }
     }
 
+    object ExIdNamed {
+      def unapply(id: Ident): Option[String] = Some(id.toString)
+    }
+    object ExNamed {
+      def unapply(name: Name): Option[String] = Some(name.toString)
+    }
+
+    object ExErrorExpression {
+      def unapply(tree: Apply) : Option[String] = tree match {
+        case a @ Apply(Select(Select(Select(ExIdNamed("scala"), ExNamed("sys")), ExNamed("package")), ExNamed("error")), List(lit : Literal)) =>
+          Some(lit.value.stringValue)
+        case _ =>
+          None
+      }
+    }
+
     object ExChooseExpression {
       def unapply(tree: Apply) : Option[(List[(Type, Symbol)], Type, Tree, Tree)] = tree match {
         case a @ Apply(
diff --git a/src/main/scala/leon/purescala/ScalaPrinter.scala b/src/main/scala/leon/purescala/ScalaPrinter.scala
index 31f3e7305..fb1e14785 100644
--- a/src/main/scala/leon/purescala/ScalaPrinter.scala
+++ b/src/main/scala/leon/purescala/ScalaPrinter.scala
@@ -426,7 +426,7 @@ object ScalaPrinter {
 
     case e @ Error(desc) => {
       var nsb = sb
-      nsb.append("error(\"" + desc + "\")")
+      nsb.append("sys.error(\"" + desc + "\")")
       nsb
     }
 
diff --git a/src/main/scala/leon/purescala/TreeOps.scala b/src/main/scala/leon/purescala/TreeOps.scala
index 2b5cda8ed..d00857b9c 100644
--- a/src/main/scala/leon/purescala/TreeOps.scala
+++ b/src/main/scala/leon/purescala/TreeOps.scala
@@ -1173,6 +1173,10 @@ object TreeOps {
             (scrutinees.head, patterns.head)
           }
 
+          // We use searchAndReplace to replace the biggest match first
+          // (topdown).
+          // So replaceing using Map(a => b, CC(a) => d) will replace
+          // "CC(a)" by "d" and not by "CC(b)"
           val newThen = searchAndReplace(substMap.get)(then)
 
           MatchExpr(scrutinee, Seq(SimpleCase(pattern, newThen), SimpleCase(WildcardPattern(None), elze)))
diff --git a/src/main/scala/leon/synthesis/FileInterface.scala b/src/main/scala/leon/synthesis/FileInterface.scala
index ad19ba6c7..b76184182 100644
--- a/src/main/scala/leon/synthesis/FileInterface.scala
+++ b/src/main/scala/leon/synthesis/FileInterface.scala
@@ -14,7 +14,7 @@ class FileInterface(reporter: Reporter, origFile: File) {
     origFile.getAbsolutePath() match {
       case FileExt(path, "scala") =>
         var i = 0
-        def savePath = path+"."+i+".scala"
+        def savePath = path+".scala."+i
         while (new File(savePath).isFile()) {
           i += 1
         }
-- 
GitLab