From a86f13a1647d1afad71fff2d8392a226ef217be8 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Fri, 17 Apr 2015 17:44:06 +0200
Subject: [PATCH] Leon defines its own Sets

---
 library/collection/package.scala              |  1 +
 library/lang/Set.scala                        | 18 ++++++++
 .../leon/frontends/scalac/ASTExtractors.scala | 41 +++++------------
 .../frontends/scalac/CodeExtraction.scala     | 30 ++++++------
 .../frontends/scalac/ExtractionPhase.scala    |  9 ++--
 .../frontends/scalac/SimpleReporter.scala     | 18 +-------
 .../resources/regression/repair/Heap4.scala   |  3 +-
 .../regression/repair/MergeSort2.scala        |  1 +
 .../termination/valid/BinaryTreeImp.scala     |  1 -
 .../termination/valid/ListWithSize.scala      |  1 -
 .../termination/valid/QuickSort.scala         |  2 +-
 .../termination/valid/RedBlackTree.scala      |  3 +-
 .../termination/valid/SimpInterpret.scala     |  1 -
 .../newsolvers/valid/AmortizedQueue.scala     |  1 -
 .../newsolvers/valid/AssociativeList.scala    |  1 -
 .../newsolvers/valid/InsertionSort.scala      |  1 -
 .../newsolvers/valid/ListOperations.scala     |  1 -
 .../newsolvers/valid/PropositionalLogic.scala |  1 -
 .../newsolvers/valid/RedBlackTree.scala       |  1 -
 .../newsolvers/valid/SearchLinkedList.scala   |  1 -
 .../purescala/invalid/InsertionSort.scala     |  1 -
 .../purescala/invalid/ListOperations.scala    |  1 -
 .../invalid/PropositionalLogic.scala          |  1 -
 .../purescala/invalid/RedBlackTree.scala      |  1 -
 .../purescala/valid/AmortizedQueue.scala      |  1 -
 .../purescala/valid/AssociativeList.scala     |  1 -
 .../purescala/valid/InsertionSort.scala       |  1 -
 .../purescala/valid/ListOperations.scala      |  1 -
 .../purescala/valid/PropositionalLogic.scala  |  1 -
 .../purescala/valid/RedBlackTree.scala        |  1 -
 .../purescala/valid/SearchLinkedList.scala    |  1 -
 .../purescala/valid/Subtyping1.scala          |  2 +
 .../verification/xlang/invalid/Mean.scala     |  1 -
 .../verification/xlang/valid/Mean.scala       |  1 -
 src/test/scala/leon/test/LeonTestSuite.scala  |  1 -
 .../leon/test/codegen/CodeGenTests.scala      |  3 +-
 .../test/evaluators/EvaluatorsTests.scala     | 46 +++++++++++--------
 .../verification/NewSolversRegression.scala   |  3 --
 .../PureScalaVerificationRegression.scala     |  2 -
 .../verification/VerificationRegression.scala | 41 ++++++++++++-----
 40 files changed, 118 insertions(+), 129 deletions(-)
 create mode 100644 library/lang/Set.scala

diff --git a/library/collection/package.scala b/library/collection/package.scala
index 77d953a10..e163eaf4a 100644
--- a/library/collection/package.scala
+++ b/library/collection/package.scala
@@ -4,6 +4,7 @@ package leon
 
 import leon.annotation._
 import leon.collection.List
+import leon.lang._
 import leon.lang.synthesis.choose
 
 package object collection {
diff --git a/library/lang/Set.scala b/library/lang/Set.scala
new file mode 100644
index 000000000..dcedd1e0b
--- /dev/null
+++ b/library/lang/Set.scala
@@ -0,0 +1,18 @@
+package leon.lang
+import leon.annotation._
+
+object Set {
+  def empty[T] = Set[T]()
+}
+
+@ignore
+case class Set[T](elems: T*) {
+  def +(a: T): Set[T] = ???
+  def ++(a: Set[T]): Set[T] = ???
+  def -(a: T): Set[T] = ???
+  def --(a: Set[T]): Set[T] = ???
+  def contains(a: T): Boolean = ???
+  def isEmpty: Boolean = ???
+  def subsetOf(b: Set[T]): Boolean = ???
+  def &(a: Set[T]): Set[T] = ???
+}
diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
index eac0ef94f..6fab7051b 100644
--- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
+++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
@@ -26,7 +26,8 @@ trait ASTExtractors {
   protected lazy val tuple4Sym          = classFromName("scala.Tuple4")
   protected lazy val tuple5Sym          = classFromName("scala.Tuple5")
   protected lazy val mapSym             = classFromName("scala.collection.immutable.Map")
-  protected lazy val setSym             = classFromName("scala.collection.immutable.Set")
+  protected lazy val scalaSetSym        = classFromName("scala.collection.immutable.Set")
+  protected lazy val setSym             = classFromName("leon.lang.Set")
   protected lazy val optionClassSym     = classFromName("scala.Option")
   protected lazy val arraySym           = classFromName("scala.Array")
   protected lazy val someClassSym       = classFromName("scala.Some")
@@ -56,15 +57,19 @@ trait ASTExtractors {
     }
   }
 
-  def isSetTraitSym(sym : Symbol) : Boolean = {
+  def isSetSym(sym: Symbol) : Boolean = {
     getResolvedTypeSym(sym) == setSym
   }
 
-  def isMapTraitSym(sym : Symbol) : Boolean = {
+  def isScalaSetSym(sym: Symbol) : Boolean = {
+    getResolvedTypeSym(sym) == scalaSetSym
+  }
+
+  def isMapTraitSym(sym: Symbol) : Boolean = {
     getResolvedTypeSym(sym) == mapSym
   }
 
-  def isMultisetTraitSym(sym : Symbol) : Boolean = {
+  def isMultisetTraitSym(sym: Symbol) : Boolean = {
     sym == multisetTraitSym
   }
 
@@ -323,8 +328,9 @@ trait ASTExtractors {
     }
 
     object ExCaseClassSyntheticJunk {
-      def unapply(cd: ClassDef): Boolean = cd match {
+      def unapply(cd: Tree): Boolean = cd match {
         case ClassDef(_, _, _, _) if cd.symbol.isSynthetic => true
+        case DefDef(_, _, _, _, _, _) if cd.symbol.isSynthetic && (cd.symbol.isCase || cd.symbol.isPrivate) => true
         case _ => false
       }
     }
@@ -815,23 +821,6 @@ trait ASTExtractors {
       }
     }
 
-    object ExEmptySet {
-      def unapply(tree: TypeApply): Option[Tree] = tree match {
-        case TypeApply(
-          Select(
-            Select(
-              Select(
-                Select(Ident(s), collectionName),
-                immutableName),
-              setName),
-            emptyName),  theTypeTree :: Nil) if (
-            collectionName.toString == "collection" && immutableName.toString == "immutable" && setName.toString == "Set" && emptyName.toString == "empty"
-          ) => Some(theTypeTree)
-        case TypeApply(Select(Select(Select(This(scalaName), predefName), setname), applyName), theTypeTree :: Nil)  if ("scala".equals(scalaName.toString) && "Predef".equals(predefName.toString) && "empty".equals(applyName.toString)) => Some(theTypeTree)
-        case _ => None
-      }
-    }
-
     object ExEmptyMultiset {
       def unapply(tree: TypeApply): Option[Tree] = tree match {
         case TypeApply(
@@ -867,14 +856,6 @@ trait ASTExtractors {
       }
     }
 
-    object ExFiniteSet {
-      def unapply(tree: Apply): Option[(Tree,List[Tree])] = tree match {
-        case Apply(TypeApply(Select(Select(Select(Select(Ident(s), collectionName), immutableName), setName), applyName), theTypeTree :: Nil), args) if (collectionName.toString == "collection" && immutableName.toString == "immutable" && setName.toString == "Set" && applyName.toString == "apply") => Some((theTypeTree, args))
-        case Apply(TypeApply(Select(Select(Select(This(scalaName), predefName), setName), applyName), theTypeTree :: Nil), args) if ("scala".equals(scalaName.toString) && "Predef".equals(predefName.toString) && setName.toString == "Set" && "apply".equals(applyName.toString)) => Some((theTypeTree, args))
-        case _ => None
-      }
-    }
-
     object ExFiniteMultiset {
       def unapply(tree: Apply): Option[(Tree,List[Tree])] = tree match {
         case Apply(
diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
index b4f2a0200..70a0eacf2 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -869,6 +869,7 @@ trait CodeExtraction extends ASTExtractors {
         case ExFieldAccessorFunction() => 
         case d if isIgnored(d.symbol) || (d.symbol.isImplicit && d.symbol.isSynthetic) =>
         case tree =>
+          println(tree)
           outOfSubsetError(tree, "Don't know what to do with this. Not purescala?");
       }
 
@@ -1410,8 +1411,10 @@ trait CodeExtraction extends ASTExtractors {
         case ExCaseClassConstruction(tpt, args) =>
           extractType(tpt) match {
             case cct: CaseClassType =>
-              val nargs = args.map(extractTree)
-              CaseClass(cct, nargs)
+              CaseClass(cct, args.map(extractTree))
+
+            case SetType(underlying) =>
+              finiteSet(args.map(extractTree).toSet, underlying)
 
             case _ =>
               outOfSubsetError(tr, "Construction of a non-case class.")
@@ -1460,13 +1463,6 @@ trait CodeExtraction extends ASTExtractors {
               outOfSubsetError(tr, "Invalid comparison: (_: "+rt+") == (_: "+lt+")")
           }
 
-        case ExFiniteSet(tt, args)  =>
-          val underlying = extractType(tt)
-          finiteSet(args.map(extractTree).toSet, underlying)
-        case ExEmptySet(tt) =>
-          val underlying = extractType(tt)
-          EmptySet(underlying)
-
         case ExFiniteMultiset(tt, args) =>
           val underlying = extractType(tt)
           finiteMultiset(args.map(extractTree),underlying)
@@ -1689,11 +1685,11 @@ trait CodeExtraction extends ASTExtractors {
               or(a1, a2)
 
             // Set methods
-            case (IsTyped(a1, SetType(b1)), "min", Nil) =>
-              SetMin(a1)
+            //case (IsTyped(a1, SetType(b1)), "min", Nil) =>
+            //  SetMin(a1)
 
-            case (IsTyped(a1, SetType(b1)), "max", Nil) =>
-              SetMax(a1)
+            //case (IsTyped(a1, SetType(b1)), "max", Nil) =>
+            //  SetMax(a1)
 
             case (IsTyped(a1, SetType(b1)), "++", List(IsTyped(a2, SetType(b2))))  if b1 == b2 =>
               SetUnion(a1, a2)
@@ -1710,6 +1706,9 @@ trait CodeExtraction extends ASTExtractors {
             case (IsTyped(a1, SetType(b1)), "contains", List(a2)) =>
               ElementOfSet(a2, a1)
 
+            case (IsTyped(a1, SetType(b1)), "isEmpty", List()) =>
+              Equals(a1, finiteSet(Set(), b1))
+
             // Multiset methods
             case (IsTyped(a1, MultisetType(b1)), "++", List(IsTyped(a2, MultisetType(b2))))  if b1 == b2 =>
               MultisetUnion(a1, a2)
@@ -1795,7 +1794,10 @@ trait CodeExtraction extends ASTExtractors {
       case TypeRef(_, sym, _) if isBigIntSym(sym) =>
         IntegerType
 
-      case TypeRef(_, sym, btt :: Nil) if isSetTraitSym(sym) =>
+      case TypeRef(_, sym, btt :: Nil) if isScalaSetSym(sym) =>
+        outOfSubsetError(pos, "Scala's Set API is no longer extracted. Make sure you import leon.lang.Set that defines supported Set operations.")
+
+      case TypeRef(_, sym, btt :: Nil) if isSetSym(sym) =>
         SetType(extractType(btt))
 
       case TypeRef(_, sym, btt :: Nil) if isMultisetTraitSym(sym) =>
diff --git a/src/main/scala/leon/frontends/scalac/ExtractionPhase.scala b/src/main/scala/leon/frontends/scalac/ExtractionPhase.scala
index 005138c93..a08f55c6c 100644
--- a/src/main/scala/leon/frontends/scalac/ExtractionPhase.scala
+++ b/src/main/scala/leon/frontends/scalac/ExtractionPhase.scala
@@ -36,10 +36,11 @@ object ExtractionPhase extends LeonPhase[List[String], Program] {
       "make sure to set the ECLIPSE_HOME environment variable to your Eclipse installation home directory"
     ))
     
-    settings.classpath.value = scalaLib
-    settings.usejavacp.value = false
-    settings.Yrangepos.value = true
-    settings.skip.value      = List("patmat")
+    settings.classpath.value   = scalaLib
+    settings.usejavacp.value   = false
+    settings.deprecation.value = true
+    settings.Yrangepos.value   = true
+    settings.skip.value        = List("patmat")
 
     val compilerOpts = Build.libFiles ::: args.filterNot(_.startsWith("--"))
 
diff --git a/src/main/scala/leon/frontends/scalac/SimpleReporter.scala b/src/main/scala/leon/frontends/scalac/SimpleReporter.scala
index 60be71545..d04cebb3e 100644
--- a/src/main/scala/leon/frontends/scalac/SimpleReporter.scala
+++ b/src/main/scala/leon/frontends/scalac/SimpleReporter.scala
@@ -53,28 +53,14 @@ class SimpleReporter(val settings: Settings, reporter: leon.Reporter) extends Ab
       case _ =>
         val buf = new StringBuilder(msg)
         val lpos = LeonOffsetPosition(pos.line, pos.column, pos.point, pos.source.file.file)
-        printMessage(msg+"\n"+getSourceLine(pos), lpos, severity)
+        printMessage(msg, lpos, severity)
     }
   }
+
   def print(pos: Position, msg: String, severity: Severity) {
     printMessage(pos, clabel(severity) + msg, severity)
   }
 
-  def getSourceLine(pos: Position) = {
-    pos.lineContent.stripLineEnd+getColumnMarker(pos)
-  }
-
-  def getColumnMarker(pos: Position) = if (pos.isDefined) { 
-      "\n"+(" " * (pos.column - 1) + "^")
-    } else {
-      ""
-    }
-  
-  def printSummary() {
-    if (WARNING.count > 0) printMessage(getCountString(WARNING) + " found", LeonNoPosition, INFO)
-    if (  ERROR.count > 0) printMessage(getCountString(ERROR  ) + " found", LeonNoPosition, INFO)
-  }
-
   def display(pos: Position, msg: String, severity: Severity) {
     severity.count += 1
     if (severity != ERROR || severity.count <= ERROR_LIMIT)
diff --git a/src/test/resources/regression/repair/Heap4.scala b/src/test/resources/regression/repair/Heap4.scala
index cd0624270..75f03aab5 100644
--- a/src/test/resources/regression/repair/Heap4.scala
+++ b/src/test/resources/regression/repair/Heap4.scala
@@ -4,8 +4,9 @@
  * Date: 20.11.2013
  **/
 
+import leon._
+import leon.lang._
 import leon.collection._
-import leon._ 
 
 object HeapSort {
  
diff --git a/src/test/resources/regression/repair/MergeSort2.scala b/src/test/resources/regression/repair/MergeSort2.scala
index 2cb780bb0..ca22569d8 100644
--- a/src/test/resources/regression/repair/MergeSort2.scala
+++ b/src/test/resources/regression/repair/MergeSort2.scala
@@ -1,5 +1,6 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
+import leon.lang._
 import leon.collection._
 
 object MergeSort {
diff --git a/src/test/resources/regression/termination/valid/BinaryTreeImp.scala b/src/test/resources/regression/termination/valid/BinaryTreeImp.scala
index 5c2f48c3d..c758798bf 100644
--- a/src/test/resources/regression/termination/valid/BinaryTreeImp.scala
+++ b/src/test/resources/regression/termination/valid/BinaryTreeImp.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/termination/valid/ListWithSize.scala b/src/test/resources/regression/termination/valid/ListWithSize.scala
index 00bd968ad..af8aafeb8 100644
--- a/src/test/resources/regression/termination/valid/ListWithSize.scala
+++ b/src/test/resources/regression/termination/valid/ListWithSize.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/termination/valid/QuickSort.scala b/src/test/resources/regression/termination/valid/QuickSort.scala
index 5687c778f..e356bdc2a 100644
--- a/src/test/resources/regression/termination/valid/QuickSort.scala
+++ b/src/test/resources/regression/termination/valid/QuickSort.scala
@@ -1,6 +1,6 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
+import leon.lang._
 
 object QuickSort {
   sealed abstract class List
diff --git a/src/test/resources/regression/termination/valid/RedBlackTree.scala b/src/test/resources/regression/termination/valid/RedBlackTree.scala
index 76c4e03a9..2d48a25e0 100644
--- a/src/test/resources/regression/termination/valid/RedBlackTree.scala
+++ b/src/test/resources/regression/termination/valid/RedBlackTree.scala
@@ -1,7 +1,6 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
-//import scala.collection.immutable.Multiset
+import leon.lang._
 
 object RedBlackTree { 
   sealed abstract class Color
diff --git a/src/test/resources/regression/termination/valid/SimpInterpret.scala b/src/test/resources/regression/termination/valid/SimpInterpret.scala
index 22c31f194..76fcd4145 100644
--- a/src/test/resources/regression/termination/valid/SimpInterpret.scala
+++ b/src/test/resources/regression/termination/valid/SimpInterpret.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-//import scala.collection.immutable.Set
 //import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/newsolvers/valid/AmortizedQueue.scala b/src/test/resources/regression/verification/newsolvers/valid/AmortizedQueue.scala
index 1f74ed4b1..0b55b9a51 100644
--- a/src/test/resources/regression/verification/newsolvers/valid/AmortizedQueue.scala
+++ b/src/test/resources/regression/verification/newsolvers/valid/AmortizedQueue.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2014 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/newsolvers/valid/AssociativeList.scala b/src/test/resources/regression/verification/newsolvers/valid/AssociativeList.scala
index a62a765f5..ad22edcd8 100644
--- a/src/test/resources/regression/verification/newsolvers/valid/AssociativeList.scala
+++ b/src/test/resources/regression/verification/newsolvers/valid/AssociativeList.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2014 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/newsolvers/valid/InsertionSort.scala b/src/test/resources/regression/verification/newsolvers/valid/InsertionSort.scala
index a3120a9bc..81109ba33 100644
--- a/src/test/resources/regression/verification/newsolvers/valid/InsertionSort.scala
+++ b/src/test/resources/regression/verification/newsolvers/valid/InsertionSort.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2014 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/newsolvers/valid/ListOperations.scala b/src/test/resources/regression/verification/newsolvers/valid/ListOperations.scala
index 2986a4342..3965ab57d 100644
--- a/src/test/resources/regression/verification/newsolvers/valid/ListOperations.scala
+++ b/src/test/resources/regression/verification/newsolvers/valid/ListOperations.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2014 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/newsolvers/valid/PropositionalLogic.scala b/src/test/resources/regression/verification/newsolvers/valid/PropositionalLogic.scala
index a41dab826..4c2beb4c7 100644
--- a/src/test/resources/regression/verification/newsolvers/valid/PropositionalLogic.scala
+++ b/src/test/resources/regression/verification/newsolvers/valid/PropositionalLogic.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2014 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/newsolvers/valid/RedBlackTree.scala b/src/test/resources/regression/verification/newsolvers/valid/RedBlackTree.scala
index 841befb41..edaee5e92 100644
--- a/src/test/resources/regression/verification/newsolvers/valid/RedBlackTree.scala
+++ b/src/test/resources/regression/verification/newsolvers/valid/RedBlackTree.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2014 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/newsolvers/valid/SearchLinkedList.scala b/src/test/resources/regression/verification/newsolvers/valid/SearchLinkedList.scala
index bd0596fba..87076bb97 100644
--- a/src/test/resources/regression/verification/newsolvers/valid/SearchLinkedList.scala
+++ b/src/test/resources/regression/verification/newsolvers/valid/SearchLinkedList.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2014 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/purescala/invalid/InsertionSort.scala b/src/test/resources/regression/verification/purescala/invalid/InsertionSort.scala
index 5b4d87614..d82f045b5 100644
--- a/src/test/resources/regression/verification/purescala/invalid/InsertionSort.scala
+++ b/src/test/resources/regression/verification/purescala/invalid/InsertionSort.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/purescala/invalid/ListOperations.scala b/src/test/resources/regression/verification/purescala/invalid/ListOperations.scala
index 7c880d299..46e90ccfc 100644
--- a/src/test/resources/regression/verification/purescala/invalid/ListOperations.scala
+++ b/src/test/resources/regression/verification/purescala/invalid/ListOperations.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/purescala/invalid/PropositionalLogic.scala b/src/test/resources/regression/verification/purescala/invalid/PropositionalLogic.scala
index 6cf45fb74..547978dbc 100644
--- a/src/test/resources/regression/verification/purescala/invalid/PropositionalLogic.scala
+++ b/src/test/resources/regression/verification/purescala/invalid/PropositionalLogic.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/purescala/invalid/RedBlackTree.scala b/src/test/resources/regression/verification/purescala/invalid/RedBlackTree.scala
index c37713f8e..f56a174de 100644
--- a/src/test/resources/regression/verification/purescala/invalid/RedBlackTree.scala
+++ b/src/test/resources/regression/verification/purescala/invalid/RedBlackTree.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/purescala/valid/AmortizedQueue.scala b/src/test/resources/regression/verification/purescala/valid/AmortizedQueue.scala
index 7486b49f3..006fbde9a 100644
--- a/src/test/resources/regression/verification/purescala/valid/AmortizedQueue.scala
+++ b/src/test/resources/regression/verification/purescala/valid/AmortizedQueue.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/purescala/valid/AssociativeList.scala b/src/test/resources/regression/verification/purescala/valid/AssociativeList.scala
index 5fd977e8b..39cc5b732 100644
--- a/src/test/resources/regression/verification/purescala/valid/AssociativeList.scala
+++ b/src/test/resources/regression/verification/purescala/valid/AssociativeList.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/purescala/valid/InsertionSort.scala b/src/test/resources/regression/verification/purescala/valid/InsertionSort.scala
index 4e0d60a94..7c89f3646 100644
--- a/src/test/resources/regression/verification/purescala/valid/InsertionSort.scala
+++ b/src/test/resources/regression/verification/purescala/valid/InsertionSort.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/purescala/valid/ListOperations.scala b/src/test/resources/regression/verification/purescala/valid/ListOperations.scala
index 341c3ec85..72a27c049 100644
--- a/src/test/resources/regression/verification/purescala/valid/ListOperations.scala
+++ b/src/test/resources/regression/verification/purescala/valid/ListOperations.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/purescala/valid/PropositionalLogic.scala b/src/test/resources/regression/verification/purescala/valid/PropositionalLogic.scala
index 2ca4e27fd..66e3f84ec 100644
--- a/src/test/resources/regression/verification/purescala/valid/PropositionalLogic.scala
+++ b/src/test/resources/regression/verification/purescala/valid/PropositionalLogic.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/purescala/valid/RedBlackTree.scala b/src/test/resources/regression/verification/purescala/valid/RedBlackTree.scala
index 12cfc679e..e24935bbe 100644
--- a/src/test/resources/regression/verification/purescala/valid/RedBlackTree.scala
+++ b/src/test/resources/regression/verification/purescala/valid/RedBlackTree.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/purescala/valid/SearchLinkedList.scala b/src/test/resources/regression/verification/purescala/valid/SearchLinkedList.scala
index f66557f0d..882dfa140 100644
--- a/src/test/resources/regression/verification/purescala/valid/SearchLinkedList.scala
+++ b/src/test/resources/regression/verification/purescala/valid/SearchLinkedList.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.lang._
 import leon.annotation._
 
diff --git a/src/test/resources/regression/verification/purescala/valid/Subtyping1.scala b/src/test/resources/regression/verification/purescala/valid/Subtyping1.scala
index 35bae3725..c7e8bd533 100644
--- a/src/test/resources/regression/verification/purescala/valid/Subtyping1.scala
+++ b/src/test/resources/regression/verification/purescala/valid/Subtyping1.scala
@@ -1,5 +1,7 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
+import leon.lang._
+
 object Subtyping1 {
 
   sealed abstract class Tree
diff --git a/src/test/resources/regression/verification/xlang/invalid/Mean.scala b/src/test/resources/regression/verification/xlang/invalid/Mean.scala
index 9d1fd563c..02240e73b 100644
--- a/src/test/resources/regression/verification/xlang/invalid/Mean.scala
+++ b/src/test/resources/regression/verification/xlang/invalid/Mean.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/resources/regression/verification/xlang/valid/Mean.scala b/src/test/resources/regression/verification/xlang/valid/Mean.scala
index 16e032896..155b7095a 100644
--- a/src/test/resources/regression/verification/xlang/valid/Mean.scala
+++ b/src/test/resources/regression/verification/xlang/valid/Mean.scala
@@ -1,6 +1,5 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-import scala.collection.immutable.Set
 import leon.annotation._
 import leon.lang._
 
diff --git a/src/test/scala/leon/test/LeonTestSuite.scala b/src/test/scala/leon/test/LeonTestSuite.scala
index 0c8f08b70..c43e597a6 100644
--- a/src/test/scala/leon/test/LeonTestSuite.scala
+++ b/src/test/scala/leon/test/LeonTestSuite.scala
@@ -103,7 +103,6 @@ trait LeonTestSuite extends FunSuite with Timeouts with BeforeAndAfterEach {
   }
 
   override def test(name: String, tags: Tag*)(body: => Unit) {
-
     super.test(name, tags: _*) {
       val id = testIdentifier(name)
 
diff --git a/src/test/scala/leon/test/codegen/CodeGenTests.scala b/src/test/scala/leon/test/codegen/CodeGenTests.scala
index 9142374f7..88f1481f7 100644
--- a/src/test/scala/leon/test/codegen/CodeGenTests.scala
+++ b/src/test/scala/leon/test/codegen/CodeGenTests.scala
@@ -127,7 +127,8 @@ class CodeGenTests extends test.LeonTestSuite {
 
 
   val code = """
-    
+    import leon.lang._
+
     object simple {
       abstract class Abs
       case class Conc(x : Int) extends Abs
diff --git a/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala b/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala
index 87d5a2d07..81eee7077 100644
--- a/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala
+++ b/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala
@@ -298,7 +298,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
   }
 
   test("Sets") {
-    val p = """|object Program {
+    val p = """|import leon.lang._
+               |object Program {
                |  sealed abstract class List
                |  case class Nil() extends List
                |  case class Cons(head : Int, tail : List) extends List
@@ -343,20 +344,21 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
   }
 
   test("Maps") {
-    val p = """|object Program {
-               |sealed abstract class PList
-               |case class PNil() extends PList
-               |case class PCons(headfst : Int, headsnd : Int, tail : PList) extends PList
+    val p = """|import leon.lang._
+               |object Program {
+               |  sealed abstract class PList
+               |  case class PNil() extends PList
+               |  case class PCons(headfst : Int, headsnd : Int, tail : PList) extends PList
                |
-               |def toMap(pl : PList) : Map[Int,Int] = pl match {
-               |  case PNil() => Map.empty[Int,Int]
-               |  case PCons(f,s,xs) => toMap(xs).updated(f, s)
-               |}
+               |  def toMap(pl : PList) : Map[Int,Int] = pl match {
+               |    case PNil() => Map.empty[Int,Int]
+               |    case PCons(f,s,xs) => toMap(xs).updated(f, s)
+               |  }
                |
-               |def finite0() : Map[Int,Int] = Map[Int, Int]()
-               |def finite1() : Map[Int,Int] = Map(1 -> 2)
-               |def finite2() : Map[Int,Int] = Map(2 -> 3, 1 -> 2)
-               |def finite3() : Map[Int,Int] = finite1().updated(2, 3)
+               |  def finite0() : Map[Int,Int] = Map[Int, Int]()
+               |  def finite1() : Map[Int,Int] = Map(1 -> 2)
+               |  def finite2() : Map[Int,Int] = Map(2 -> 3, 1 -> 2)
+               |  def finite3() : Map[Int,Int] = finite1().updated(2, 3)
                |}""".stripMargin
 
     implicit val prog = parseString(p)
@@ -377,7 +379,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
   }
 
   test("Arrays") {
-    val p = """|object Program {
+    val p = """|import leon.lang._
+               |object Program {
                |  def boolArrayRead(bools : Array[Boolean], index : Int) : Boolean = bools(index)
                |
                |  def intArrayRead(ints : Array[Int], index : Int) : Int = ints(index)
@@ -410,7 +413,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
   }
 
   test("Sets and maps of structures") {
-    val p = """|object Program {
+    val p = """|import leon.lang._
+               |object Program {
                |  case class MyPair(x : Int, y : Boolean)
                |
                |  def buildPairCC(x : Int, y : Boolean) : MyPair = MyPair(x,y)
@@ -432,7 +436,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
   }
 
   test("Executing Chooses") {
-    val p = """|object Program {
+    val p = """|import leon.lang._
+               |object Program {
                |  import leon.lang._
                |  import leon.lang.synthesis._
                |
@@ -451,7 +456,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
   test("Infinite Recursion") {
     import leon.codegen._
 
-    val p = """|object Program {
+    val p = """|import leon.lang._
+               |object Program {
                |  import leon.lang._
                |
                |  def c(i : Int) : Int = c(i-1)
@@ -467,7 +473,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
   test("Wrong Contracts") {
     import leon.codegen._
 
-    val p = """|object Program {
+    val p = """|import leon.lang._
+               |object Program {
                |  import leon.lang._
                |
                |  def c(i : Int) : Int = {
@@ -484,7 +491,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
   }
 
   test("Pattern Matching") {
-    val p = """|object Program {
+    val p = """|import leon.lang._
+               |object Program {
                |  abstract class List;
                |  case class Cons(h: Int, t: List) extends List;
                |  case object Nil extends List;
diff --git a/src/test/scala/leon/test/verification/NewSolversRegression.scala b/src/test/scala/leon/test/verification/NewSolversRegression.scala
index 2a287efd2..558621bb2 100644
--- a/src/test/scala/leon/test/verification/NewSolversRegression.scala
+++ b/src/test/scala/leon/test/verification/NewSolversRegression.scala
@@ -42,7 +42,4 @@ class NewSolversRegression extends VerificationRegression {
       else Nil
     )
   }
-  
-  test()
-
 }
diff --git a/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala b/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala
index bf9256a41..0221488a5 100644
--- a/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala
+++ b/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala
@@ -46,6 +46,4 @@ class PureScalaVerificationRegression extends VerificationRegression {
     )
   }
 
-  test()
-
 }
diff --git a/src/test/scala/leon/test/verification/VerificationRegression.scala b/src/test/scala/leon/test/verification/VerificationRegression.scala
index 0f46c569b..a03cfcd97 100644
--- a/src/test/scala/leon/test/verification/VerificationRegression.scala
+++ b/src/test/scala/leon/test/verification/VerificationRegression.scala
@@ -10,6 +10,7 @@ import leon.purescala.Definitions.Program
 import leon.frontends.scalac.ExtractionPhase
 import leon.utils.PreprocessingPhase
 
+import org.scalatest.{Reporter => TestReporter, _}
 
 // If you add another regression test, make sure it contains one object whose name matches the file name
 // This is because we compile all tests from each folder separately.
@@ -29,22 +30,36 @@ trait VerificationRegression extends LeonTestSuite {
   val pipeBack : Pipeline[Program, VerificationReport]
 
   private def mkTest(files: List[String])(block: Output=>Unit) = {
-    val extraction = 
+    val extraction =
       ExtractionPhase andThen
       PreprocessingPhase andThen
       pipeFront
 
-    val ast = extraction.run(createLeonContext(files:_*))(files)
-    val programs = {
-      val (user, lib) = ast.units partition { _.isMainUnit }
-      user map { u => Program(u.id.freshen, u :: lib) }
-    }
-    for (p <- programs; options <- optionVariants) {
-      test(f"${nextInt()}%3d: ${p.id.name} ${options.mkString(" ")}") {
-        val ctx = createLeonContext(options: _*)
-        val report = pipeBack.run(ctx)(p)
-        block(Output(report, ctx.reporter))
+    val ctx = createLeonContext(files:_*)
+
+    try {
+      val ast = extraction.run(ctx)(files)
+      val programs = {
+        val (user, lib) = ast.units partition { _.isMainUnit }
+        user map { u => Program(u.id.freshen, u :: lib) }
+      }
+      for (p <- programs; options <- optionVariants) {
+        test(f"${nextInt()}%3d: ${p.id.name} ${options.mkString(" ")}") {
+          val ctx = createLeonContext(options: _*)
+          val report = pipeBack.run(ctx)(p)
+          block(Output(report, ctx.reporter))
+        }
       }
+    } catch {
+      case _: LeonFatalError =>
+        ctx.reporter match {
+          case sr: TestSilentReporter =>
+            println("Unnexpected Fatal error:")
+            for (e <- sr.lastErrors) {
+              println(" "+e)
+            }
+          case _ =>
+        }
     }
   }
 
@@ -61,7 +76,7 @@ trait VerificationRegression extends LeonTestSuite {
     mkTest(files)(block)
   }
 
-  def test() = {
+  override def run(testName: Option[String], args: Args): Status = {
     forEachFileIn("valid") { output =>
       val Output(report, reporter) = output
       for ((vc, vr) <- report.vrs) {
@@ -79,5 +94,7 @@ trait VerificationRegression extends LeonTestSuite {
       assert(report.totalUnknown === 0,
         "There should not be unknown verification conditions.")
     }
+
+    super.run(testName, args)
   }
 }
-- 
GitLab