From 045a7274de2c8071459919ce5884060430b44ac6 Mon Sep 17 00:00:00 2001
From: Regis Blanc <regwblanc@gmail.com>
Date: Wed, 13 Apr 2016 16:42:56 +0200
Subject: [PATCH] fix extractors for Arrays

---
 src/main/scala/leon/purescala/Extractors.scala      |  8 +++++---
 .../scala/leon/unit/purescala/ExtractorsSuite.scala | 13 ++++++++++---
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala
index f331a1c8f..512cb6ebf 100644
--- a/src/main/scala/leon/purescala/Extractors.scala
+++ b/src/main/scala/leon/purescala/Extractors.scala
@@ -228,10 +228,12 @@ object Extractors {
         (as: Seq[Expr]) => ArrayUpdated(as(0), as(1), as(2))
       ))
       case NonemptyArray(elems, Some((default, length))) =>
-        val all = elems.values.toSeq :+ default :+ length
+        val elemsSeq: Seq[(Int, Expr)] = elems.toSeq
+        val all = elemsSeq.map(_._2) :+ default :+ length
         Some((all, as => {
           val l = as.length
-          nonemptyArray(as.take(l - 2), Some((as(l - 2), as(l - 1))))
+          NonemptyArray(elemsSeq.map(_._1).zip(as.take(l - 2)).toMap, 
+                        Some((as(l - 2), as(l - 1))))
         }))
       case na @ NonemptyArray(elems, None) =>
         val ArrayType(tpe) = na.getType
@@ -239,7 +241,7 @@ object Extractors {
 
         Some((
           elsOrdered,
-          es => finiteArray(indexes.zip(es).toMap, None, tpe)
+          es => NonemptyArray(indexes.zip(es).toMap, None)
         ))
       case Tuple(args) => Some((args, es => Tuple(es)))
       case IfExpr(cond, thenn, elze) => Some((
diff --git a/src/test/scala/leon/unit/purescala/ExtractorsSuite.scala b/src/test/scala/leon/unit/purescala/ExtractorsSuite.scala
index 8c99385b4..c09c39fe4 100644
--- a/src/test/scala/leon/unit/purescala/ExtractorsSuite.scala
+++ b/src/test/scala/leon/unit/purescala/ExtractorsSuite.scala
@@ -25,17 +25,24 @@ class ExtractorsSuite extends FunSuite with ExpressionsDSL {
     assert(e3 === e4)
   }
 
-  ignore("Extractors of NonemptyArray with sparse elements") {
+  test("Extractors of NonemptyArray with sparse elements") {
     val a1 = NonemptyArray(Map(0 -> x, 3 -> y, 5 -> z), Some((BigInt(0), BigInt(10))))
-
     val a2 = a1 match {
       case Operator(es, builder) => {
         assert(es === Seq(x, y, z, InfiniteIntegerLiteral(0), InfiniteIntegerLiteral(10)))
         builder(es)
       }
     }
-
     assert(a2 === a1)
+
+    val a3 = NonemptyArray(Map(0 -> x, 1 -> y, 2 -> z), None)
+    val a4 = a3 match {
+      case Operator(es, builder) => {
+        assert(es === Seq(x, y, z))
+        builder(es)
+      }
+    }
+    assert(a3 === a4)
   }
 
 }
-- 
GitLab