diff --git a/src/main/scala/inox/ast/TreeOps.scala b/src/main/scala/inox/ast/TreeOps.scala index b4af9cdc1457797e6f59f892e87d15d4a3d4ac69..5013774f76544d2be7ff49d49ade4fb05d66d5ee 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 272ff38c5fb3035874e23dee9f2a8822b10577e0..7b0f89a1aefeecce12ff25b3b959d7c068ef172d 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 060168a4a5f42a57d6b5eada097a4c6f97c2bcb6..6cfbc50d884955c874bd29db5eb1190f132b17c8 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 432635247e96ae38327327fddbfb45a5f7f9259f..2576742684986384139a28a7b875d26e79a1d168 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 4af6b1d73dea9a1469e690455b8ca67ff9948a69..d3b0e2da23d19456a9333f7c27274f9d17968f40 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 2e9ad0ad56a06d7527967e7d65b4f939b01b5e14..cbf304ab5b434009b58c0c8f28cde92229b914c4 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 85b15fc40e86763cca02e87424b2cebd44925901..0bc1bf8754e24ff21251876cd9f87c98d50a7094 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 7e09acb6476974159bbe9b693533700a8ea518e3..cf3f60cc8aceaf66b607308cfe4f61d3ca3fca1c 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 2b17c5680324baca8d22ef4d07e7e7bedaee66ae..08e91da1a71434423bfc1fe53c3d9529b79e2ec7 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 47e401349ed75a69894a0db83620f1f40a07e53a..22d8617d81236126cfdf9e3b04971a7282d17596 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 00c319d35ea7cdea4ee6a0066fffc7222cf0f293..b28755ba2f5feb05913bc1b3a23df152a35baa44 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 598264d90b9c8ec6bbbb55abd2e40e3d27c40b09..890761d963ea4bb37625985d6e34a354bdb2f471 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 9b9825eba0dbbd3c4e79dcb62110f948f6495783..e803c54a3ddfc36ab1ffce0331bb70ff56321bb4 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 4cd485c725298206e0879d6d0fe94549a3ba2a68..b91f3e52df3bcaa58ae1b823e12f71ca8a629ed8 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 b572373e4651300de50379967e6b35479e325a97..b37b9aaef4c787c74a2fbad026ec3ca14cf546bd 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 795a7f7991f9019c54c78a2908f18ca7a411f64e..9a2f915e35a9397d71f1c87b19daf9ca560ef315 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 84e5a31ca1143311d333f69601126ed4f6397277..eada1e7e803c839e8bd49b6ab9c38c3d8ff0f1ac 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 ebe84c69c2771721b9ef8c66b09066d89dd8ed6e..8442624baf7886c71dde9e72ffe28554791d0664 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 33f7f2fe5aac99bcd1989da5d4acd20066fe7094..4cd8f09a2ef1ae751702ea8f764539191b491e02 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 255c25bd176dc2b6fd20130b8e41ff3a9e1c2e3b..62c214b6915791cef732950c83b661999390e5f5 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 9bf18c367656a5352df9b0465b447a3fa1153fea..ddf72be387221cc8ee8b439a1c5a1356c70ad474 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 d1601e6512268348143466af0186bd8bbf8709b5..57daddc41e257a3f5f6c4faa88b8e4524ba14fff 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 461f33d403251d3b6d2b083942a22eeb28f1f5de..a2fc56cf3898cdc186009173cf0cb0a27b045f16 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 bf1e99c779aadf44b4ea24bdbc666b66693e3485..72245aeb8a555a135a69d49e8338f59329a24b87 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 324c3c88089ee2d957f422368a84ed7a2c42d573..e33a078f45d11f40b3e9717dca0ce41b77ee7083 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 1836232667f96b129cdfb4496396507c15994b29..a74653eea5abf1034afb5b47bb8673e950bc3d01 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._