diff --git a/src/main/scala/leon/synthesis/SynthesisPhase.scala b/src/main/scala/leon/synthesis/SynthesisPhase.scala index bf7a62e7eac26b26f8f079034b502cb271cffc6b..b21f87ae304e5b58fd03290fe63d68bb93f60cd7 100644 --- a/src/main/scala/leon/synthesis/SynthesisPhase.scala +++ b/src/main/scala/leon/synthesis/SynthesisPhase.scala @@ -14,7 +14,8 @@ object SynthesisPhase extends LeonPhase[Program, PipelineControl] { new FairZ3Solver(quietReporter) ) - val newProgram = new Synthesizer(ctx.reporter, solvers).synthesizeAll(p) + val synth = new Synthesizer(ctx.reporter, solvers) + val solutions = synth.synthesizeAll(p) detectEditor match { case Some(program) => @@ -31,7 +32,31 @@ object SynthesisPhase extends LeonPhase[Program, PipelineControl] { } def openEditor(program: String, path: String) { - val p = sys.process.Process(program+" "+path) - p !< + val proc = Runtime.getRuntime().exec(program+" "+path) + + val errGobbler = new StreamGobbler(proc.getErrorStream(), System.err) + val outGobbler = new StreamGobbler(proc.getInputStream(), System.out) + val inGobbler = new StreamGobbler(System.in, proc.getOutputStream()) + + errGobbler.start() + outGobbler.start() + inGobbler.start() + + proc.waitFor() + errGobbler.join() + outGobbler.join() + } + + import java.io.{InputStream, OutputStream} + class StreamGobbler(is: InputStream, os: OutputStream) extends Thread { + override def run() { + var c: Int = is.read() + while(c != 1) { + os.write(c); + os.flush(); + + c = is.read() + } + } } } diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala index 9e02f8025770e08043950dd7adf5a821cb8cf75b..7e53e3812bada7a33bb82b095413410adf6444b0 100644 --- a/src/main/scala/leon/synthesis/Synthesizer.scala +++ b/src/main/scala/leon/synthesis/Synthesizer.scala @@ -86,8 +86,8 @@ class Synthesizer(val r: Reporter, val solvers: List[Solver]) { (None, Map()) } - def synthesizeAll(program: Program) = { - import purescala.Trees._ + import purescala.Trees._ + def synthesizeAll(program: Program): List[(Choose, Solution)] = { solvers.foreach(_.setProgram(program)) @@ -95,8 +95,10 @@ class Synthesizer(val r: Reporter, val solvers: List[Solver]) { def noop(u:Expr, u2: Expr) = u + var solutions = List[(Choose, Solution)]() + def actOnChoose(f: FunDef)(e: Expr, a: Expr): Expr = e match { - case Choose(vars, pred) => + case ch @ Choose(vars, pred) => val xs = vars val as = (variablesOf(pred)--xs).toList val phi = pred @@ -105,8 +107,11 @@ class Synthesizer(val r: Reporter, val solvers: List[Solver]) { info("") info("In Function "+f.id+":") info("-"*80) + val sol = synthesize(Problem(as, phi, xs), rules) + solutions = (ch, sol) :: solutions + info("Scala code:") info(ScalaPrinter(simplifyLets(sol.toExpr))) @@ -120,6 +125,13 @@ class Synthesizer(val r: Reporter, val solvers: List[Solver]) { treeCatamorphism(x => x, noop, actOnChoose(f), f.body.get) } - program + solutions + } + + def substitueChooses(file: String, sols: List[(Choose, Solution)]) = { + import scala.io.Source + + val src = Source.fromFile(file) + } }