diff --git a/src/main/scala/leon/LeonContext.scala b/src/main/scala/leon/LeonContext.scala index e2145ed872e5cb3c397104b30b8538cad7f4a127..d41a4136ffa7d7d597bd6a4a6e447885d3aa79fd 100644 --- a/src/main/scala/leon/LeonContext.scala +++ b/src/main/scala/leon/LeonContext.scala @@ -3,10 +3,12 @@ package leon import purescala.Definitions.Program import java.io.File +/** Everything that is part of a compilation unit, except the actual program tree. + * Contexts are immutable, and so should all there fields (with the possible + * exception of the reporter). */ case class LeonContext( val settings: Settings = Settings(), val options: List[LeonOption] = Nil, val files: List[File] = Nil, val reporter: Reporter = new DefaultReporter ) - diff --git a/src/main/scala/leon/LeonOption.scala b/src/main/scala/leon/LeonOption.scala index a2ceda071014c39319323b067db1b6c3a65dcb56..4678772d2468775867998cc045613be94081f882 100644 --- a/src/main/scala/leon/LeonOption.scala +++ b/src/main/scala/leon/LeonOption.scala @@ -1,12 +1,14 @@ package leon +/** Describes a command-line option. */ sealed abstract class LeonOption { val name: String } +/** Boolean (on/off) options. Present means "on". */ case class LeonFlagOption(name: String) extends LeonOption +/** Options of the form --option=value. */ case class LeonValueOption(name: String, value: String) extends LeonOption { - def splitList : Seq[String] = value.split(':').map(_.trim).filter(!_.isEmpty) } diff --git a/src/main/scala/leon/isabelle/Main.scala b/src/main/scala/leon/isabelle/Main.scala index 080e7d03862507899d97d9e288e04041a304ec89..9cf1040b3163d24d7f445023ada714bd00423e0a 100644 --- a/src/main/scala/leon/isabelle/Main.scala +++ b/src/main/scala/leon/isabelle/Main.scala @@ -1,4 +1,5 @@ -package leon.isabelle +package leon +package isabelle import leon.Reporter import leon.Settings._ @@ -17,10 +18,13 @@ import java.lang.StringBuffer import java.io._ import scala.collection.mutable.ListMap -class Main(reporter: Reporter) extends Analyser(reporter) { +@deprecated("Unused, Untested, Unmaintained.", "") +class Main(context : LeonContext) extends Analyser(context) { val description = "Generates Isabelle source" val shortDescription = "isabelle" + private val reporter = context.reporter + var mapParentTypes = new ListMap[String, String] //map for each function keeps the functions that it calls inside it diff --git a/src/main/scala/leon/solvers/ParallelSolver.scala b/src/main/scala/leon/solvers/ParallelSolver.scala index 6ac173414f6b483c83cd0372e3b1d02f1ecf5c8f..3bc724c68873238e6ef8195cb5410b1ee83c6ffe 100644 --- a/src/main/scala/leon/solvers/ParallelSolver.scala +++ b/src/main/scala/leon/solvers/ParallelSolver.scala @@ -14,10 +14,13 @@ import scala.actors.Actor._ import scala.concurrent.Lock -class ParallelSolver(solvers: Solver*) extends Solver(solvers(0).reporter) { +@deprecated("Unused, Untested, Unmaintained", "") +class ParallelSolver(solvers : Solver*) extends Solver(solvers(0).context) { private val nbSolvers = solvers.size require(nbSolvers >= 2) + private val reporter = context.reporter + val description = "Solver running subsolvers in parallel " + solvers.map(_.description).mkString("(", ", ", ")") override val shortDescription = solvers.map(_.shortDescription).mkString("//") override val superseeds : Seq[String] = solvers.map(_.shortDescription).toSeq diff --git a/src/main/scala/leon/solvers/RandomSolver.scala b/src/main/scala/leon/solvers/RandomSolver.scala index 3b44cae39cc712763670dd332b97e453d26a085d..f5e37ca29936f7bd874416674996930eb02f3ab7 100644 --- a/src/main/scala/leon/solvers/RandomSolver.scala +++ b/src/main/scala/leon/solvers/RandomSolver.scala @@ -11,9 +11,12 @@ import Evaluator._ import scala.util.Random -class RandomSolver(reporter: Reporter, val nbTrial: Option[Int] = None) extends Solver(reporter) { +@deprecated("Unused, Untested, Unmaintained", "") +class RandomSolver(context: LeonContext, val nbTrial: Option[Int] = None) extends Solver(context) { require(nbTrial.forall(i => i >= 0)) + private val reporter = context.reporter + val description = "Solver applying random testing (QuickCheck-like)" override val shortDescription = "QC" diff --git a/src/main/scala/leon/solvers/Solver.scala b/src/main/scala/leon/solvers/Solver.scala index b31a083be787ac6d663b839e228b3bda300d709d..f6c546306b96398a6eab4785ca8e3c671dfe6929 100644 --- a/src/main/scala/leon/solvers/Solver.scala +++ b/src/main/scala/leon/solvers/Solver.scala @@ -6,7 +6,7 @@ import purescala.Definitions._ import purescala.TreeOps._ import purescala.Trees._ -abstract class Solver(val reporter: Reporter) { +abstract class Solver(val context : LeonContext) { // This used to be in Extension val description : String val shortDescription : String diff --git a/src/main/scala/leon/solvers/TimeoutSolver.scala b/src/main/scala/leon/solvers/TimeoutSolver.scala index 6fa76d0bf9328f983ec2fd6de4fd27bbed6b5e6d..2c1de0e4b2be7603d7b9a42c1bc6eeca857f505d 100644 --- a/src/main/scala/leon/solvers/TimeoutSolver.scala +++ b/src/main/scala/leon/solvers/TimeoutSolver.scala @@ -8,7 +8,7 @@ import purescala.TypeTrees._ import scala.sys.error -class TimeoutSolver(solver : Solver, timeout : Int) extends Solver(solver.reporter) { +class TimeoutSolver(solver : Solver, timeout : Int) extends Solver(solver.context) { val description = solver.description + ", with timeout" override val shortDescription = solver.shortDescription + "+t" diff --git a/src/main/scala/leon/solvers/TrivialSolver.scala b/src/main/scala/leon/solvers/TrivialSolver.scala index b75c157d84d013ea57b4b6d39dadebc2997d49b1..17fac01f03f856d487d1d393c16aaa5dce355a52 100644 --- a/src/main/scala/leon/solvers/TrivialSolver.scala +++ b/src/main/scala/leon/solvers/TrivialSolver.scala @@ -6,7 +6,7 @@ import purescala.Definitions._ import purescala.Trees._ import purescala.TypeTrees._ -class TrivialSolver(reporter: Reporter) extends Solver(reporter) { +class TrivialSolver(context: LeonContext) extends Solver(context) { val description = "Solver for syntactically trivial formulas" override val shortDescription = "trivial" diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala index 20992d2e342348a76bf8324a55d8f09f2daf8546..e0de253ce804186d80fd9f692b765c4042d6be09 100644 --- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala @@ -16,7 +16,8 @@ import scala.collection.mutable.{Set => MutableSet} trait AbstractZ3Solver { self: leon.solvers.Solver => - val reporter: Reporter + val context : LeonContext + protected[z3] val reporter : Reporter = context.reporter protected[leon] val USEBV : Boolean = Settings.bitvectorBitwidth.isDefined protected[leon] val BVWIDTH : Int = Settings.bitvectorBitwidth.getOrElse(-1) diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala index 20341ff939c00c785024c249c92cd07c3c7ae3e7..9087c942cc82b129d46ea30b2c6caa46ae8e1403 100644 --- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala @@ -15,7 +15,7 @@ import purescala.TypeTrees._ import scala.collection.mutable.{Map => MutableMap} import scala.collection.mutable.{Set => MutableSet} -class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3Solver with Z3ModelReconstruction { +class FairZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ3Solver with Z3ModelReconstruction { // have to comment this to use the solver for constraint solving... // assert(Settings.useFairInstantiator) diff --git a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala index 74aef6fcda4d54622fb1ccbf0412b8cee8e3d7d8..08b27c9ed72f54fcbab108f3c25644280c95a8e7 100644 --- a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala @@ -19,7 +19,7 @@ import purescala.TypeTrees._ * - otherwise it returns UNKNOWN * Results should come back very quickly. */ -class UninterpretedZ3Solver(reporter : Reporter) extends Solver(reporter) with AbstractZ3Solver with Z3ModelReconstruction { +class UninterpretedZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ3Solver with Z3ModelReconstruction { val description = "Uninterpreted Z3 Solver" override val shortDescription = "Z3-u" diff --git a/src/main/scala/leon/synthesis/ParallelSearch.scala b/src/main/scala/leon/synthesis/ParallelSearch.scala index cd8f11d336d12f854276d28b487ac6622218b46c..f11526f3c2c7c1af909909cce4120c9621c9962c 100644 --- a/src/main/scala/leon/synthesis/ParallelSearch.scala +++ b/src/main/scala/leon/synthesis/ParallelSearch.scala @@ -14,7 +14,8 @@ class ParallelSearch(synth: Synthesizer, def initWorkerContext(wr: ActorRef) = { val reporter = new SilentReporter - val solver = new FairZ3Solver(reporter) + // TODO FIXME : the proper LeonContext should make its way here. + val solver = new FairZ3Solver(LeonContext(reporter = reporter)) solver.setProgram(synth.program) SynthesisContext(solver = solver, reporter = synth.reporter) diff --git a/src/main/scala/leon/synthesis/SynthesisPhase.scala b/src/main/scala/leon/synthesis/SynthesisPhase.scala index a6ea6b654397376802d8c98c8010bc7645f9cd65..2901bb3827846116cc7f2021974b7c6c6823e141 100644 --- a/src/main/scala/leon/synthesis/SynthesisPhase.scala +++ b/src/main/scala/leon/synthesis/SynthesisPhase.scala @@ -23,12 +23,12 @@ object SynthesisPhase extends LeonPhase[Program, Program] { ) def run(ctx: LeonContext)(p: Program): Program = { - val reporter = new SilentReporter + val silentContext : LeonContext = ctx.copy(reporter = new SilentReporter) - val mainSolver = new FairZ3Solver(reporter) + val mainSolver = new FairZ3Solver(silentContext) mainSolver.setProgram(p) - val uninterpretedZ3 = new UninterpretedZ3Solver(reporter) + val uninterpretedZ3 = new UninterpretedZ3Solver(silentContext) uninterpretedZ3.setProgram(p) var inPlace = false diff --git a/src/main/scala/leon/testgen/TestGeneration.scala b/src/main/scala/leon/testgen/TestGeneration.scala index 0502be54025994358d0141f98d908df134befb25..0876e17219def0126a1ac5bc18999b8e0fa06136 100644 --- a/src/main/scala/leon/testgen/TestGeneration.scala +++ b/src/main/scala/leon/testgen/TestGeneration.scala @@ -1,4 +1,5 @@ -package leon.testgen +package leon +package testgen import leon.verification.Analyser @@ -13,12 +14,14 @@ import leon.Reporter import scala.collection.mutable.{Set => MutableSet} -class TestGeneration(reporter: Reporter) extends Analyser(reporter) { +@deprecated("Unused, Untested, Unmaintained.", "") +class TestGeneration(context : LeonContext) extends Analyser(context) { def description: String = "Generate random testcases" def shortDescription: String = "test" - private val z3Solver = new FairZ3Solver(reporter) + private val reporter = context.reporter + private val z3Solver = new FairZ3Solver(context) def analyse(program: Program) { z3Solver.setProgram(program) diff --git a/src/main/scala/leon/verification/Analyser.scala b/src/main/scala/leon/verification/Analyser.scala index 708a3a7564f3366fbc8ce6849f891b91e5abee3f..5885531e8c0c9733c1b6cf8c16667923f1423c29 100644 --- a/src/main/scala/leon/verification/Analyser.scala +++ b/src/main/scala/leon/verification/Analyser.scala @@ -3,8 +3,9 @@ package verification import purescala.Definitions.Program -// TODO this class is slowly but surely becoming useless, as we now have a notion of phases. -abstract class Analyser(reporter: Reporter) { +// TODO FIXME this class is slowly but surely becoming useless, +// as we now have a notion of phases. +abstract class Analyser(context : LeonContext) { // Does whatever the analysis should. Uses the reporter to // signal results and/or errors. def analyse(program: Program) : Unit diff --git a/src/main/scala/leon/verification/Analysis.scala b/src/main/scala/leon/verification/Analysis.scala index 77cebb21160c472b0d64f0d7ec3fb90b5943e47d..2d4b29f7e9e084202196e672fda749b65728aa3e 100644 --- a/src/main/scala/leon/verification/Analysis.scala +++ b/src/main/scala/leon/verification/Analysis.scala @@ -12,11 +12,12 @@ import solvers.z3.FairZ3Solver import scala.collection.mutable.{Set => MutableSet} -class Analysis(val program : Program, val reporter: Reporter) { +class Analysis(val program : Program, val context: LeonContext) { + private val reporter = context.reporter - val trivialSolver = new TrivialSolver(reporter) + val trivialSolver = new TrivialSolver(context) - val fairZ3 = new FairZ3Solver(reporter) + val fairZ3 = new FairZ3Solver(context) val solvers : Seq[Solver] = trivialSolver :: fairZ3 :: Nil diff --git a/src/main/scala/leon/verification/AnalysisPhase.scala b/src/main/scala/leon/verification/AnalysisPhase.scala index 12953a93b1abf88af4eea0765ce4dfbc3a71032a..1ec1084e0b978a6b1227595e3a53f223a610953b 100644 --- a/src/main/scala/leon/verification/AnalysisPhase.scala +++ b/src/main/scala/leon/verification/AnalysisPhase.scala @@ -12,6 +12,6 @@ object AnalysisPhase extends LeonPhase[Program,VerificationReport] { ) def run(ctx: LeonContext)(program: Program) : VerificationReport = { - new Analysis(program, ctx.reporter).analyse + new Analysis(program, ctx).analyse } } diff --git a/src/test/scala/leon/test/purescala/TreeOpsTests.scala b/src/test/scala/leon/test/purescala/TreeOpsTests.scala index ae3be5513adca026f6ad5e28ac70425864c5a62c..c77406e25c833685e370603f80067146e4fd12b9 100644 --- a/src/test/scala/leon/test/purescala/TreeOpsTests.scala +++ b/src/test/scala/leon/test/purescala/TreeOpsTests.scala @@ -1,17 +1,19 @@ package leon.test.purescala +import leon.LeonContext +import leon.SilentReporter + import leon.purescala.Common._ import leon.purescala.Definitions._ import leon.purescala.Trees._ import leon.purescala.TypeTrees._ import leon.purescala.TreeOps._ import leon.purescala.LikelyEq -import leon.SilentReporter import org.scalatest.FunSuite class TreeOpsTests extends FunSuite { - private val silentReporter = new SilentReporter + private val silentContext = LeonContext(reporter = new SilentReporter) private val emptyProgram = Program( FreshIdentifier("Empty"), @@ -20,7 +22,7 @@ class TreeOpsTests extends FunSuite { test("Path-aware simplifications") { import leon.solvers.z3.UninterpretedZ3Solver - val solver = new UninterpretedZ3Solver(silentReporter) + val solver = new UninterpretedZ3Solver(silentContext) solver.setProgram(emptyProgram) // TODO actually testing something here would be better, sorry diff --git a/src/test/scala/leon/test/solvers/z3/BugWithEmptySet.scala b/src/test/scala/leon/test/solvers/z3/BugWithEmptySet.scala index c650efe8863d1a86eedbe7e3bc0c35932e7a0b40..569dba2a4f131e395c9d86294f170ea1c19b4afc 100644 --- a/src/test/scala/leon/test/solvers/z3/BugWithEmptySet.scala +++ b/src/test/scala/leon/test/solvers/z3/BugWithEmptySet.scala @@ -1,13 +1,14 @@ package leon.test.solvers.z3 +import leon.LeonContext +import leon.SilentReporter + import leon.purescala.Common._ import leon.purescala.Definitions._ import leon.purescala.Trees._ import leon.purescala.TreeOps._ import leon.purescala.TypeTrees._ -import leon.SilentReporter - import leon.solvers.Solver import leon.solvers.z3.UninterpretedZ3Solver @@ -30,8 +31,8 @@ class BugWithEmptySet extends FunSuite { val f1 = Equals(e1, e2) - val silentReporter = new SilentReporter - val solver : Solver = new UninterpretedZ3Solver(silentReporter) + val silentContext = LeonContext(reporter = new SilentReporter) + val solver : Solver = new UninterpretedZ3Solver(silentContext) solver.setProgram(emptyProgram) assert(solver.solve(f1) === Some(true), diff --git a/src/test/scala/leon/test/solvers/z3/FairZ3SolverTests.scala b/src/test/scala/leon/test/solvers/z3/FairZ3SolverTests.scala index 1902dbab52ad7135254e70fcc5effda9aefee241..8fd0458ae436246582436e016775c93039194f45 100644 --- a/src/test/scala/leon/test/solvers/z3/FairZ3SolverTests.scala +++ b/src/test/scala/leon/test/solvers/z3/FairZ3SolverTests.scala @@ -1,13 +1,14 @@ package leon.test.solvers.z3 +import leon.LeonContext +import leon.SilentReporter + import leon.purescala.Common._ import leon.purescala.Definitions._ import leon.purescala.Trees._ import leon.purescala.TreeOps._ import leon.purescala.TypeTrees._ -import leon.SilentReporter - import leon.solvers.Solver import leon.solvers.z3.FairZ3Solver @@ -38,7 +39,7 @@ class FairZ3SolverTests extends FunSuite { "Solver should not be able to decide the formula " + expr + "." ) - private val silentReporter = new SilentReporter + private val silentContext = LeonContext(reporter = new SilentReporter) // def f(fx : Int) : Int = fx + 1 private val fx : Identifier = FreshIdentifier("x").setType(Int32Type) @@ -56,7 +57,7 @@ class FairZ3SolverTests extends FunSuite { private val y : Expr = Variable(FreshIdentifier("y").setType(Int32Type)) private def f(e : Expr) : Expr = FunctionInvocation(fDef, e :: Nil) - private val solver = new FairZ3Solver(silentReporter) + private val solver = new FairZ3Solver(silentContext) solver.setProgram(minimalProgram) private val tautology1 : Expr = BooleanLiteral(true) diff --git a/src/test/scala/leon/test/solvers/z3/UninterpretedZ3SolverTests.scala b/src/test/scala/leon/test/solvers/z3/UninterpretedZ3SolverTests.scala index 1ae79ce1d04505eabfe7c49c57463864d9735c6d..2a68caa854c00ad471811ee54e544617512f9d45 100644 --- a/src/test/scala/leon/test/solvers/z3/UninterpretedZ3SolverTests.scala +++ b/src/test/scala/leon/test/solvers/z3/UninterpretedZ3SolverTests.scala @@ -1,13 +1,14 @@ package leon.test.solvers.z3 +import leon.LeonContext +import leon.SilentReporter + import leon.purescala.Common._ import leon.purescala.Definitions._ import leon.purescala.Trees._ import leon.purescala.TreeOps._ import leon.purescala.TypeTrees._ -import leon.SilentReporter - import leon.solvers.Solver import leon.solvers.z3.UninterpretedZ3Solver @@ -38,7 +39,7 @@ class UninterpretedZ3SolverTests extends FunSuite { "Solver should not be able to decide the formula " + expr + "." ) - private val silentReporter = new SilentReporter + private val silentContext = LeonContext(reporter = new SilentReporter) // def f(fx : Int) : Int = fx + 1 private val fx : Identifier = FreshIdentifier("x").setType(Int32Type) @@ -61,7 +62,7 @@ class UninterpretedZ3SolverTests extends FunSuite { private def f(e : Expr) : Expr = FunctionInvocation(fDef, e :: Nil) private def g(e : Expr) : Expr = FunctionInvocation(gDef, e :: Nil) - private val solver = new UninterpretedZ3Solver(silentReporter) + private val solver = new UninterpretedZ3Solver(silentContext) solver.setProgram(minimalProgram) private val tautology1 : Expr = BooleanLiteral(true)