From 682d8a5980de52e998e86a59b0ec9851c97b32f8 Mon Sep 17 00:00:00 2001
From: Nicolas Voirol <voirol.nicolas@gmail.com>
Date: Mon, 17 Oct 2016 19:55:32 +0200
Subject: [PATCH] Documented Trees#Identifier and added ADTDefinition transform

---
 src/main/scala/inox/ast/TreeOps.scala         | 62 ++++++++++---------
 src/main/scala/inox/ast/Trees.scala           | 15 +++++
 .../scala/inox/datagen/ModelEnumerator.scala  |  1 -
 .../scala/inox/datagen/SolverDataGen.scala    |  1 -
 .../inox/evaluators/RecursiveEvaluator.scala  |  1 -
 .../scala/inox/grammars/ClosureGrammars.scala |  2 -
 .../inox/grammars/ExpressionGrammars.scala    |  1 -
 .../scala/inox/grammars/ValueGrammars.scala   |  2 -
 .../scala/inox/grammars/utils/Helpers.scala   |  2 -
 src/main/scala/inox/solvers/ADTManagers.scala |  1 -
 .../inox/solvers/smtlib/CVC4Target.scala      |  1 -
 .../inox/solvers/smtlib/SMTLIBTarget.scala    |  1 -
 .../scala/inox/solvers/smtlib/Z3Target.scala  |  1 -
 .../inox/solvers/theories/BagEncoder.scala    |  2 -
 .../inox/solvers/theories/StringEncoder.scala |  1 -
 .../solvers/unrolling/DatatypeTemplates.scala |  1 -
 .../solvers/unrolling/FunctionTemplates.scala |  1 -
 .../solvers/unrolling/LambdaTemplates.scala   |  1 -
 .../unrolling/QuantificationTemplates.scala   |  1 -
 .../solvers/unrolling/TemplateGenerator.scala |  1 -
 .../inox/solvers/unrolling/Templates.scala    |  1 -
 .../solvers/unrolling/UnrollingSolver.scala   |  1 -
 .../inox/solvers/z3/AbstractZ3Solver.scala    |  1 -
 src/main/scala/inox/tip/Parser.scala          |  1 -
 src/main/scala/inox/tip/Printer.scala         |  2 -
 .../inox/transformers/ScopeSimplifier.scala   |  2 -
 26 files changed, 47 insertions(+), 60 deletions(-)

diff --git a/src/main/scala/inox/ast/TreeOps.scala b/src/main/scala/inox/ast/TreeOps.scala
index b4af9cdc1..5013774f7 100644
--- a/src/main/scala/inox/ast/TreeOps.scala
+++ b/src/main/scala/inox/ast/TreeOps.scala
@@ -163,10 +163,18 @@ trait TreeTransformer {
     }
   }
 
+  /* Type parameters can't be modified by transformed but they need to be
+   * translated into the new tree definitions given by `t`. */
+  @inline
+  protected[ast] final def transformTypeParams(tparams: Seq[s.TypeParameterDef]): Seq[t.TypeParameterDef] = {
+    if (s eq t) tparams.asInstanceOf[Seq[t.TypeParameterDef]]
+    else tparams.map(tdef => t.TypeParameterDef(t.TypeParameter(tdef.id)))
+  }
+
   final def transform(fd: s.FunDef): t.FunDef = {
     new t.FunDef(
       fd.id,
-      fd.tparams.map(tpd => t.TypeParameterDef(transform(tpd.tp).asInstanceOf[t.TypeParameter])),
+      transformTypeParams(fd.tparams),
       fd.params.map(transform),
       transform(fd.returnType),
       transform(fd.fullBody),
@@ -174,6 +182,25 @@ trait TreeTransformer {
     )
   }
 
+  final def transform(adt: s.ADTDefinition): t.ADTDefinition = adt match {
+    case sort: s.ADTSort if (s eq t) => sort.asInstanceOf[t.ADTSort]
+
+    case sort: s.ADTSort => new t.ADTSort(
+      sort.id,
+      transformTypeParams(sort.tparams),
+      sort.cons,
+      sort.flags map transform
+    )
+
+    case cons: s.ADTConstructor => new t.ADTConstructor(
+      cons.id,
+      transformTypeParams(cons.tparams),
+      cons.sort,
+      cons.fields map transform,
+      cons.flags map transform
+    )
+  }
+
   protected trait TreeTransformerComposition extends TreeTransformer {
     protected val t1: TreeTransformer
     protected val t2: TreeTransformer { val s: t1.t.type }
@@ -234,36 +261,11 @@ trait SymbolTransformer {
   def transform(tpe: s.Type): t.Type = transformer.transform(tpe)
   def transform(flag: s.Flag): t.Flag = transformer.transform(flag)
 
-  /* Type parameters can't be modified by transformed but they need to be
-   * translated into the new tree definitions given by `t`. */
-  protected def transformTypeParams(tparams: Seq[s.TypeParameterDef]): Seq[t.TypeParameterDef] = {
-    if (s eq t) tparams.asInstanceOf[Seq[t.TypeParameterDef]]
-    else tparams.map(tdef => t.TypeParameterDef(t.TypeParameter(tdef.id)))
-  }
+  @inline
+  protected def transformTypeParams(tparams: Seq[s.TypeParameterDef]) = transformer.transformTypeParams(tparams)
 
-  protected def transformFunction(fd: s.FunDef): t.FunDef = new t.FunDef(
-    fd.id,
-    transformTypeParams(fd.tparams),
-    fd.params.map(vd => transformer.transform(vd)),
-    transformer.transform(fd.returnType),
-    transformer.transform(fd.fullBody),
-    fd.flags.map(f => transformer.transform(f))
-  )
-
-  protected def transformADT(adt: s.ADTDefinition): t.ADTDefinition = adt match {
-    case sort: s.ADTSort if (s eq t) => sort.asInstanceOf[t.ADTSort]
-    case sort: s.ADTSort => new t.ADTSort(
-      sort.id,
-      transformTypeParams(sort.tparams),
-      sort.cons,
-      sort.flags.map(f => transformer.transform(f)))
-    case cons: s.ADTConstructor => new t.ADTConstructor(
-      cons.id,
-      transformTypeParams(cons.tparams),
-      cons.sort,
-      cons.fields.map(vd => transformer.transform(vd)),
-      cons.flags.map(f => transformer.transform(f)))
-  }
+  protected def transformFunction(fd: s.FunDef): t.FunDef = transformer.transform(fd)
+  protected def transformADT(adt: s.ADTDefinition): t.ADTDefinition = transformer.transform(adt)
 
   def transform(syms: s.Symbols): t.Symbols = t.NoSymbols
     .withFunctions(syms.functions.values.toSeq.map(transformFunction))
diff --git a/src/main/scala/inox/ast/Trees.scala b/src/main/scala/inox/ast/Trees.scala
index 272ff38c5..7b0f89a1a 100644
--- a/src/main/scala/inox/ast/Trees.scala
+++ b/src/main/scala/inox/ast/Trees.scala
@@ -15,6 +15,21 @@ trait Trees
      with Printers
      with TreeOps {
 
+  /** We provide aliases to [[ast.Identifier]] and [[ast.FreshIdentifier]] here in
+    * order for {{{import trees._}}} to also provide these. Note that this DOES NOT
+    * mean that [[Identifier]] or [[FreshIdentifier]] become dependent types!!
+    *
+    * I (@nv) feel it makes sense for all types necessary for expression/tree
+    * construction to be available from a single import. It would be rather
+    * counter-intuitive for an Inox user to have to go in search of the
+    * [[ast.Identifier]] type in the [[ast]] package when all other expression and
+    * definitions have been imported.
+    */
+  type Identifier = ast.Identifier
+
+  /** @see [[Identifier]] for a discussion about why this is here. */
+  val FreshIdentifier = ast.FreshIdentifier
+
   class Unsupported(t: Tree, msg: String)(implicit ctx: Context)
     extends Exception(s"${t.asString(PrinterOptions.fromContext(ctx))}@${t.getPos} $msg")
 
diff --git a/src/main/scala/inox/datagen/ModelEnumerator.scala b/src/main/scala/inox/datagen/ModelEnumerator.scala
index 060168a4a..6cfbc50d8 100644
--- a/src/main/scala/inox/datagen/ModelEnumerator.scala
+++ b/src/main/scala/inox/datagen/ModelEnumerator.scala
@@ -6,7 +6,6 @@ package datagen
 import evaluators._
 import solvers._
 import utils._
-import ast.FreshIdentifier
 
 trait ModelEnumerator {
   val program: Program
diff --git a/src/main/scala/inox/datagen/SolverDataGen.scala b/src/main/scala/inox/datagen/SolverDataGen.scala
index 432635247..257674268 100644
--- a/src/main/scala/inox/datagen/SolverDataGen.scala
+++ b/src/main/scala/inox/datagen/SolverDataGen.scala
@@ -6,7 +6,6 @@ package datagen
 import evaluators._
 import solvers._
 import utils._
-import ast.{FreshIdentifier, Identifier}
 
 trait SolverDataGen extends DataGenerator { self =>
   import program._
diff --git a/src/main/scala/inox/evaluators/RecursiveEvaluator.scala b/src/main/scala/inox/evaluators/RecursiveEvaluator.scala
index 4af6b1d73..d3b0e2da2 100644
--- a/src/main/scala/inox/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/inox/evaluators/RecursiveEvaluator.scala
@@ -4,7 +4,6 @@ package inox
 package evaluators
 
 import scala.collection.BitSet
-import ast.FreshIdentifier
 
 trait RecursiveEvaluator
   extends ContextualEvaluator
diff --git a/src/main/scala/inox/grammars/ClosureGrammars.scala b/src/main/scala/inox/grammars/ClosureGrammars.scala
index 2e9ad0ad5..cbf304ab5 100644
--- a/src/main/scala/inox/grammars/ClosureGrammars.scala
+++ b/src/main/scala/inox/grammars/ClosureGrammars.scala
@@ -3,8 +3,6 @@
 package inox
 package grammars
 
-import ast.FreshIdentifier
-
 trait ClosureGrammars { self: GrammarsUniverse =>
   import program._
   import trees._
diff --git a/src/main/scala/inox/grammars/ExpressionGrammars.scala b/src/main/scala/inox/grammars/ExpressionGrammars.scala
index 85b15fc40..0bc1bf875 100644
--- a/src/main/scala/inox/grammars/ExpressionGrammars.scala
+++ b/src/main/scala/inox/grammars/ExpressionGrammars.scala
@@ -3,7 +3,6 @@
 package inox
 package grammars
 
-import ast.FreshIdentifier
 import scala.collection.mutable.{HashMap => MutableMap}
 
 /** Represents a context-free grammar of expressions */
diff --git a/src/main/scala/inox/grammars/ValueGrammars.scala b/src/main/scala/inox/grammars/ValueGrammars.scala
index 7e09acb64..cf3f60cc8 100644
--- a/src/main/scala/inox/grammars/ValueGrammars.scala
+++ b/src/main/scala/inox/grammars/ValueGrammars.scala
@@ -3,8 +3,6 @@
 package inox
 package grammars
 
-import ast.FreshIdentifier
-
 trait ValueGrammars { self: GrammarsUniverse =>
   import program._
   import trees._
diff --git a/src/main/scala/inox/grammars/utils/Helpers.scala b/src/main/scala/inox/grammars/utils/Helpers.scala
index 2b17c5680..08e91da1a 100644
--- a/src/main/scala/inox/grammars/utils/Helpers.scala
+++ b/src/main/scala/inox/grammars/utils/Helpers.scala
@@ -4,8 +4,6 @@ package inox
 package grammars
 package utils
 
-import ast.{Identifier, FreshIdentifier}
-
 trait Helpers { self: GrammarsUniverse =>
   import program._
   import trees.{ Minus => EMinus, Plus => EPlus, Variable => EVariable, _ }
diff --git a/src/main/scala/inox/solvers/ADTManagers.scala b/src/main/scala/inox/solvers/ADTManagers.scala
index 47e401349..22d8617d8 100644
--- a/src/main/scala/inox/solvers/ADTManagers.scala
+++ b/src/main/scala/inox/solvers/ADTManagers.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 
 import utils._
-import ast.{Identifier, FreshIdentifier}
 
 trait ADTManagers {
   val program: Program
diff --git a/src/main/scala/inox/solvers/smtlib/CVC4Target.scala b/src/main/scala/inox/solvers/smtlib/CVC4Target.scala
index 00c319d35..b28755ba2 100644
--- a/src/main/scala/inox/solvers/smtlib/CVC4Target.scala
+++ b/src/main/scala/inox/solvers/smtlib/CVC4Target.scala
@@ -6,7 +6,6 @@ package smtlib
 
 import org.apache.commons.lang3.StringEscapeUtils
 
-import ast.{Identifier, FreshIdentifier}
 import _root_.smtlib.parser.Terms.{Identifier => SMTIdentifier, _}
 import _root_.smtlib.parser.Commands._
 import _root_.smtlib.interpreters.CVC4Interpreter
diff --git a/src/main/scala/inox/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/inox/solvers/smtlib/SMTLIBTarget.scala
index 598264d90..890761d96 100644
--- a/src/main/scala/inox/solvers/smtlib/SMTLIBTarget.scala
+++ b/src/main/scala/inox/solvers/smtlib/SMTLIBTarget.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 package smtlib
 
-import ast.{Identifier, FreshIdentifier}
 import utils._
 
 import _root_.smtlib.common._
diff --git a/src/main/scala/inox/solvers/smtlib/Z3Target.scala b/src/main/scala/inox/solvers/smtlib/Z3Target.scala
index 9b9825eba..e803c54a3 100644
--- a/src/main/scala/inox/solvers/smtlib/Z3Target.scala
+++ b/src/main/scala/inox/solvers/smtlib/Z3Target.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 package smtlib
 
-import ast.{Identifier, FreshIdentifier}
 import _root_.smtlib.parser.Terms.{Identifier => SMTIdentifier, Let => SMTLet, _}
 import _root_.smtlib.parser.Commands.{FunDef => SMTFunDef, _}
 import _root_.smtlib.interpreters.Z3Interpreter
diff --git a/src/main/scala/inox/solvers/theories/BagEncoder.scala b/src/main/scala/inox/solvers/theories/BagEncoder.scala
index 4cd485c72..b91f3e52d 100644
--- a/src/main/scala/inox/solvers/theories/BagEncoder.scala
+++ b/src/main/scala/inox/solvers/theories/BagEncoder.scala
@@ -4,8 +4,6 @@ package inox
 package solvers
 package theories
 
-import ast.{Identifier, FreshIdentifier}
-
 trait BagEncoder extends TheoryEncoder {
   import trees._
   import trees.dsl._
diff --git a/src/main/scala/inox/solvers/theories/StringEncoder.scala b/src/main/scala/inox/solvers/theories/StringEncoder.scala
index b572373e4..b37b9aaef 100644
--- a/src/main/scala/inox/solvers/theories/StringEncoder.scala
+++ b/src/main/scala/inox/solvers/theories/StringEncoder.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 package theories
 
-import ast.{Identifier, FreshIdentifier}
 import utils._
 
 trait StringEncoder extends TheoryEncoder {
diff --git a/src/main/scala/inox/solvers/unrolling/DatatypeTemplates.scala b/src/main/scala/inox/solvers/unrolling/DatatypeTemplates.scala
index 795a7f799..9a2f915e3 100644
--- a/src/main/scala/inox/solvers/unrolling/DatatypeTemplates.scala
+++ b/src/main/scala/inox/solvers/unrolling/DatatypeTemplates.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 package unrolling
 
-import ast.{Identifier, FreshIdentifier}
 import utils._
 
 import scala.collection.mutable.{Map => MutableMap, Set => MutableSet}
diff --git a/src/main/scala/inox/solvers/unrolling/FunctionTemplates.scala b/src/main/scala/inox/solvers/unrolling/FunctionTemplates.scala
index 84e5a31ca..eada1e7e8 100644
--- a/src/main/scala/inox/solvers/unrolling/FunctionTemplates.scala
+++ b/src/main/scala/inox/solvers/unrolling/FunctionTemplates.scala
@@ -5,7 +5,6 @@ package solvers
 package unrolling
 
 import utils._
-import ast.FreshIdentifier
 
 trait FunctionTemplates { self: Templates =>
   import program._
diff --git a/src/main/scala/inox/solvers/unrolling/LambdaTemplates.scala b/src/main/scala/inox/solvers/unrolling/LambdaTemplates.scala
index ebe84c69c..8442624ba 100644
--- a/src/main/scala/inox/solvers/unrolling/LambdaTemplates.scala
+++ b/src/main/scala/inox/solvers/unrolling/LambdaTemplates.scala
@@ -5,7 +5,6 @@ package solvers
 package unrolling
 
 import utils._
-import ast.{Identifier, FreshIdentifier}
 import scala.collection.mutable.{Map => MutableMap, Set => MutableSet}
 
 trait LambdaTemplates { self: Templates =>
diff --git a/src/main/scala/inox/solvers/unrolling/QuantificationTemplates.scala b/src/main/scala/inox/solvers/unrolling/QuantificationTemplates.scala
index 33f7f2fe5..4cd8f09a2 100644
--- a/src/main/scala/inox/solvers/unrolling/QuantificationTemplates.scala
+++ b/src/main/scala/inox/solvers/unrolling/QuantificationTemplates.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 package unrolling
 
-import ast.{Identifier, FreshIdentifier}
 import utils._
 import evaluators._
 
diff --git a/src/main/scala/inox/solvers/unrolling/TemplateGenerator.scala b/src/main/scala/inox/solvers/unrolling/TemplateGenerator.scala
index 255c25bd1..62c214b69 100644
--- a/src/main/scala/inox/solvers/unrolling/TemplateGenerator.scala
+++ b/src/main/scala/inox/solvers/unrolling/TemplateGenerator.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 package unrolling
 
-import ast.FreshIdentifier
 import utils._
 import scala.collection.mutable.{Map => MutableMap}
 
diff --git a/src/main/scala/inox/solvers/unrolling/Templates.scala b/src/main/scala/inox/solvers/unrolling/Templates.scala
index 9bf18c367..ddf72be38 100644
--- a/src/main/scala/inox/solvers/unrolling/Templates.scala
+++ b/src/main/scala/inox/solvers/unrolling/Templates.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 package unrolling
 
-import ast.FreshIdentifier
 import utils._
 
 import scala.collection.generic.CanBuildFrom
diff --git a/src/main/scala/inox/solvers/unrolling/UnrollingSolver.scala b/src/main/scala/inox/solvers/unrolling/UnrollingSolver.scala
index d1601e651..57daddc41 100644
--- a/src/main/scala/inox/solvers/unrolling/UnrollingSolver.scala
+++ b/src/main/scala/inox/solvers/unrolling/UnrollingSolver.scala
@@ -4,7 +4,6 @@ package inox
 package solvers
 package unrolling
 
-import ast.FreshIdentifier
 import utils._
 
 import theories._
diff --git a/src/main/scala/inox/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/inox/solvers/z3/AbstractZ3Solver.scala
index 461f33d40..a2fc56cf3 100644
--- a/src/main/scala/inox/solvers/z3/AbstractZ3Solver.scala
+++ b/src/main/scala/inox/solvers/z3/AbstractZ3Solver.scala
@@ -3,7 +3,6 @@
 package inox
 package solvers.z3
 
-import ast.FreshIdentifier
 import utils._
 
 import z3.scala.{Z3Solver => ScalaZ3Solver, _}
diff --git a/src/main/scala/inox/tip/Parser.scala b/src/main/scala/inox/tip/Parser.scala
index bf1e99c77..72245aeb8 100644
--- a/src/main/scala/inox/tip/Parser.scala
+++ b/src/main/scala/inox/tip/Parser.scala
@@ -3,7 +3,6 @@
 package inox
 package tip
 
-import ast.{Identifier, FreshIdentifier}
 import utils._
 
 import smtlib.lexer._
diff --git a/src/main/scala/inox/tip/Printer.scala b/src/main/scala/inox/tip/Printer.scala
index 324c3c880..e33a078f4 100644
--- a/src/main/scala/inox/tip/Printer.scala
+++ b/src/main/scala/inox/tip/Printer.scala
@@ -3,8 +3,6 @@
 package inox
 package tip
 
-import ast.Identifier
-
 import smtlib.parser.Terms.{Forall => SMTForall, Identifier => SMTIdentifier, _}
 import smtlib.parser.Commands.{Constructor => SMTConstructor, _}
 import smtlib.extensions.tip.Terms.{Lambda => SMTLambda, Application => SMTApplication, _}
diff --git a/src/main/scala/inox/transformers/ScopeSimplifier.scala b/src/main/scala/inox/transformers/ScopeSimplifier.scala
index 183623266..a74653eea 100644
--- a/src/main/scala/inox/transformers/ScopeSimplifier.scala
+++ b/src/main/scala/inox/transformers/ScopeSimplifier.scala
@@ -3,8 +3,6 @@
 package inox
 package transformers
 
-import ast.{Identifier, FreshIdentifier}
-
 /** Simplifies variable ids in scope */
 trait ScopeSimplifier extends Transformer {
   import trees._
-- 
GitLab