From 4bf3b2533555b4d36a1288ab04dccd4fb0b7a71f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Thu, 1 Oct 2020 15:37:34 +0200 Subject: [PATCH] [wp] force script merge before editing --- src/plugins/wp/ProverWhy3.ml | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml index fe578bed812..aded0a7e8b7 100644 --- a/src/plugins/wp/ProverWhy3.ml +++ b/src/plugins/wp/ProverWhy3.ml @@ -1274,9 +1274,20 @@ let scriptfile ~force ~ext wpo = let dir = Wp_parameters.get_session_dir ~force "interactive" in Format.sprintf "%s/%s%s" (dir :> string) wpo.Wpo.po_sid ext -let call_editor ~script wpo pconf driver prover task = +let editor ~script ~merge wpo pconf driver prover task = Wp_parameters.feedback ~ontty:`Transient "Editing %S..." script ; Cache.clear_result ~digest:(digest wpo driver) prover task ; + if merge then + begin + let backup = script ^ ".bak" in + Sys.rename script backup ; + let old = open_in backup in + Command.pp_to_file script + (fun fmt -> + ignore @@ Why3.Driver.print_task_prepared ~old driver fmt task + ); + close_in old ; + end ; let call = Why3.Call_provers.call_editor ~command:(editor pconf) script in call_prover_task ~timeout:None ~steps:None pconf.prover call @@ -1286,15 +1297,17 @@ let compile ~script ~timeout wpo pconf driver prover task = Cache.get_result ~digest ~runner ~timeout ~steplimit:None prover task let prepare ~mode wpo driver task = - let force = match mode with VCS.BatchMode -> false | _ -> true in let ext = Filename.extension (Why3.Driver.file_of_task driver "S" "T" task) in + let force = mode <> VCS.BatchMode in let script = scriptfile ~force wpo ~ext in - if Sys.file_exists script then Some script - else if force then + if Sys.file_exists script then Some (script, true) else + if force then begin - Command.pp_to_file script (fun fmt -> - ignore (Why3.Driver.print_task_prepared driver fmt task) - ) ; Some script + Command.pp_to_file script + (fun fmt -> + ignore @@ Why3.Driver.print_task_prepared driver fmt task + ); + Some (script, false) end else None @@ -1303,19 +1316,19 @@ let interactive ~mode wpo pconf driver prover task = let timeout = if time <= 0 then None else Some time in match prepare ~mode wpo driver task with | None -> Task.return VCS.unknown - | Some script -> + | Some (script, merge) -> match mode with | VCS.BatchMode -> compile ~script ~timeout wpo pconf driver prover task | VCS.EditMode -> let open Task in - call_editor ~script wpo pconf driver prover task >>= fun _ -> + editor ~script ~merge wpo pconf driver prover task >>= fun _ -> compile ~script ~timeout wpo pconf driver prover task | VCS.FixMode -> let open Task in compile ~script ~timeout wpo pconf driver prover task >>= fun r -> if VCS.is_valid r then return r else - call_editor ~script wpo pconf driver prover task >>= fun _ -> + editor ~script ~merge wpo pconf driver prover task >>= fun _ -> compile ~script ~timeout wpo pconf driver prover task (* -------------------------------------------------------------------------- *) -- GitLab