From af6c55b1d98c747fd6ada8d04e39828e1e965563 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com>
Date: Mon, 16 Apr 2012 22:32:27 +0000
Subject: [PATCH] Keeping position of Match expression and call to nested
 function

---
 src/main/scala/leon/FunctionClosure.scala           | 8 ++------
 src/main/scala/leon/FunctionHoisting.scala          | 2 +-
 src/main/scala/leon/ImperativeCodeElimination.scala | 2 +-
 src/main/scala/leon/UnitElimination.scala           | 2 +-
 4 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/src/main/scala/leon/FunctionClosure.scala b/src/main/scala/leon/FunctionClosure.scala
index 47c0be139..f21f1ad9f 100644
--- a/src/main/scala/leon/FunctionClosure.scala
+++ b/src/main/scala/leon/FunctionClosure.scala
@@ -58,7 +58,7 @@ object FunctionClosure extends Pass {
       newFunDef.postcondition = postcondition.map(expr => replace(freshVarsExpr, expr))
 
       def substFunInvocInDef(expr: Expr): Option[Expr] = expr match {
-        case FunctionInvocation(fd, args) if fd.id == id => Some(FunctionInvocation(newFunDef, args ++ extraVarDecls.map(_.id.toVariable)))
+        case fi@FunctionInvocation(fd, args) if fd.id == id => Some(FunctionInvocation(newFunDef, args ++ extraVarDecls.map(_.id.toVariable)).setPosInfo(fi))
         case _ => None
       }
       val freshBody = replace(freshVarsExpr, funBody)
@@ -70,17 +70,13 @@ object FunctionClosure extends Pass {
       newFunDef.body = Some(recBody2)
 
       def substFunInvocInRest(expr: Expr): Option[Expr] = expr match {
-        case FunctionInvocation(fd, args) if fd.id == id => Some(FunctionInvocation(newFunDef, args ++ capturedVarsWithConstraints.map(_.toVariable)))
+        case fi@FunctionInvocation(fd, args) if fd.id == id => Some(FunctionInvocation(newFunDef, args ++ capturedVarsWithConstraints.map(_.toVariable)).setPosInfo(fi))
         case _ => None
       }
       val recRest = functionClosure(rest, bindedVars)
       val recRest2 = searchAndReplaceDFS(substFunInvocInRest)(recRest)
       LetDef(newFunDef, recRest2).setType(l.getType)
     }
-
-    //case fi @ FunctionInvocation(fd, args) => {
-
-    //}
     case l @ Let(i,e,b) => {
       val re = functionClosure(e, bindedVars)
       pathConstraints ::= Equals(Variable(i), re)
diff --git a/src/main/scala/leon/FunctionHoisting.scala b/src/main/scala/leon/FunctionHoisting.scala
index ec02d4336..1cfdffdc3 100644
--- a/src/main/scala/leon/FunctionHoisting.scala
+++ b/src/main/scala/leon/FunctionHoisting.scala
@@ -65,7 +65,7 @@ object FunctionHoisting extends Pass {
           (GuardedCase(pat, guard, r), s)
         }
       }.unzip
-      (MatchExpr(scrutRes, csesRes).setType(m.getType), csesSets.toSet.flatten ++ scrutSet)
+      (MatchExpr(scrutRes, csesRes).setType(m.getType).setPosInfo(m), csesSets.toSet.flatten ++ scrutSet)
     }
     case t if t.isInstanceOf[Terminal] => (t, Set())
     case unhandled => scala.sys.error("Non-terminal case should be handled in searchAndReplace: " + unhandled)
diff --git a/src/main/scala/leon/ImperativeCodeElimination.scala b/src/main/scala/leon/ImperativeCodeElimination.scala
index c60dd94b2..9c21a5d2a 100644
--- a/src/main/scala/leon/ImperativeCodeElimination.scala
+++ b/src/main/scala/leon/ImperativeCodeElimination.scala
@@ -107,7 +107,7 @@ object ImperativeCodeElimination extends Pass {
         val matchExpr = MatchExpr(scrutRes, cses.zip(newRhs).map{
           case (SimpleCase(pat, _), newRhs) => SimpleCase(pat, newRhs)
           case (GuardedCase(pat, guard, _), newRhs) => GuardedCase(pat, replaceNames(scrutFun, guard), newRhs)
-        }).setType(matchType)
+        }).setType(matchType).setPosInfo(m)
 
         val scope = ((body: Expr) => {
           val tupleId = FreshIdentifier("t").setType(matchType)
diff --git a/src/main/scala/leon/UnitElimination.scala b/src/main/scala/leon/UnitElimination.scala
index 005544d9b..b52561750 100644
--- a/src/main/scala/leon/UnitElimination.scala
+++ b/src/main/scala/leon/UnitElimination.scala
@@ -135,7 +135,7 @@ object UnitElimination extends Pass {
           case GuardedCase(pat, guard, rhs) => GuardedCase(pat, removeUnit(guard), removeUnit(rhs))
         }
         val tpe = csesRec.head.rhs.getType
-        MatchExpr(scrutRec, csesRec).setType(tpe)
+        MatchExpr(scrutRec, csesRec).setType(tpe).setPosInfo(m)
       }
       case _ => sys.error("not supported: " + expr)
     }
-- 
GitLab