From ddd6e8c3fe451940b93db992a85d42c33a22bf2b Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Fri, 26 Oct 2012 16:29:51 +0200 Subject: [PATCH] Define inplace option --- src/main/scala/leon/LeonContext.scala | 1 + src/main/scala/leon/LeonOption.scala | 14 +++++++++++++- src/main/scala/leon/Main.scala | 14 +++++++------- .../scala/leon/purescala/ScalaPrinter.scala | 4 +--- .../scala/leon/synthesis/SynthesisPhase.scala | 17 +++++++++++++++-- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/scala/leon/LeonContext.scala b/src/main/scala/leon/LeonContext.scala index 29cc186e2..7aa76a971 100644 --- a/src/main/scala/leon/LeonContext.scala +++ b/src/main/scala/leon/LeonContext.scala @@ -4,6 +4,7 @@ import purescala.Definitions.Program case class LeonContext( val settings: Settings = Settings(), + val options: List[LeonOption] = Nil, val files: List[String] = Nil, val reporter: Reporter = new DefaultReporter ) diff --git a/src/main/scala/leon/LeonOption.scala b/src/main/scala/leon/LeonOption.scala index f2579e5af..0340e7461 100644 --- a/src/main/scala/leon/LeonOption.scala +++ b/src/main/scala/leon/LeonOption.scala @@ -10,4 +10,16 @@ case class LeonValueOption(name: String, value: String) extends LeonOption { def splitList : Seq[String] = value.split(':').map(_.trim).filter(!_.isEmpty) } -case class LeonOptionDef(name: String, isFlag: Boolean, description: String) +sealed abstract class LeonOptionDef { + val name: String + val usageOption: String + val usageDesc: String + val isFlag: Boolean +} +case class LeonFlagOptionDef(name: String, usageOption: String, usageDesc: String) extends LeonOptionDef { + val isFlag = true +} + +case class LeonValueOptionDef(name: String, usageOption: String, usageDesc: String) extends LeonOptionDef { + val isFlag = false +} diff --git a/src/main/scala/leon/Main.scala b/src/main/scala/leon/Main.scala index b815f5cb9..ace9c2d29 100644 --- a/src/main/scala/leon/Main.scala +++ b/src/main/scala/leon/Main.scala @@ -18,11 +18,11 @@ object Main { } lazy val allOptions = allPhases.flatMap(_.definedOptions) ++ Set( - LeonOptionDef("synthesis", true, "--synthesis Partial synthesis or choose() constructs"), - LeonOptionDef("xlang", true, "--xlang Support for extra program constructs (imperative,...)"), - LeonOptionDef("parse", true, "--parse Checks only whether the program is valid PureScala"), - LeonOptionDef("debug", false, "--debug=[1-5] Debug level"), - LeonOptionDef("help", true, "--help This help") + LeonFlagOptionDef ("synthesis", "--synthesis", "Partial synthesis or choose() constructs"), + LeonFlagOptionDef ("xlang", "--xlang", "Support for extra program constructs (imperative,...)"), + LeonFlagOptionDef ("parse", "--parse", "Checks only whether the program is valid PureScala"), + LeonValueOptionDef("debug", "--debug=[1-5]", "Debug level"), + LeonFlagOptionDef ("help", "--help", "This help") ) def displayHelp(reporter: Reporter) { @@ -30,7 +30,7 @@ object Main { reporter.info("") reporter.info("Leon options are:") for (opt <- allOptions.toSeq.sortBy(_.name)) { - reporter.info(" "+opt.description) + reporter.info(" %-20s %s".format(opt.usageOption, opt.usageDesc)) } sys.exit(1) } @@ -89,7 +89,7 @@ object Main { case _ => } - LeonContext(settings = settings, reporter = reporter, files = files) + LeonContext(settings = settings, reporter = reporter, files = files, options = leonOptions) } implicit def phaseToPipeline[F, T](phase: LeonPhase[F, T]): Pipeline[F, T] = new PipeCons(phase, new PipeNil()) diff --git a/src/main/scala/leon/purescala/ScalaPrinter.scala b/src/main/scala/leon/purescala/ScalaPrinter.scala index 2967ea34a..269f612b8 100644 --- a/src/main/scala/leon/purescala/ScalaPrinter.scala +++ b/src/main/scala/leon/purescala/ScalaPrinter.scala @@ -421,9 +421,7 @@ object ScalaPrinter { case e @ Error(desc) => { var nsb = sb - nsb.append("error(\"" + desc + "\")[") - nsb = pp(e.getType, nsb, lvl) - nsb.append("]") + nsb.append("error(\"" + desc + "\")") nsb } diff --git a/src/main/scala/leon/synthesis/SynthesisPhase.scala b/src/main/scala/leon/synthesis/SynthesisPhase.scala index ac10811eb..898891307 100644 --- a/src/main/scala/leon/synthesis/SynthesisPhase.scala +++ b/src/main/scala/leon/synthesis/SynthesisPhase.scala @@ -7,6 +7,10 @@ object SynthesisPhase extends LeonPhase[Program, Program] { val name = "Synthesis" val description = "Synthesis" + override def definedOptions = Set( + LeonFlagOptionDef("inplace", "--inplace", "Debug level") + ) + def run(ctx: LeonContext)(p: Program): Program = { val quietReporter = new QuietReporter val solvers = List( @@ -14,11 +18,20 @@ object SynthesisPhase extends LeonPhase[Program, Program] { new FairZ3Solver(quietReporter) ) + var inPlace = false + for(opt <- ctx.options) opt match { + case LeonFlagOption("inplace") => + inPlace = true + case _ => + } + val synth = new Synthesizer(ctx.reporter, solvers) val solutions = synth.synthesizeAll(p) - for (file <- ctx.files) { - synth.updateFile(new java.io.File(file), solutions) + if (inPlace) { + for (file <- ctx.files) { + synth.updateFile(new java.io.File(file), solutions) + } } p -- GitLab