From 8eef6f0c274d6ce902c03aa5a9f054b8e8ccf65d Mon Sep 17 00:00:00 2001
From: Nicolas Voirol <voirol.nicolas@gmail.com>
Date: Tue, 11 Oct 2016 16:58:47 +0200
Subject: [PATCH] Nicer abstract Symbol member overrides

---
 src/main/scala/inox/ast/Extractors.scala    |  3 +++
 src/main/scala/inox/ast/SimpleSymbols.scala | 13 ++++++-------
 src/main/scala/inox/package.scala           |  8 ++++----
 3 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/src/main/scala/inox/ast/Extractors.scala b/src/main/scala/inox/ast/Extractors.scala
index cecd9b426..4582f9cb0 100644
--- a/src/main/scala/inox/ast/Extractors.scala
+++ b/src/main/scala/inox/ast/Extractors.scala
@@ -234,6 +234,9 @@ trait Extractors { self: Trees =>
   val deconstructor: TreeDeconstructor {
     val s: self.type
     val t: self.type
+  } = new TreeDeconstructor {
+    protected val s: self.type = self
+    protected val t: self.type = self
   }
 
   /** Operator Extractor to extract any Expression in a consistent way.
diff --git a/src/main/scala/inox/ast/SimpleSymbols.scala b/src/main/scala/inox/ast/SimpleSymbols.scala
index bd5e6ddf2..36c2afda0 100644
--- a/src/main/scala/inox/ast/SimpleSymbols.scala
+++ b/src/main/scala/inox/ast/SimpleSymbols.scala
@@ -5,19 +5,18 @@ package ast
 
 trait SimpleSymbols { self: Trees =>
 
-  val NoSymbols = new Symbols(Map.empty, Map.empty)
+  val NoSymbols = Symbols(Map.empty, Map.empty)
 
-  class Symbols(
-    val functions: Map[Identifier, FunDef],
-    val adts: Map[Identifier, ADTDefinition]
-  ) extends AbstractSymbols {
+  val Symbols: (Map[Identifier, FunDef], Map[Identifier, ADTDefinition]) => Symbols
 
-    def withFunctions(functions: Seq[FunDef]): Symbols = new Symbols(
+  abstract class SimpleSymbols extends AbstractSymbols { self: Symbols =>
+
+    def withFunctions(functions: Seq[FunDef]): Symbols = Symbols(
       this.functions ++ functions.map(fd => fd.id -> fd),
       this.adts
     )
 
-    def withADTs(adts: Seq[ADTDefinition]): Symbols = new Symbols(
+    def withADTs(adts: Seq[ADTDefinition]): Symbols = Symbols(
       this.functions,
       this.adts ++ adts.map(adt => adt.id -> adt)
     )
diff --git a/src/main/scala/inox/package.scala b/src/main/scala/inox/package.scala
index bf2325f00..14426583e 100644
--- a/src/main/scala/inox/package.scala
+++ b/src/main/scala/inox/package.scala
@@ -42,9 +42,9 @@ package object inox {
   }
 
   object trees extends ast.Trees with ast.SimpleSymbols {
-    object deconstructor extends {
-      protected val s: trees.type = trees
-      protected val t: trees.type = trees
-    } with ast.TreeDeconstructor
+    case class Symbols(
+      functions: Map[Identifier, FunDef],
+      adts: Map[Identifier, ADTDefinition]
+    ) extends SimpleSymbols
   }
 }
-- 
GitLab