From 2caaa9598ff79ed2bf5a32a5a0e7bc8c0f4641b5 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Thu, 25 Jun 2015 18:44:19 +0200
Subject: [PATCH] Refactor TypedFunDef

---
 .../scala/leon/purescala/Definitions.scala    | 43 ++++---------------
 .../leon/termination/StructuralSize.scala     |  2 +-
 2 files changed, 10 insertions(+), 35 deletions(-)

diff --git a/src/main/scala/leon/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala
index 08d33ccf6..4ecc80676 100644
--- a/src/main/scala/leon/purescala/Definitions.scala
+++ b/src/main/scala/leon/purescala/Definitions.scala
@@ -59,8 +59,7 @@ object Definitions {
     def toVariable : Variable = Variable(id)
   }
 
-  /** A wrapper for a program. For now a program is simply a single object. The
-   * name is meaningless and we just use the package name as id. */
+  /** A wrapper for a program. For now a program is simply a single object. */
   case class Program(units: List[UnitDef]) extends Definition {
     val id = FreshIdentifier("program")
 
@@ -481,43 +480,19 @@ object Definitions {
     lazy val returnType: TypeTree = translated(fd.returnType)
 
     private var trCache = Map[Expr, Expr]()
-    private var postCache = Map[Expr, Expr]()
 
-    def fullBody = {
-      val fb = fd.fullBody
-      trCache.getOrElse(fb, {
-        val res = translated(fb)
-        trCache += fb -> res
+    private def cached(e: Expr): Expr = {
+      trCache.getOrElse(e, {
+        val res = translated(e)
+        trCache += e -> res
         res
       })
     }
 
-    def body = fd.body.map { b =>
-      trCache.getOrElse(b, {
-        val res = translated(b)
-        trCache += b -> res
-        res
-      })
-    }
-
-    def precondition = fd.precondition.map { pre =>
-      trCache.getOrElse(pre, {
-        val res = translated(pre)
-        trCache += pre -> res
-        res
-      })
-    }
-
-    def postcondition = fd.postcondition.map {
-      case post if typesMap.nonEmpty =>
-        postCache.getOrElse(post, {
-          val res = instantiateType(post, typesMap, paramsMap)
-          postCache += (post -> res)
-          res
-        })
-
-      case p => p
-    }
+    def fullBody      = cached(fd.fullBody)
+    def body          = fd.body map cached
+    def precondition  = fd.precondition map cached
+    def postcondition = fd.postcondition map cached
 
     def hasImplementation = body.isDefined
     def hasBody           = hasImplementation
diff --git a/src/main/scala/leon/termination/StructuralSize.scala b/src/main/scala/leon/termination/StructuralSize.scala
index 8656a2005..a6b08d598 100644
--- a/src/main/scala/leon/termination/StructuralSize.scala
+++ b/src/main/scala/leon/termination/StructuralSize.scala
@@ -35,7 +35,7 @@ trait StructuralSize {
       Variable(x),
       uminus(Variable(x))
     ))
-    TypedFunDef(absFun, Seq()) // Seq() because no generic type params
+    absFun.typed
   }
   
   def size(expr: Expr) : Expr = {
-- 
GitLab