From 738188ea25d5e78f779b75a88422bd7484b1ef08 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Wed, 3 Feb 2016 18:27:43 +0100
Subject: [PATCH] Remove ValDef.isLazy, treat byName argument during extraction
 alone

---
 .../leon/frontends/scalac/CodeExtraction.scala     | 14 +++++++++++---
 .../invariant/engine/UnfoldingTemplateSolver.scala |  2 +-
 src/main/scala/leon/invariant/util/TreeUtil.scala  |  2 +-
 src/main/scala/leon/purescala/Constructors.scala   |  4 ++--
 src/main/scala/leon/purescala/Definitions.scala    |  2 +-
 src/main/scala/leon/purescala/PrettyPrinter.scala  |  4 ++--
 .../scala/leon/purescala/ScopeSimplifier.scala     |  4 ++--
 src/main/scala/leon/synthesis/ExamplesFinder.scala |  2 +-
 .../synthesis/disambiguation/ExamplesAdder.scala   | 14 +++++++-------
 .../leon/transformations/IntToRealProgram.scala    |  4 ++--
 .../SerialInstrumentationPhase.scala               |  4 ++--
 11 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
index b76198f5d..3e9366400 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -625,6 +625,8 @@ trait CodeExtraction extends ASTExtractors {
       }
     }
 
+    private var isLazy = Set[LeonValDef]()
+
     private var defsToDefs = Map[Symbol, FunDef]()
 
     private def defineFunDef(sym: Symbol, within: Option[LeonClassDef] = None)(implicit dctx: DefContext): FunDef = {
@@ -638,7 +640,13 @@ trait CodeExtraction extends ASTExtractors {
         val tpe = if (sym.isByNameParam) FunctionType(Seq(), ptpe) else ptpe
         val newID = FreshIdentifier(sym.name.toString, tpe).setPos(sym.pos)
         owners += (newID -> None)
-        LeonValDef(newID, sym.isByNameParam).setPos(sym.pos)
+        val vd = LeonValDef(newID).setPos(sym.pos)
+
+        if (sym.isByNameParam) {
+          isLazy += vd
+        }
+
+        vd
       }
 
       val tparamsDef = tparams.map(t => TypeParameterDef(t._2))
@@ -1534,7 +1542,7 @@ trait CodeExtraction extends ASTExtractors {
               val fd = getFunDef(sym, c.pos)
 
               val newTps = tps.map(t => extractType(t))
-              val argsByName = (fd.params zip args).map(p => if (p._1.isLazy) Lambda(Seq(), p._2) else p._2)
+              val argsByName = (fd.params zip args).map(p => if (isLazy(p._1)) Lambda(Seq(), p._2) else p._2)
 
               FunctionInvocation(fd.typed(newTps), argsByName)
 
@@ -1543,7 +1551,7 @@ trait CodeExtraction extends ASTExtractors {
               val cd = methodToClass(fd)
 
               val newTps = tps.map(t => extractType(t))
-              val argsByName = (fd.params zip args).map(p => if (p._1.isLazy) Lambda(Seq(), p._2) else p._2)
+              val argsByName = (fd.params zip args).map(p => if (isLazy(p._1)) Lambda(Seq(), p._2) else p._2)
 
               MethodInvocation(rec, cd, fd.typed(newTps), argsByName)
 
diff --git a/src/main/scala/leon/invariant/engine/UnfoldingTemplateSolver.scala b/src/main/scala/leon/invariant/engine/UnfoldingTemplateSolver.scala
index 3fe13e7c9..d2deb1ced 100644
--- a/src/main/scala/leon/invariant/engine/UnfoldingTemplateSolver.scala
+++ b/src/main/scala/leon/invariant/engine/UnfoldingTemplateSolver.scala
@@ -42,7 +42,7 @@ class UnfoldingTemplateSolver(ctx: InferenceContext, program: Program, rootFd: F
 
   def constructVC(funDef: FunDef): (Expr, Expr) = {
     val body = funDef.body.get
-    val Lambda(Seq(ValDef(resid, _)), _) = funDef.postcondition.get
+    val Lambda(Seq(ValDef(resid)), _) = funDef.postcondition.get
     val resvar = resid.toVariable
 
     val simpBody = matchToIfThenElse(body)
diff --git a/src/main/scala/leon/invariant/util/TreeUtil.scala b/src/main/scala/leon/invariant/util/TreeUtil.scala
index 4109e5987..26398130a 100644
--- a/src/main/scala/leon/invariant/util/TreeUtil.scala
+++ b/src/main/scala/leon/invariant/util/TreeUtil.scala
@@ -182,7 +182,7 @@ object ProgramUtil {
     funDef.fullBody match {
       case Ensuring(_, post) => {
         post match {
-          case Lambda(Seq(ValDef(fromRes, _)), _) => Some(fromRes)
+          case Lambda(Seq(ValDef(fromRes)), _) => Some(fromRes)
         }
       }
       case _ => None
diff --git a/src/main/scala/leon/purescala/Constructors.scala b/src/main/scala/leon/purescala/Constructors.scala
index edcc53db2..e3ce7d1e0 100644
--- a/src/main/scala/leon/purescala/Constructors.scala
+++ b/src/main/scala/leon/purescala/Constructors.scala
@@ -327,9 +327,9 @@ object Constructors {
       var defs: Seq[(Identifier, Expr)] = Seq()
 
       val subst = formalArgs.zip(realArgs).map {
-        case (ValDef(from, _), to:Variable) =>
+        case (ValDef(from), to:Variable) =>
           from -> to
-        case (ValDef(from, _), e) =>
+        case (ValDef(from), e) =>
           val fresh = from.freshen
           defs :+= (fresh -> e)
           from -> Variable(fresh)
diff --git a/src/main/scala/leon/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala
index 792e43c56..8fb753d23 100644
--- a/src/main/scala/leon/purescala/Definitions.scala
+++ b/src/main/scala/leon/purescala/Definitions.scala
@@ -45,7 +45,7 @@ object Definitions {
    *  The optional tpe, if present, overrides the type of the underlying Identifier id
    *  This is useful to instantiate argument types of polymorphic functions
    */
-  case class ValDef(id: Identifier, isLazy: Boolean = false) extends Definition with Typed {
+  case class ValDef(id: Identifier) extends Definition with Typed {
     self: Serializable =>
 
     val getType = id.getType
diff --git a/src/main/scala/leon/purescala/PrettyPrinter.scala b/src/main/scala/leon/purescala/PrettyPrinter.scala
index f2be95fb0..99663384d 100644
--- a/src/main/scala/leon/purescala/PrettyPrinter.scala
+++ b/src/main/scala/leon/purescala/PrettyPrinter.scala
@@ -359,8 +359,8 @@ class PrettyPrinter(opts: PrinterOptions,
 
       case Not(expr) => p"\u00AC$expr"
 
-      case vd @ ValDef(id, lzy) =>
-        p"$id :${if (lzy) "=> " else ""} ${vd.getType}"
+      case vd @ ValDef(id) =>
+        p"$id : ${vd.getType}"
         vd.defaultValue.foreach { fd => p" = ${fd.body.get}" }
 
       case This(_)              => p"this"
diff --git a/src/main/scala/leon/purescala/ScopeSimplifier.scala b/src/main/scala/leon/purescala/ScopeSimplifier.scala
index 7bae40c5b..f0ff379ff 100644
--- a/src/main/scala/leon/purescala/ScopeSimplifier.scala
+++ b/src/main/scala/leon/purescala/ScopeSimplifier.scala
@@ -44,10 +44,10 @@ class ScopeSimplifier extends Transformer {
       }
       
       val fds_mapping = for((fd, newId) <- fds_newIds) yield {
-        val newArgs = for(ValDef(id, tpe) <- fd.params) yield {
+        val newArgs = for(ValDef(id) <- fd.params) yield {
           val newArg = genId(id, newScope)
           newScope = newScope.register(id -> newArg)
-          ValDef(newArg, tpe)
+          ValDef(newArg)
         }
   
         val newFd = fd.duplicate(id = newId, params = newArgs)
diff --git a/src/main/scala/leon/synthesis/ExamplesFinder.scala b/src/main/scala/leon/synthesis/ExamplesFinder.scala
index 3f144d88f..5077f9467 100644
--- a/src/main/scala/leon/synthesis/ExamplesFinder.scala
+++ b/src/main/scala/leon/synthesis/ExamplesFinder.scala
@@ -27,7 +27,7 @@ class ExamplesFinder(ctx0: LeonContext, program: Program) {
   val reporter = ctx.reporter
 
   def extractFromFunDef(fd: FunDef, partition: Boolean): ExamplesBank = fd.postcondition match {
-    case Some(Lambda(Seq(ValDef(id, _)), post)) =>
+    case Some(Lambda(Seq(ValDef(id)), post)) =>
       // @mk FIXME: make this more general
       val tests = extractTestsOf(post)
 
diff --git a/src/main/scala/leon/synthesis/disambiguation/ExamplesAdder.scala b/src/main/scala/leon/synthesis/disambiguation/ExamplesAdder.scala
index cfe8f456a..6e9dc2376 100644
--- a/src/main/scala/leon/synthesis/disambiguation/ExamplesAdder.scala
+++ b/src/main/scala/leon/synthesis/disambiguation/ExamplesAdder.scala
@@ -30,7 +30,7 @@ class ExamplesAdder(ctx0: LeonContext, program: Program) {
     val inputVariables = tupleWrap(fd.params.map(p => Variable(p.id): Expr))
     val newCases = examples.map{ case (in, out) => exampleToCase(in, out) }
     fd.postcondition match {
-      case Some(Lambda(Seq(ValDef(id, tpe)), post)) =>
+      case Some(Lambda(Seq(ValDef(id)), post)) =>
         if(fd.postcondition.exists { e => purescala.ExprOps.exists(_.isInstanceOf[Passes])(e) }) {
           post match {
             case TopLevelAnds(exprs) =>
@@ -39,7 +39,7 @@ class ExamplesAdder(ctx0: LeonContext, program: Program) {
                 case _ => false
               } }
               if(i == -1) {
-                fd.postcondition = Some(Lambda(Seq(ValDef(id, tpe)), and(post, Passes(inputVariables, Variable(id), newCases))))
+                fd.postcondition = Some(Lambda(Seq(ValDef(id)), and(post, Passes(inputVariables, Variable(id), newCases))))
                 //ctx0.reporter.info("No top-level passes in postcondition, adding it:  " + fd)
               } else {
                 val newPasses = exprs(i) match {
@@ -48,21 +48,21 @@ class ExamplesAdder(ctx0: LeonContext, program: Program) {
                   case _ => ???
                 }
                 val newPost = and(exprs.updated(i, newPasses) : _*)
-                fd.postcondition = Some(Lambda(Seq(ValDef(id, tpe)), newPost))
+                fd.postcondition = Some(Lambda(Seq(ValDef(id)), newPost))
                 //ctx0.reporter.info("Adding the example to the passes postcondition: " + fd)
               }
           }
         } else {
-          fd.postcondition = Some(Lambda(Seq(ValDef(id, tpe)), and(post, Passes(inputVariables, Variable(id), newCases))))
+          fd.postcondition = Some(Lambda(Seq(ValDef(id)), and(post, Passes(inputVariables, Variable(id), newCases))))
           //ctx0.reporter.info("No passes in postcondition, adding it:" + fd)
         }
       case None =>
         val id = FreshIdentifier("res", fd.returnType, false)
-        fd.postcondition = Some(Lambda(Seq(ValDef(id, false)), Passes(inputVariables, Variable(id), newCases)))
+        fd.postcondition = Some(Lambda(Seq(ValDef(id)), Passes(inputVariables, Variable(id), newCases)))
         //ctx0.reporter.info("No postcondition, adding it: " + fd)
     }
     fd.body match { // TODO: Is it correct to discard the choose construct inside the body?
-      case Some(Choose(Lambda(Seq(ValDef(id, tpe)), bodyChoose))) => fd.body = Some(Hole(id.getType, Nil))
+      case Some(Choose(Lambda(Seq(ValDef(id)), bodyChoose))) => fd.body = Some(Hole(id.getType, Nil))
       case _ =>
     }
   }
@@ -76,4 +76,4 @@ class ExamplesAdder(ctx0: LeonContext, program: Program) {
       MatchCase(inPattern, None, out)
     }
   }
- }
\ No newline at end of file
+ }
diff --git a/src/main/scala/leon/transformations/IntToRealProgram.scala b/src/main/scala/leon/transformations/IntToRealProgram.scala
index 5ab169913..0c313f2ff 100644
--- a/src/main/scala/leon/transformations/IntToRealProgram.scala
+++ b/src/main/scala/leon/transformations/IntToRealProgram.scala
@@ -140,9 +140,9 @@ abstract class ProgramTypeTransformer {
       // FIXME
       //add a new postcondition
       newfd.fullBody = if (fd.postcondition.isDefined && newfd.body.isDefined) {
-        val Lambda(Seq(ValDef(resid, lzy)), pexpr) = fd.postcondition.get
+        val Lambda(Seq(ValDef(resid)), pexpr) = fd.postcondition.get
         val tempRes = mapId(resid).toVariable
-        Ensuring(newfd.body.get, Lambda(Seq(ValDef(tempRes.id, lzy)), transformExpr(pexpr)))
+        Ensuring(newfd.body.get, Lambda(Seq(ValDef(tempRes.id)), transformExpr(pexpr)))
         // Some(mapId(resid), transformExpr(pexpr))
       } else NoTree(fd.returnType)
 
diff --git a/src/main/scala/leon/transformations/SerialInstrumentationPhase.scala b/src/main/scala/leon/transformations/SerialInstrumentationPhase.scala
index c4830cf40..2e2e5c832 100644
--- a/src/main/scala/leon/transformations/SerialInstrumentationPhase.scala
+++ b/src/main/scala/leon/transformations/SerialInstrumentationPhase.scala
@@ -111,7 +111,7 @@ class SerialInstrumenter(ctx: LeonContext, program: Program) {
 
     def mapPost(pred: Expr, from: FunDef, to: FunDef) = {
       pred match {
-        case Lambda(Seq(ValDef(fromRes, lzy)), postCond) if (instFuncs.contains(from)) =>
+        case Lambda(Seq(ValDef(fromRes)), postCond) if (instFuncs.contains(from)) =>
           val toResId = FreshIdentifier(fromRes.name, to.returnType, true)
           val newpost = postMap((e: Expr) => e match {
             case Variable(`fromRes`) =>
@@ -124,7 +124,7 @@ class SerialInstrumenter(ctx: LeonContext, program: Program) {
             case _ =>
               None
           })(postCond)
-          Lambda(Seq(ValDef(toResId, lzy)), mapExpr(newpost))
+          Lambda(Seq(ValDef(toResId)), mapExpr(newpost))
         case _ =>
           mapExpr(pred)
       }
-- 
GitLab