From 710769d2ef0fa9e48a8ec2c6cd99af6b3e217fc0 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <colder@php.net>
Date: Tue, 8 Oct 2013 19:12:07 +0200
Subject: [PATCH] Support for literal arrays

---
 src/main/scala/leon/plugin/CodeExtraction.scala |  9 ++++++---
 src/main/scala/leon/plugin/Extractors.scala     | 17 +++++++++++++++++
 .../purescala/valid/ArrayLiterals.scala         |  8 ++++++++
 3 files changed, 31 insertions(+), 3 deletions(-)
 create mode 100644 src/test/resources/regression/verification/purescala/valid/ArrayLiterals.scala

diff --git a/src/main/scala/leon/plugin/CodeExtraction.scala b/src/main/scala/leon/plugin/CodeExtraction.scala
index 6f9c3101d..dd71afeec 100644
--- a/src/main/scala/leon/plugin/CodeExtraction.scala
+++ b/src/main/scala/leon/plugin/CodeExtraction.scala
@@ -310,8 +310,8 @@ trait CodeExtraction extends Extractors {
       throw new ImpureCodeEncounteredException(null)
     }
     def unsupported(tr: Tree, msg: String): Nothing = {
-      reporter.error(tr.pos, tr.toString)
       reporter.error(tr.pos, msg)
+      reporter.error(tr.pos, tr.toString)
       throw new ImpureCodeEncounteredException(tr)
     }
 
@@ -390,15 +390,18 @@ trait CodeExtraction extends Extractors {
       var rest = tmpRest
 
       val res = current match {
+        case ExArrayLiteral(tpe, args) =>
+          FiniteArray(args.map(extractTree)).setType(ArrayType(extractType(tpe)))
+
         case ExCaseObject(sym) =>
           classesToClasses.get(sym) match {
             case Some(ccd: CaseClassDef) =>
               CaseClass(ccd, Seq())
-
             case _ =>
-              unsupported(tr, "Unknown case class "+sym.name)
+              unsupported(tr, "Unknown case object "+sym.name)
           }
 
+
         case ExParameterlessMethodCall(t,n) if extractTree(t).getType.isInstanceOf[CaseClassType] =>
           val selector = extractTree(t)
           val selType = selector.getType
diff --git a/src/main/scala/leon/plugin/Extractors.scala b/src/main/scala/leon/plugin/Extractors.scala
index 00da888f6..8735654d7 100644
--- a/src/main/scala/leon/plugin/Extractors.scala
+++ b/src/main/scala/leon/plugin/Extractors.scala
@@ -310,6 +310,23 @@ trait Extractors {
       }
     }
 
+    object ExArrayLiteral {
+      def unapply(tree: Apply): Option[(Type, Seq[Tree])] = tree match {
+        case Apply(ExSelected("scala", "Array", "apply"), args) =>
+          tree.tpe match {
+            case TypeRef(_, _, List(t1)) =>
+              Some((t1, args))
+            case _ =>
+              None
+          }
+        case Apply(Apply(TypeApply(ExSelected("scala", "Array", "apply"), List(tpt)), args), ctags) =>
+          Some((tpt.tpe, args))
+
+        case _ =>
+          None
+      }
+    }
+
     object ExTuple {
       def unapply(tree: Apply): Option[(Seq[Type], Seq[Tree])] = tree match {
         case Apply(
diff --git a/src/test/resources/regression/verification/purescala/valid/ArrayLiterals.scala b/src/test/resources/regression/verification/purescala/valid/ArrayLiterals.scala
new file mode 100644
index 000000000..2ce0669e6
--- /dev/null
+++ b/src/test/resources/regression/verification/purescala/valid/ArrayLiterals.scala
@@ -0,0 +1,8 @@
+import leon.Utils._
+object Numerals {
+  def foo(): Int = {
+    val b : Array[Int] = Array[Int](1,2,3)
+    val a : Array[Int] = Array(1,2,3)
+    a.length
+  } ensuring { _ > 0 }
+}
-- 
GitLab