From fecfef7f5b46b1c4b7e1484ea4b0a9cb470b47ae Mon Sep 17 00:00:00 2001
From: Nicolas Voirol <voirol.nicolas@gmail.com>
Date: Sun, 23 Oct 2016 22:04:46 +0200
Subject: [PATCH] Better TreeDeconstructor instantiation system

---
 src/main/scala/inox/ast/Extractors.scala | 11 ++++++++---
 src/main/scala/inox/ast/TreeOps.scala    | 17 ++---------------
 2 files changed, 10 insertions(+), 18 deletions(-)

diff --git a/src/main/scala/inox/ast/Extractors.scala b/src/main/scala/inox/ast/Extractors.scala
index 4582f9cb0..f7e261e88 100644
--- a/src/main/scala/inox/ast/Extractors.scala
+++ b/src/main/scala/inox/ast/Extractors.scala
@@ -231,14 +231,19 @@ trait TreeDeconstructor {
   * [[TreeDeconstructor]] instance. */
 trait Extractors { self: Trees =>
 
-  val deconstructor: TreeDeconstructor {
+  def getDeconstructor(that: Trees): TreeDeconstructor {
     val s: self.type
-    val t: self.type
+    val t: that.type
   } = new TreeDeconstructor {
     protected val s: self.type = self
-    protected val t: self.type = self
+    protected val t: that.type = that
   }
 
+  val deconstructor: TreeDeconstructor {
+    val s: self.type
+    val t: self.type
+  } = getDeconstructor(self)
+
   /** Operator Extractor to extract any Expression in a consistent way.
     *
     * You can match on any Inox Expr, and then get both a Seq[Expr] of
diff --git a/src/main/scala/inox/ast/TreeOps.scala b/src/main/scala/inox/ast/TreeOps.scala
index 5aeeef5aa..7116a0ee9 100644
--- a/src/main/scala/inox/ast/TreeOps.scala
+++ b/src/main/scala/inox/ast/TreeOps.scala
@@ -12,11 +12,6 @@ trait TreeOps { self: Trees =>
   trait SelfTreeTransformer extends TreeTransformer {
     val s: self.type = self
     val t: self.type = self
-
-    lazy val deconstructor: TreeDeconstructor {
-      val s: self.type
-      val t: self.type
-    } = self.deconstructor
   }
 
   trait IdentityTreeTransformer extends SelfTreeTransformer {
@@ -57,10 +52,10 @@ trait TreeTransformer {
   val s: Trees
   val t: Trees
 
-  val deconstructor: TreeDeconstructor {
+  lazy val deconstructor: TreeDeconstructor {
     val s: TreeTransformer.this.s.type
     val t: TreeTransformer.this.t.type
-  }
+  } = s.getDeconstructor(t)
 
   def transform(id: Identifier, tpe: s.Type): (Identifier, t.Type) = (id, transform(tpe))
 
@@ -231,14 +226,6 @@ trait TreeTransformer {
   } = new TreeTransformerComposition {
     val t1: TreeTransformer.this.type = TreeTransformer.this
     val t2: that.type = that
-
-    lazy val deconstructor: TreeDeconstructor {
-      val s: TreeTransformer.this.s.type
-      val t: that.t.type
-    } = new TreeDeconstructor {
-      protected val s: TreeTransformer.this.s.type = TreeTransformer.this.s
-      protected val t: that.t.type = that.t
-    }
   }
 }
 
-- 
GitLab