2022-05-18 16:10:59 +03:00
|
|
|
(* This file is part of the Catala compiler, a specification language for tax
|
|
|
|
and social benefits computation rules. Copyright (C) 2020 Inria, contributor:
|
2022-03-04 20:32:03 +03:00
|
|
|
Emile Rolley <emile.rolley@tuta.io>, Louis Gesbert <louis.gesbert@inria.fr>
|
2022-05-18 16:10:59 +03:00
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
|
|
use this file except in compliance with the License. You may obtain a copy of
|
|
|
|
the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
License for the specific language governing permissions and limitations under
|
|
|
|
the License. *)
|
|
|
|
|
2022-03-04 20:32:03 +03:00
|
|
|
(** Run finaliser [f] unconditionally after running [k ()], propagating any
|
|
|
|
raised exception. *)
|
|
|
|
let finally f k =
|
|
|
|
match k () with
|
2022-05-18 16:10:59 +03:00
|
|
|
| exception e ->
|
|
|
|
let bt = Printexc.get_raw_backtrace () in
|
2022-03-04 20:32:03 +03:00
|
|
|
f ();
|
2022-05-18 16:10:59 +03:00
|
|
|
Printexc.raise_with_backtrace e bt
|
2022-03-04 20:32:03 +03:00
|
|
|
| r ->
|
|
|
|
f ();
|
|
|
|
r
|
2022-05-18 16:10:59 +03:00
|
|
|
|
2022-03-04 20:32:03 +03:00
|
|
|
let with_out_channel filename f =
|
2022-05-18 16:10:59 +03:00
|
|
|
let oc = open_out filename in
|
2022-03-04 20:32:03 +03:00
|
|
|
finally (fun () -> close_out oc) (fun () -> f oc)
|
|
|
|
|
2022-07-08 15:10:25 +03:00
|
|
|
let with_in_channel filename f =
|
|
|
|
let oc = open_in filename in
|
|
|
|
finally (fun () -> close_in oc) (fun () -> f oc)
|
|
|
|
|
2022-03-04 20:32:03 +03:00
|
|
|
let with_formatter_of_out_channel oc f =
|
|
|
|
let fmt = Format.formatter_of_out_channel oc in
|
|
|
|
finally (fun () -> Format.pp_print_flush fmt ()) @@ fun () -> f fmt
|
|
|
|
|
|
|
|
let with_formatter_of_file filename f =
|
|
|
|
with_out_channel filename (fun oc -> with_formatter_of_out_channel oc f)
|
2022-05-18 16:10:59 +03:00
|
|
|
|
|
|
|
let with_formatter_of_opt_file filename_opt f =
|
|
|
|
match filename_opt with
|
2022-03-04 20:32:03 +03:00
|
|
|
| None -> finally (fun () -> flush stdout) (fun () -> f Format.std_formatter)
|
2022-05-18 16:10:59 +03:00
|
|
|
| Some filename -> with_formatter_of_file filename f
|
2022-07-21 16:51:29 +03:00
|
|
|
|
|
|
|
let ocamlformat_file_opt = function
|
|
|
|
| Some f ->
|
|
|
|
Cli.debug_print "Formatting %s..." f;
|
|
|
|
if Sys.command (Printf.sprintf "ocamlformat %s -i" f) <> 0 then
|
2022-07-21 17:18:36 +03:00
|
|
|
Cli.error_print "Internal error: ocamlformat failed on %s" f
|
2022-07-21 16:51:29 +03:00
|
|
|
| None -> ()
|