Move global options of Cli to their own module

This resolves a dependency cycle that would forbid `Cli` from using the modue
`File`, which was annoying.
This commit is contained in:
Louis Gesbert 2024-03-15 14:23:30 +01:00
parent 77ba1b8b38
commit 4cec981f62
45 changed files with 370 additions and 326 deletions

View File

@ -87,7 +87,7 @@ module Cli = struct
catala_opts:string list ->
build_dir:File.t option ->
include_dirs:string list ->
color:Cli.when_enum ->
color:Global.when_enum ->
debug:bool ->
ninja_output:File.t option ->
'a) ->
@ -103,7 +103,7 @@ module Cli = struct
let color =
Arg.(
value
& opt ~vopt:Cli.Always Cli.when_opt Auto
& opt ~vopt:Global.Always Cli.when_opt Auto
& info ["color"]
~env:(Cmd.Env.info "CATALA_COLOR")
~doc:
@ -895,7 +895,7 @@ let ninja_init
~debug
~ninja_output :
extra:def Seq.t -> test_flags:string list -> (File.t -> 'a) -> 'a =
let _options = Catala_utils.Cli.enforce_globals ~debug ~color () in
let _options = Catala_utils.Global.enforce_options ~debug ~color () in
let chdir =
match chdir with None -> Lazy.force Poll.project_root | some -> some
in
@ -933,7 +933,7 @@ let ninja_cmdline ninja_flags nin_file targets =
:: "-f"
:: nin_file
:: (if ninja_flags = "" then [] else [ninja_flags])
@ (if Catala_utils.Cli.globals.debug then ["-v"] else [])
@ (if Catala_utils.Global.options.debug then ["-v"] else [])
@ targets)
open Cmdliner
@ -1074,7 +1074,7 @@ let main () =
| Message.CompilerError content ->
let bt = Printexc.get_raw_backtrace () in
Message.Content.emit content Error;
if Catala_utils.Cli.globals.debug then
if Catala_utils.Global.options.debug then
Printexc.print_raw_backtrace stderr bt;
exit Cmd.Exit.some_error
| Sys_error msg ->

View File

@ -54,7 +54,8 @@ let test_command_args =
fun str ->
exec_opt re str |> Option.map (fun g -> String.trim (Re.Group.get g 1))
let catala_file (file : File.t) (lang : Catala_utils.Cli.backend_lang) : item =
let catala_file (file : File.t) (lang : Catala_utils.Global.backend_lang) : item
=
let module L = Surface.Lexer_common in
let rec parse lines n acc =
match Seq.uncons lines with

View File

@ -46,10 +46,10 @@ type item = {
(** Contains all the data extracted from a single Catala file. Lists are in
reverse file order. *)
val get_lang : File.t -> Cli.backend_lang option
val get_lang : File.t -> Global.backend_lang option
(** Guesses Catala dialect from file-name and global options *)
val catala_file : File.t -> Catala_utils.Cli.backend_lang -> item
val catala_file : File.t -> Global.backend_lang -> item
(** Scans a single Catala file into an item *)
val tree : File.t -> (File.t * File.t list * item list) Seq.t

View File

@ -15,16 +15,11 @@
License for the specific language governing permissions and limitations under
the License. *)
(* Types used by flags & options *)
open Global
type file = string
type raw_file = file
type backend_lang = En | Fr | Pl
type when_enum = Auto | Always | Never
type message_format_enum = Human | GNU
type input_src = FileName of file | Contents of string * file | Stdin of file
(* Manipulation of types used by flags & options *)
(** Associates a {!type: Cli.backend_lang} with its string represtation. *)
(** Associates a {!type: Global.backend_lang} with its string represtation. *)
let languages = ["en", En; "fr", Fr; "pl", Pl]
let language_code =
@ -34,68 +29,17 @@ let language_code =
let input_src_file = function FileName f | Contents (_, f) | Stdin f -> f
let message_format_opt = ["human", Human; "gnu", GNU]
type options = {
mutable input_src : input_src;
mutable language : backend_lang option;
mutable debug : bool;
mutable color : when_enum;
mutable message_format : message_format_enum;
mutable trace : bool;
mutable plugins_dirs : file list;
mutable disable_warnings : bool;
mutable max_prec_digits : int;
mutable path_rewrite : raw_file -> file;
}
(* Note: we force that the global options (ie options common to all commands)
and the options available through global refs are the same. While this is a
bit arbitrary, it makes some sense code-wise and provides some safeguard
against explosion of the number of global references. Reducing the number of
globals further would be nice though. *)
let globals =
{
input_src = Stdin "-stdin-";
language = None;
debug = false;
color = Auto;
message_format = Human;
trace = false;
plugins_dirs = [];
disable_warnings = false;
max_prec_digits = 20;
path_rewrite = (fun _ -> assert false);
}
let enforce_globals
?input_src
?language
?debug
?color
?message_format
?trace
?plugins_dirs
?disable_warnings
?max_prec_digits
?path_rewrite
() =
Option.iter (fun x -> globals.input_src <- x) input_src;
Option.iter (fun x -> globals.language <- x) language;
Option.iter (fun x -> globals.debug <- x) debug;
Option.iter (fun x -> globals.color <- x) color;
Option.iter (fun x -> globals.message_format <- x) message_format;
Option.iter (fun x -> globals.trace <- x) trace;
Option.iter (fun x -> globals.plugins_dirs <- x) plugins_dirs;
Option.iter (fun x -> globals.disable_warnings <- x) disable_warnings;
Option.iter (fun x -> globals.max_prec_digits <- x) max_prec_digits;
Option.iter (fun x -> globals.path_rewrite <- x) path_rewrite;
globals
open Cmdliner
(* Arg converters for our custom types *)
let when_opt = Arg.enum ["auto", Auto; "always", Always; "never", Never]
let raw_file =
Arg.conv ~docv:"FILE"
( (fun f -> Result.map raw_file (Arg.conv_parser Arg.string f)),
(fun ppf f -> Format.pp_print_string ppf (f :> string)) )
(* Some helpers for catala sources *)
let extensions = [".catala_fr", Fr; ".catala_en", En; ".catala_pl", Pl]
@ -105,7 +49,7 @@ let file_lang filename =
|> function
| Some lang -> lang
| None -> (
match globals.language with
match Global.options.language with
| Some lang -> lang
| None ->
Format.kasprintf failwith
@ -123,7 +67,7 @@ let exec_dir =
Filename.dirname Sys.executable_name
let reverse_path ?(from_dir = Sys.getcwd ()) ~to_dir f =
if Filename.is_relative from_dir then invalid_arg "File.with_reverse_path"
if Filename.is_relative from_dir then invalid_arg "Cli.reverse_path"
else if not (Filename.is_relative f) then f
else if not (Filename.is_relative to_dir) then Filename.concat from_dir f
else
@ -160,11 +104,11 @@ module Flags = struct
let converter =
conv ~docv:"FILE"
( (fun s ->
if s = "-" then Ok (Stdin "-stdin-")
else Result.map (fun f -> FileName f) (conv_parser non_dir_file s)),
if s = "-" then Ok (Stdin (Global.raw_file "-stdin-"))
else Result.map (fun f -> FileName (Global.raw_file f)) (conv_parser non_dir_file s)),
fun ppf -> function
| Stdin _ -> Format.pp_print_string ppf "-"
| FileName f -> conv_printer non_dir_file ppf f
| FileName f -> conv_printer non_dir_file ppf (f :> file)
| _ -> assert false )
in
required
@ -291,13 +235,16 @@ module Flags = struct
if debug then Printexc.record_backtrace true;
let path_rewrite =
match directory with
| None -> fun f -> f
| None -> fun (f: Global.raw_file) -> (f :> file)
| Some to_dir -> (
function "-" -> "-" | f -> reverse_path ~to_dir f)
fun (f: Global.raw_file) ->
match (f :> file) with
| "-" -> "-"
| f -> reverse_path ~to_dir f)
in
(* This sets some global refs for convenience, but most importantly
returns the options record. *)
enforce_globals ~language ~debug ~color ~message_format ~trace
Global.enforce_options ~language ~debug ~color ~message_format ~trace
~plugins_dirs ~disable_warnings ~max_prec_digits ~path_rewrite ()
in
Term.(
@ -316,25 +263,16 @@ module Flags = struct
let make input_src name directory options : options =
(* Set some global refs for convenience *)
let input_src =
match name with
| None -> input_src
| Some name -> (
match input_src with
| FileName f -> FileName f
| Contents (str, _) -> Contents (str, name)
| Stdin _ -> Stdin name)
in
let input_src =
let rename f =
match name with None -> f | Some n -> Global.raw_file n
in
match input_src with
| FileName f -> FileName (options.path_rewrite f)
| Contents (str, f) -> Contents (str, options.path_rewrite f)
| Stdin f -> Stdin (options.path_rewrite f)
| Contents (str, f) -> Contents (str, options.path_rewrite (rename f))
| Stdin f -> Stdin (options.path_rewrite (rename f))
in
let plugins_dirs = List.map options.path_rewrite options.plugins_dirs in
Option.iter Sys.chdir directory;
globals.input_src <- input_src;
globals.plugins_dirs <- plugins_dirs;
{ options with input_src; plugins_dirs }
Global.enforce_options ~input_src ()
in
Term.(const make $ input_src $ name_flag $ directory $ flags)
end
@ -343,7 +281,7 @@ module Flags = struct
let arg =
Arg.(
value
& opt_all (list ~sep:':' string) []
& opt_all (list ~sep:':' raw_file) []
& info ["I"; "include"] ~docv:"DIR"
~env:(Cmd.Env.info "CATALA_INCLUDE")
~doc:
@ -394,7 +332,7 @@ module Flags = struct
let output =
value
& opt (some string) None
& opt (some raw_file) None
& info ["output"; "o"] ~docv:"OUTPUT"
~env:(Cmd.Env.info "CATALA_OUT")
~doc:

View File

@ -15,33 +15,7 @@
License for the specific language governing permissions and limitations under
the License. *)
type file = string
(** File names ; equal to [File.t] but let's avoid cyclic dependencies *)
type raw_file
(** A file name that has not yet been resolved, [options.path_rewrite] must be
called on it *)
type backend_lang = En | Fr | Pl
(** The usual auto/always/never option argument *)
type when_enum = Auto | Always | Never
val when_opt : when_enum Cmdliner.Arg.conv
type message_format_enum =
| Human
| GNU (** Format of error and warning messages output by the compiler. *)
(** Sources for program input *)
type input_src =
| FileName of file (** A file path to read from disk *)
| Contents of string * file
(** A raw string containing the code, and the corresponding (fake)
filename *)
| Stdin of file
(** Read from stdin; the specified filename will be used for file lookups,
error reportings, etc. *)
open Global
val languages : (string * backend_lang) list
@ -49,10 +23,10 @@ val language_code : backend_lang -> string
(** Returns the lowercase two-letter language code *)
val file_lang : file -> backend_lang
(** Associates a file extension with its corresponding {!type: Cli.backend_lang}
(** Associates a file extension with its corresponding {!type: Global.backend_lang}
string representation. *)
val input_src_file : input_src -> file
val input_src_file : file input_src -> file
val reverse_path : ?from_dir:file -> to_dir:file -> file -> file
(** If [to_dir] is a path to a given directory and [f] a path to a file as seen
@ -60,48 +34,10 @@ val reverse_path : ?from_dir:file -> to_dir:file -> file -> file
leading to [f] from [to_dir]. The results attempts to be relative to
[to_dir]. *)
(** {2 Configuration globals} *)
type options = private {
mutable input_src : input_src;
mutable language : backend_lang option;
mutable debug : bool;
mutable color : when_enum;
mutable message_format : message_format_enum;
mutable trace : bool;
mutable plugins_dirs : string list;
mutable disable_warnings : bool;
mutable max_prec_digits : int;
mutable path_rewrite : raw_file -> file;
}
(** Global options, common to all subcommands (note: the fields are internally
mutable only for purposes of the [globals] toplevel value defined below) *)
val globals : options
(** A global definition to the global options is provided for convenience, e.g.
choosing the proper output in formatting functions. Prefer the use of the
options returned by the command-line parsing whenever possible. *)
val enforce_globals :
?input_src:input_src ->
?language:backend_lang option ->
?debug:bool ->
?color:when_enum ->
?message_format:message_format_enum ->
?trace:bool ->
?plugins_dirs:string list ->
?disable_warnings:bool ->
?max_prec_digits:int ->
?path_rewrite:(file -> file) ->
unit ->
options
(** Sets up the global options (side-effect); for specific use-cases only, this
should never be called from the compiler or when going through normal
command-line parsing. Proper uses include setting up the compiler library
when using it directly through a specific front-end. *)
(** {2 CLI flags and options} *)
val when_opt: when_enum Cmdliner.Arg.conv
module Flags : sig
open Cmdliner

View File

@ -16,6 +16,8 @@
type t = string
let format ppf t = Format.fprintf ppf "\"@{<cyan>%s@}\"" t
(** Run finaliser [f] unconditionally after running [k ()], propagating any
raised exception. *)
let finally f k =
@ -30,7 +32,7 @@ let finally f k =
let temp_file pfx sfx =
let f = Filename.temp_file pfx sfx in
if not Cli.globals.debug then
if not Global.options.debug then
at_exit (fun () -> try Sys.remove f with _ -> ());
f
@ -190,8 +192,6 @@ let equal a b =
let compare a b =
String.compare (String.lowercase_ascii a) (String.lowercase_ascii b)
let format ppf t = Format.fprintf ppf "\"@{<cyan>%s@}\"" t
module Set = Set.Make (struct
type nonrec t = t

View File

@ -44,7 +44,7 @@ val with_formatter_of_opt_file : t option -> (Format.formatter -> 'a) -> 'a
{!with_formatter_of_file}), otherwise, uses the [Format.std_formatter]. *)
val get_out_channel :
source_file:Cli.input_src ->
source_file:t Global.input_src ->
output_file:t option ->
?ext:string ->
unit ->
@ -54,7 +54,7 @@ val get_out_channel :
equal to [Some "-"] returns a wrapper around [stdout]. *)
val get_formatter_of_out_channel :
source_file:Cli.input_src ->
source_file:t Global.input_src ->
output_file:t option ->
?ext:string ->
unit ->

View File

@ -0,0 +1,84 @@
(* This file is part of the Catala compiler, a specification language for tax
and social benefits computation rules. Copyright (C) 2024 Inria,
contributors: Louis Gesbert <louis.gesbert@inria.fr>
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. *)
type file = string
type raw_file = file
type backend_lang = En | Fr | Pl
type when_enum = Auto | Always | Never
type message_format_enum = Human | GNU
type 'file input_src =
| FileName of 'file
| Contents of string * 'file
| Stdin of 'file
(* ['file] is expected to be [file] or [raw_file] *)
type options = {
mutable input_src : file input_src;
mutable language : backend_lang option;
mutable debug : bool;
mutable color : when_enum;
mutable message_format : message_format_enum;
mutable trace : bool;
mutable plugins_dirs : file list;
mutable disable_warnings : bool;
mutable max_prec_digits : int;
mutable path_rewrite : raw_file -> file;
}
(* Note: we force that the global options (ie options common to all commands)
and the options available through global refs are the same. While this is a
bit arbitrary, it makes some sense code-wise and provides some safeguard
against explosion of the number of global references. Reducing the number of
globals further would be nice though. *)
let options =
{
input_src = Stdin "-stdin-";
language = None;
debug = false;
color = Auto;
message_format = Human;
trace = false;
plugins_dirs = [];
disable_warnings = false;
max_prec_digits = 20;
path_rewrite = (fun _ -> assert false);
}
let enforce_options
?input_src
?language
?debug
?color
?message_format
?trace
?plugins_dirs
?disable_warnings
?max_prec_digits
?path_rewrite
() =
Option.iter (fun x -> options.input_src <- x) input_src;
Option.iter (fun x -> options.language <- x) language;
Option.iter (fun x -> options.debug <- x) debug;
Option.iter (fun x -> options.color <- x) color;
Option.iter (fun x -> options.message_format <- x) message_format;
Option.iter (fun x -> options.trace <- x) trace;
Option.iter (fun x -> options.plugins_dirs <- x) plugins_dirs;
Option.iter (fun x -> options.disable_warnings <- x) disable_warnings;
Option.iter (fun x -> options.max_prec_digits <- x) max_prec_digits;
Option.iter (fun x -> options.path_rewrite <- x) path_rewrite;
options
let raw_file f = f

View File

@ -0,0 +1,85 @@
(* This file is part of the Catala compiler, a specification language for tax
and social benefits computation rules. Copyright (C) 2024 Inria,
contributors: Louis Gesbert <louis.gesbert@inria.fr>
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. *)
(** This module contains definitions of global flags and types used throughout. They should be defined from the command-line and never modified afterwards. *)
type file = string
(** File names ; equal to [File.t] but let's avoid cyclic dependencies *)
type raw_file = private file
(** A file name that has not yet been resolved, [options.path_rewrite] must be
called on it *)
type backend_lang = En | Fr | Pl
(** The usual auto/always/never option argument *)
type when_enum = Auto | Always | Never
type message_format_enum =
| Human
| GNU (** Format of error and warning messages output by the compiler. *)
(** Sources for program input *)
type 'file input_src =
| FileName of 'file (** A file path to read from disk *)
| Contents of string * 'file
(** A raw string containing the code, and the corresponding (fake)
filename *)
| Stdin of 'file
(** Read from stdin; the specified filename will be used for file lookups,
error reportings, etc. *)
(** {2 Configuration globals} *)
type options = private {
mutable input_src : file input_src;
mutable language : backend_lang option;
mutable debug : bool;
mutable color : when_enum;
mutable message_format : message_format_enum;
mutable trace : bool;
mutable plugins_dirs : file list;
mutable disable_warnings : bool;
mutable max_prec_digits : int;
mutable path_rewrite : raw_file -> file;
}
(** Global options, common to all subcommands (note: the fields are internally
mutable only for purposes of the [globals] toplevel value defined below) *)
val options : options
(** A global definition to the global options is provided for convenience, e.g.
choosing the proper output in formatting functions. Prefer the use of the
options returned by the command-line parsing whenever possible. *)
val enforce_options :
?input_src:file input_src ->
?language:backend_lang option ->
?debug:bool ->
?color:when_enum ->
?message_format:message_format_enum ->
?trace:bool ->
?plugins_dirs:file list ->
?disable_warnings:bool ->
?max_prec_digits:int ->
?path_rewrite:(raw_file -> file) ->
unit ->
options
(** Sets up the global options (side-effect); for specific use-cases only, this
should never be called from the compiler outside of the [Cli] module. Other proper uses include setting up the compiler library
when using it directly through a specific front-end. *)
val raw_file : string -> raw_file
(** Create a [raw_file], for use directly after parsing from the cmdline *)

View File

@ -39,8 +39,8 @@ let () = ignore (unstyle_formatter Format.str_formatter)
below std_ppf / err_ppf *)
let has_color oc =
match Cli.globals.color with
| Cli.Never -> false
match Global.options.color with
| Global.Never -> false
| Always -> true
| Auto -> Unix.(isatty (descr_of_out_channel oc))
@ -78,8 +78,8 @@ type content_type = Error | Warning | Debug | Log | Result
let get_ppf = function
| Result -> Lazy.force std_ppf
| Debug when not Cli.globals.debug -> Lazy.force ignore_ppf
| Warning when Cli.globals.disable_warnings -> Lazy.force ignore_ppf
| Debug when not Global.options.debug -> Lazy.force ignore_ppf
| Warning when Global.options.disable_warnings -> Lazy.force ignore_ppf
| Error | Log | Debug | Warning -> Lazy.force err_ppf
(**{3 Markers}*)
@ -150,8 +150,8 @@ module Content = struct
[MainMessage (fun ppf -> Format.pp_print_string ppf s)]
let emit (content : t) (target : content_type) : unit =
match Cli.globals.message_format with
| Cli.Human ->
match Global.options.message_format with
| Global.Human ->
let ppf = get_ppf target in
Format.fprintf ppf "@[<hv>%t%t%a@]@." (pp_marker target)
(fun (ppf : Format.formatter) ->
@ -174,7 +174,7 @@ module Content = struct
Suggestions.format ppf suggestions_list)
ppf message_elements)
content
| Cli.GNU ->
| Global.GNU ->
(* The top message doesn't come with a position, which is not something
the GNU standard allows. So we look the position list and put the top
message everywhere there is not a more precise message. If we can't

View File

@ -130,7 +130,7 @@ let format_loc_text ppf (pos : t) =
let eline = get_end_line pos in
let ic, input_line_opt =
let from_contents =
match Cli.globals.input_src with
match Global.options.input_src with
| Contents (str, _) when str = filename -> Some str
| _ -> None
in

View File

@ -19,7 +19,7 @@ let () =
Message.raise_error "Unrecognised input locale %S" language
in
let options =
Cli.enforce_globals
Global.enforce_options
~input_src:(Contents (contents, "-inline-"))
~language:(Some language) ~debug:false ~color:Never ~trace ()
in

View File

@ -140,7 +140,7 @@ let tag_with_log_entry
(markings : Uid.MarkedString.info list) : 'm Ast.expr boxed =
let m = mark_tany (Mark.get e) (Expr.pos e) in
if Cli.globals.trace then
if Global.options.trace then
Expr.eappop ~op:(Log (l, markings)) ~tys:[TAny, Expr.pos e] ~args:[e] m
else e

View File

@ -238,7 +238,7 @@ type program = {
program_ctx : decl_ctx;
program_modules : modul ModuleName.Map.t;
program_root : modul;
program_lang : Cli.backend_lang;
program_lang : Global.backend_lang;
}
let rec locations_used e : LocationSet.t =

View File

@ -126,7 +126,7 @@ type program = {
program_modules : modul ModuleName.Map.t;
(** Contains all submodules of the program, in a flattened structure *)
program_root : modul;
program_lang : Cli.backend_lang;
program_lang : Global.backend_lang;
}
(** {1 Helpers} *)

View File

@ -18,7 +18,7 @@
open Catala_utils
open Shared_ast
(** Associates a file extension with its corresponding {!type: Cli.backend_lang}
(** Associates a file extension with its corresponding {!type: Global.backend_lang}
string representation. *)
let extensions = [".catala_fr", "fr"; ".catala_en", "en"; ".catala_pl", "pl"]
@ -37,7 +37,7 @@ let load_module_interfaces
if program.Surface.Ast.program_used_modules <> [] then
Message.emit_debug "Loading module interfaces...";
let includes =
List.map options.Cli.path_rewrite includes @ more_includes
List.map options.Global.path_rewrite includes @ more_includes
|> List.map File.Tree.build
|> List.fold_left File.Tree.union File.Tree.empty
in
@ -90,7 +90,7 @@ let load_module_interfaces
in
let intf =
Surface.Parser_driver.load_interface ?default_module_name
(Cli.FileName f)
(Global.FileName f)
in
let modname = ModuleName.fresh intf.intf_modname in
let seen = File.Map.add f None seen in
@ -137,7 +137,7 @@ module Passes = struct
let surface options : Surface.Ast.program =
debug_pass_name "surface";
let prg =
Surface.Parser_driver.parse_top_level_file options.Cli.input_src
Surface.Parser_driver.parse_top_level_file options.Global.input_src
in
Surface.Fill_positions.fill_pos_with_legislative_info prg
@ -169,8 +169,8 @@ module Passes = struct
let dcalc :
type ty.
Cli.options ->
includes:Cli.raw_file list ->
Global.options ->
includes:Global.raw_file list ->
optimize:bool ->
check_invariants:bool ->
typed:ty mark ->
@ -402,18 +402,18 @@ module Commands = struct
second_part )
let get_output ?ext options output_file =
let output_file = Option.map options.Cli.path_rewrite output_file in
File.get_out_channel ~source_file:options.Cli.input_src ~output_file ?ext ()
let output_file = Option.map options.Global.path_rewrite output_file in
File.get_out_channel ~source_file:options.Global.input_src ~output_file ?ext ()
let get_output_format ?ext options output_file =
let output_file = Option.map options.Cli.path_rewrite output_file in
File.get_formatter_of_out_channel ~source_file:options.Cli.input_src
let output_file = Option.map options.Global.path_rewrite output_file in
File.get_formatter_of_out_channel ~source_file:options.Global.input_src
~output_file ?ext ()
let makefile options output =
let prg = Passes.surface options in
let backend_extensions_list = [".tex"] in
let source_file = Cli.input_src_file options.Cli.input_src in
let source_file = Cli.input_src_file options.Global.input_src in
let output_file, with_output = get_output options ~ext:".d" output in
Message.emit_debug "Writing list of dependencies to %s..."
(Option.value ~default:"stdout" output_file);
@ -444,7 +444,7 @@ module Commands = struct
in
with_output
@@ fun fmt ->
let language = Cli.file_lang (Cli.input_src_file options.Cli.input_src) in
let language = Cli.file_lang (Cli.input_src_file options.Global.input_src) in
let weave_output = Literate.Html.ast_to_html language ~print_only_law in
Message.emit_debug "Writing to %s"
(Option.value ~default:"stdout" output_file);
@ -480,7 +480,7 @@ module Commands = struct
in
with_output
@@ fun fmt ->
let language = Cli.file_lang (Cli.input_src_file options.Cli.input_src) in
let language = Cli.file_lang (Cli.input_src_file options.Global.input_src) in
let weave_output = Literate.Latex.ast_to_latex language ~print_only_law in
Message.emit_debug "Writing to %s"
(Option.value ~default:"stdout" output_file);
@ -549,11 +549,11 @@ module Commands = struct
match ex_scope_opt with
| Some scope ->
let scope_uid = get_scope_uid prg.program_ctx scope in
Scopelang.Print.scope ~debug:options.Cli.debug prg.program_ctx fmt
Scopelang.Print.scope ~debug:options.Global.debug prg.program_ctx fmt
(scope_uid, ScopeName.Map.find scope_uid prg.program_scopes);
Format.pp_print_newline fmt ()
| None ->
Scopelang.Print.program ~debug:options.Cli.debug fmt prg;
Scopelang.Print.program ~debug:options.Global.debug fmt prg;
Format.pp_print_newline fmt ()
let scopelang_cmd =
@ -615,7 +615,7 @@ module Commands = struct
match ex_scope_opt with
| Some scope ->
let scope_uid = get_scope_uid prg.decl_ctx scope in
Print.scope ~debug:options.Cli.debug prg.decl_ctx fmt
Print.scope ~debug:options.Global.debug prg.decl_ctx fmt
( scope_uid,
BoundList.find
~f:(function
@ -629,7 +629,7 @@ module Commands = struct
(* TODO: ??? *)
let prg_dcalc_expr = Expr.unbox (Program.to_expr prg scope_uid) in
Format.fprintf fmt "%a\n"
(Print.expr ~debug:options.Cli.debug ())
(Print.expr ~debug:options.Global.debug ())
prg_dcalc_expr
let dcalc_cmd =
@ -694,11 +694,11 @@ module Commands = struct
in
Message.emit_result "Computation successful!%s"
(if List.length results > 0 then " Results:" else "");
let language = Cli.file_lang (Cli.input_src_file options.Cli.input_src) in
let language = Cli.file_lang (Cli.input_src_file options.Global.input_src) in
List.iter
(fun ((var, _), result) ->
Message.emit_result "@[<hov 2>%s@ =@ %a@]" var
(if options.Cli.debug then Print.expr ~debug:false ()
(if options.Global.debug then Print.expr ~debug:false ()
else Print.UserFacing.value language)
result)
results
@ -733,11 +733,11 @@ module Commands = struct
match ex_scope_opt with
| Some scope ->
let scope_uid = get_scope_uid prg.decl_ctx scope in
Print.scope ~debug:options.Cli.debug prg.decl_ctx fmt
Print.scope ~debug:options.Global.debug prg.decl_ctx fmt
(scope_uid, Program.get_scope_body prg scope_uid);
Format.pp_print_newline fmt ()
| None ->
Print.program ~debug:options.Cli.debug fmt prg;
Print.program ~debug:options.Global.debug fmt prg;
Format.pp_print_newline fmt ()
let lcalc_cmd =
@ -880,7 +880,7 @@ module Commands = struct
match ex_scope_opt with
| Some scope ->
let scope_uid = get_scope_uid prg.ctx.decl_ctx scope in
Scalc.Print.format_item ~debug:options.Cli.debug prg.ctx.decl_ctx fmt
Scalc.Print.format_item ~debug:options.Global.debug prg.ctx.decl_ctx fmt
(List.find
(function
| Scalc.Ast.SScope { scope_body_name; _ } ->
@ -1001,7 +1001,7 @@ module Commands = struct
$ Cli.Flags.check_invariants)
let depends options includes prefix extension extra_files =
let file = Cli.input_src_file options.Cli.input_src in
let file = Cli.input_src_file options.Global.input_src in
let more_includes = List.map Filename.dirname (file :: extra_files) in
let prg =
Surface.Ast.
@ -1151,7 +1151,7 @@ let main () =
Cmdliner.Cmd.eval_peek_opts ~argv Cli.Flags.Global.flags
~version_opt:true
with
| Some opts, _ -> opts.Cli.plugins_dirs
| Some opts, _ -> opts.Global.plugins_dirs
| None, _ -> []
in
Passes.debug_pass_name "init";
@ -1181,7 +1181,7 @@ let main () =
| exception Message.CompilerError content ->
let bt = Printexc.get_raw_backtrace () in
Message.Content.emit content Error;
if Cli.globals.debug then Printexc.print_raw_backtrace stderr bt;
if Global.options.debug then Printexc.print_raw_backtrace stderr bt;
exit Cmd.Exit.some_error
| exception Failure msg ->
let bt = Printexc.get_raw_backtrace () in

View File

@ -25,29 +25,29 @@ val main : unit -> unit
Each pass takes only its cli options, then calls upon its dependent passes
(forwarding their options as needed) *)
module Passes : sig
val surface : Cli.options -> Surface.Ast.program
val surface : Global.options -> Surface.Ast.program
val desugared :
Cli.options ->
includes:Cli.raw_file list ->
Global.options ->
includes:Global.raw_file list ->
Desugared.Ast.program * Desugared.Name_resolution.context
val scopelang :
Cli.options ->
includes:Cli.raw_file list ->
Global.options ->
includes:Global.raw_file list ->
Shared_ast.untyped Scopelang.Ast.program
val dcalc :
Cli.options ->
includes:Cli.raw_file list ->
Global.options ->
includes:Global.raw_file list ->
optimize:bool ->
check_invariants:bool ->
typed:'m Shared_ast.mark ->
'm Dcalc.Ast.program * Scopelang.Dependency.TVertex.t list
val lcalc :
Cli.options ->
includes:Cli.raw_file list ->
Global.options ->
includes:Global.raw_file list ->
optimize:bool ->
check_invariants:bool ->
typed:'m Shared_ast.mark ->
@ -57,8 +57,8 @@ module Passes : sig
Shared_ast.typed Lcalc.Ast.program * Scopelang.Dependency.TVertex.t list
val scalc :
Cli.options ->
includes:Cli.raw_file list ->
Global.options ->
includes:Global.raw_file list ->
optimize:bool ->
check_invariants:bool ->
avoid_exceptions:bool ->
@ -75,15 +75,15 @@ module Commands : sig
val get_output :
?ext:string ->
Cli.options ->
Cli.raw_file option ->
Global.options ->
Global.raw_file option ->
string option * ((out_channel -> 'a) -> 'a)
(** bounded open of the expected output file *)
val get_output_format :
?ext:string ->
Cli.options ->
Cli.raw_file option ->
Global.options ->
Global.raw_file option ->
string option * ((Format.formatter -> 'a) -> 'a)
val get_scope_uid : Shared_ast.decl_ctx -> string -> Shared_ast.ScopeName.t
@ -110,6 +110,6 @@ module Plugin : sig
string ->
?man:Cmdliner.Manpage.block list ->
?doc:string ->
(Cli.options -> unit) Cmdliner.Term.t ->
(Global.options -> unit) Cmdliner.Term.t ->
unit
end

View File

@ -392,11 +392,11 @@ let rec format_expr (ctx : decl_ctx) (fmt : Format.formatter) (e : 'm expr) :
args = [arg];
_;
}
when Cli.globals.trace ->
when Global.options.trace ->
Format.fprintf fmt "(log_begin_call@ %a@ %a)@ %a" format_uid_list info
format_with_parens f format_with_parens arg
| EAppOp { op = Log (VarDef var_def_info, info); args = [arg1]; _ }
when Cli.globals.trace ->
when Global.options.trace ->
Format.fprintf fmt
"(log_variable_definition@ %a@ {io_input=%s;@ io_output=%b}@ (%a)@ %a)"
format_uid_list info
@ -408,7 +408,7 @@ let rec format_expr (ctx : decl_ctx) (fmt : Format.formatter) (e : 'm expr) :
(var_def_info.log_typ, Pos.no_pos)
format_with_parens arg1
| EAppOp { op = Log (PosRecordIfTrueBool, _); args = [arg1]; _ }
when Cli.globals.trace ->
when Global.options.trace ->
let pos = Expr.pos e in
Format.fprintf fmt
"(log_decision_taken@ @[<hov 2>{filename = \"%s\";@ start_line=%d;@ \
@ -416,7 +416,7 @@ let rec format_expr (ctx : decl_ctx) (fmt : Format.formatter) (e : 'm expr) :
(Pos.get_file pos) (Pos.get_start_line pos) (Pos.get_start_column pos)
(Pos.get_end_line pos) (Pos.get_end_column pos) format_string_list
(Pos.get_law_info pos) format_with_parens arg1
| EAppOp { op = Log (EndCall, info); args = [arg1]; _ } when Cli.globals.trace
| EAppOp { op = Log (EndCall, info); args = [arg1]; _ } when Global.options.trace
->
Format.fprintf fmt "(log_end_call@ %a@ %a)" format_uid_list info
format_with_parens arg1
@ -540,7 +540,7 @@ let format_ctx
Format.fprintf fmt "@[<hov 2>%a:@ %a@]" format_struct_field_name
(None, struct_field) format_typ struct_field_type))
(StructField.Map.bindings struct_fields);
if Cli.globals.trace then
if Global.options.trace then
format_struct_embedding fmt (struct_name, struct_fields)
in
let format_enum_decl fmt (enum_name, enum_cons) =
@ -553,7 +553,7 @@ let format_ctx
Format.fprintf fmt "@[<hov 2>| %a@ of@ %a@]" format_enum_cons_name
enum_cons format_typ enum_cons_type))
(EnumConstructor.Map.bindings enum_cons);
if Cli.globals.trace then format_enum_embedding fmt (enum_name, enum_cons)
if Global.options.trace then format_enum_embedding fmt (enum_name, enum_cons)
in
let is_in_type_ordering s =
List.exists

View File

@ -23,7 +23,7 @@ open Literate_common
module A = Surface.Ast
module P = Printf
module R = Re.Pcre
module C = Cli
module C = Global
(** {1 Helpers} *)
@ -47,7 +47,7 @@ let remove_cb_last_lines : string -> string =
Prints an HTML complete page structure around the [wrapped] content. *)
let wrap_html
(source_files : string list)
(language : Cli.backend_lang)
(language : Global.backend_lang)
(fmt : Format.formatter)
(wrapped : Format.formatter -> unit) : unit =
let css_as_string =

View File

@ -23,7 +23,7 @@ open Catala_utils
val wrap_html :
string list ->
Cli.backend_lang ->
Global.backend_lang ->
Format.formatter ->
(Format.formatter -> unit) ->
unit
@ -34,7 +34,7 @@ val wrap_html :
(** {1 API} *)
val ast_to_html :
Cli.backend_lang ->
Global.backend_lang ->
print_only_law:bool ->
Format.formatter ->
Surface.Ast.program ->

View File

@ -21,7 +21,7 @@
open Catala_utils
open Literate_common
module A = Surface.Ast
module C = Cli
module C = Global
(** {1 Helpers} *)

View File

@ -23,7 +23,7 @@ open Catala_utils
val wrap_latex :
string list ->
Cli.backend_lang ->
Global.backend_lang ->
Format.formatter ->
(Format.formatter -> unit) ->
unit
@ -34,7 +34,7 @@ val wrap_latex :
(** {1 API} *)
val ast_to_latex :
Cli.backend_lang ->
Global.backend_lang ->
print_only_law:bool ->
Format.formatter ->
Surface.Ast.program ->

View File

@ -15,7 +15,7 @@
the License. *)
open Catala_utils
open Cli
open Global
let literal_title = function
| En -> "Legislative text implementation"

View File

@ -16,30 +16,30 @@
open Catala_utils
val literal_title : Cli.backend_lang -> string
val literal_title : Global.backend_lang -> string
(** Return the title traduction according the given
{!type:Catala_utils.Cli.backend_lang}. *)
{!type:Catala_utils.Global.backend_lang}. *)
val literal_generated_by : Cli.backend_lang -> string
val literal_generated_by : Global.backend_lang -> string
(** Return the 'generated by' traduction according the given
{!type:Catala_utils.Cli.backend_lang}. *)
{!type:Catala_utils.Global.backend_lang}. *)
val literal_source_files : Cli.backend_lang -> string
val literal_source_files : Global.backend_lang -> string
(** Return the 'source files weaved' traduction according the given
{!type:Catala_utils.Cli.backend_lang}. *)
{!type:Catala_utils.Global.backend_lang}. *)
val literal_disclaimer_and_link : Cli.backend_lang -> string
val literal_disclaimer_and_link : Global.backend_lang -> string
(** Return the traduction of a paragraph giving a basic disclaimer about Catala
and a link to the website according the given
{!type:Catala_utils.Cli.backend_lang}. *)
{!type:Catala_utils.Global.backend_lang}. *)
val literal_last_modification : Cli.backend_lang -> string
val literal_last_modification : Global.backend_lang -> string
(** Return the 'last modification' traduction according the given
{!type:Catala_utils.Cli.backend_lang}. *)
{!type:Catala_utils.Global.backend_lang}. *)
val get_language_extension : Cli.backend_lang -> string
val get_language_extension : Global.backend_lang -> string
(** Return the file extension corresponding to the given
{!type:Catala_utils.Cli.backend_lang}. *)
{!type:Catala_utils.Global.backend_lang}. *)
val run_pandoc : string -> [ `Html | `Latex ] -> string
(** Runs the [pandoc] on a string to pretty-print markdown features into the
@ -49,11 +49,11 @@ val check_exceeding_lines : ?max_len:int -> int -> string -> string -> unit
(** [check_exceeding_lines ~max_len start_line filename content] prints a
warning message for each lines of [content] exceeding [max_len] characters. *)
val call_pygmentize : ?lang:Cli.backend_lang -> string list -> string
val call_pygmentize : ?lang:Global.backend_lang -> string list -> string
(** Calls the [pygmentize] command with the given arguments, and returns the
results as a string. If [lang] is specified, the proper arguments for the
Catala lexer are already passed. *)
val with_pygmentize_lexer : Cli.backend_lang -> (string list -> 'a) -> 'a
val with_pygmentize_lexer : Global.backend_lang -> (string list -> 'a) -> 'a
(** Creates the required lexer file and returns the corresponding [pygmentize]
command-line arguments *)

View File

@ -20,9 +20,9 @@ open Literate_common
let lang_of_ext s =
if String.starts_with ~prefix:"catala_" s then
match s with
| "catala_en" -> Some Cli.En
| "catala_fr" -> Some Cli.Fr
| "catala_pl" -> Some Cli.Pl
| "catala_en" -> Some Global.En
| "catala_fr" -> Some Global.Fr
| "catala_pl" -> Some Global.Pl
| _ -> failwith "Unknown Catala dialect"
else None

View File

@ -21,7 +21,7 @@ type t = unit Cmdliner.Cmd.t
val register :
Cmdliner.Cmd.info ->
(Catala_utils.Cli.options -> unit) Cmdliner.Term.t ->
(Catala_utils.Global.options -> unit) Cmdliner.Term.t ->
unit
(** Plugins are registerd as [Cmdliner] commands, which must take at least the
default global options as arguments (this is required for e.g.

View File

@ -475,7 +475,7 @@ let run
closure_conversion
monomorphize_types
_options =
let options = Cli.enforce_globals ~trace:true () in
let options = Global.enforce_options ~trace:true () in
let prg, type_ordering =
Driver.Passes.lcalc options ~includes ~optimize ~check_invariants
~avoid_exceptions ~closure_conversion ~typed:Expr.typed
@ -494,7 +494,7 @@ let run
String.capitalize_ascii
Filename.(
basename
(remove_extension (Cli.input_src_file options.Cli.input_src)))
(remove_extension (Cli.input_src_file options.Global.input_src)))
in
To_jsoo.format_program fmt (Some modname) prg type_ordering)

View File

@ -23,7 +23,7 @@ type flags = {
merge_level : int;
format : [ `Dot | `Convert of string ];
show : string option;
output : Cli.raw_file option;
output : Global.raw_file option;
base_src_url : string;
}
@ -264,7 +264,7 @@ let rec lazy_eval : decl_ctx -> Env.t -> laziness_level -> expr -> expr * Env.t
e
in
let e =
Interpreter.evaluate_operator eval op m Cli.En
Interpreter.evaluate_operator eval op m Global.En
(* Default language to English but this should not raise any error
messages so we don't care. *)
args
@ -989,7 +989,7 @@ let rec graph_cleanup options g base_vars =
let expr_to_dot_label0 :
type a.
Cli.backend_lang ->
Global.backend_lang ->
decl_ctx ->
Env.t ->
Format.formatter ->
@ -997,7 +997,7 @@ let expr_to_dot_label0 :
unit =
fun lang ctx env ->
let xlang ~en ?(pl = en) ~fr () =
match lang with Cli.Fr -> fr | Cli.En -> en | Cli.Pl -> pl
match lang with Global.Fr -> fr | Global.En -> en | Global.Pl -> pl
in
let rec aux_value : type a t. Format.formatter -> (a, t) gexpr -> unit =
fun ppf e -> Print.UserFacing.value ~fallback lang ppf e
@ -1369,7 +1369,7 @@ let run includes optimize ex_scope explain_options global_options =
graph_cleanup explain_options g base_vars
else g
in
let lang = Cli.file_lang (Cli.input_src_file global_options.Cli.input_src) in
let lang = Cli.file_lang (Cli.input_src_file global_options.Global.input_src) in
let dot_content =
to_dot lang Format.str_formatter prg.decl_ctx env base_vars g
~base_src_url:explain_options.base_src_url;
@ -1386,7 +1386,7 @@ let run includes optimize ex_scope explain_options global_options =
fun f ->
f
(Option.value ~default:"-"
(Option.map Cli.globals.path_rewrite output))
(Option.map Global.options.path_rewrite output))
in
with_dot_file
@@ fun dotfile ->

View File

@ -112,7 +112,7 @@ let rec lazy_eval :
renv := env;
e
in
( Interpreter.evaluate_operator eval op m Cli.En
( Interpreter.evaluate_operator eval op m Global.En
(* Default language to English but this should not raise any error
messages so we don't care. *)
args,

View File

@ -319,11 +319,11 @@ let rec format_expression ctx (fmt : Format.formatter) (e : expr) : unit =
(op, Pos.no_pos) (format_expression ctx) arg2
| EApp
{ f = EAppOp { op = Log (BeginCall, info); args = [f] }, _; args = [arg] }
when Cli.globals.trace ->
when Global.options.trace ->
Format.fprintf fmt "log_begin_call(%a,@ %a,@ %a)" format_uid_list info
(format_expression ctx) f (format_expression ctx) arg
| EAppOp { op = Log (VarDef var_def_info, info); args = [arg1] }
when Cli.globals.trace ->
when Global.options.trace ->
Format.fprintf fmt
"log_variable_definition(%a,@ LogIO(input_io=InputIO.%s,@ \
output_io=%s),@ %a)"
@ -335,7 +335,7 @@ let rec format_expression ctx (fmt : Format.formatter) (e : expr) : unit =
(if var_def_info.log_io_output then "True" else "False")
(format_expression ctx) arg1
| EAppOp { op = Log (PosRecordIfTrueBool, _); args = [arg1] }
when Cli.globals.trace ->
when Global.options.trace ->
let pos = Mark.get e in
Format.fprintf fmt
"log_decision_taken(SourcePosition(filename=\"%s\",@ start_line=%d,@ \
@ -343,7 +343,7 @@ let rec format_expression ctx (fmt : Format.formatter) (e : expr) : unit =
(Pos.get_file pos) (Pos.get_start_line pos) (Pos.get_start_column pos)
(Pos.get_end_line pos) (Pos.get_end_column pos) format_string_list
(Pos.get_law_info pos) (format_expression ctx) arg1
| EAppOp { op = Log (EndCall, info); args = [arg1] } when Cli.globals.trace ->
| EAppOp { op = Log (EndCall, info); args = [arg1] } when Global.options.trace ->
Format.fprintf fmt "log_end_call(%a,@ %a)" format_uid_list info
(format_expression ctx) arg1
| EAppOp { op = Log _; args = [arg1] } ->

View File

@ -62,7 +62,7 @@ type 'm program = {
program_modules : nil scope_decl Mark.pos ScopeName.Map.t ModuleName.Map.t;
program_scopes : 'm scope_decl Mark.pos ScopeName.Map.t;
program_topdefs : ('m expr * typ) TopdefName.Map.t;
program_lang : Cli.backend_lang;
program_lang : Global.backend_lang;
}
let type_rule decl_ctx env = function

View File

@ -58,7 +58,7 @@ type 'm program = {
the scope signatures needed to respect the call convention *)
program_scopes : 'm scope_decl Mark.pos ScopeName.Map.t;
program_topdefs : ('m expr * typ) TopdefName.Map.t;
program_lang : Cli.backend_lang;
program_lang : Global.backend_lang;
}
val type_program : 'm program -> typed program

View File

@ -37,7 +37,7 @@ let tag_with_log_entry
(e : untyped Ast.expr boxed)
(l : log_entry)
(markings : Uid.MarkedString.info list) : untyped Ast.expr boxed =
if Cli.globals.trace then
if Global.options.trace then
Expr.eappop
~op:(Log (l, markings))
~tys:[TAny, Expr.pos e]

View File

@ -699,6 +699,6 @@ type decl_ctx = {
type 'e program = {
decl_ctx : decl_ctx;
code_items : 'e code_item_list;
lang : Cli.backend_lang;
lang : Global.backend_lang;
module_name : ModuleName.t option;
}

View File

@ -35,13 +35,13 @@ let indent_str = ref ""
(** {1 Evaluation} *)
let print_log lang entry infos pos e =
if Cli.globals.trace then
if Global.options.trace then
match entry with
| VarDef _ ->
Message.emit_log "%s%a %a: @{<green>%s@}" !indent_str Print.log_entry
entry Print.uid_list infos
(Message.unformat (fun ppf ->
(if Cli.globals.debug then Print.expr ~debug:true ()
(if Global.options.debug then Print.expr ~debug:true ()
else Print.UserFacing.expr lang)
ppf e))
| PosRecordIfTrueBool -> (
@ -609,7 +609,7 @@ and val_to_runtime :
let rec evaluate_expr :
type d e.
decl_ctx ->
Cli.backend_lang ->
Global.backend_lang ->
((d, e, yes) interpr_kind, 't) gexpr ->
((d, e, yes) interpr_kind, 't) gexpr =
fun ctx lang e ->
@ -817,7 +817,7 @@ let rec evaluate_expr :
and partially_evaluate_expr_for_assertion_failure_message :
type d e.
decl_ctx ->
Cli.backend_lang ->
Global.backend_lang ->
((d, e, yes) interpr_kind, 't) gexpr ->
((d, e, yes) interpr_kind, 't) gexpr =
fun ctx lang e ->

View File

@ -26,7 +26,7 @@ val evaluate_operator :
((((_, _, _) interpr_kind as 'a), 'm) gexpr -> ('a, 'm) gexpr) ->
'a operator ->
'm mark ->
Cli.backend_lang ->
Global.backend_lang ->
('a, 'm) gexpr list ->
('a, 'm) gexpr
(** Evaluates the result of applying the given operator to the given arguments,
@ -36,7 +36,7 @@ val evaluate_operator :
val evaluate_expr :
decl_ctx ->
Cli.backend_lang ->
Global.backend_lang ->
(('a, 'b, _) interpr_kind, 'm) gexpr ->
(('a, 'b, yes) interpr_kind, 'm) gexpr
(** Evaluates an expression according to the semantics of the default calculus. *)

View File

@ -184,7 +184,7 @@ let rec optimize_expr :
feed the expression to the interpreter that will print the beautiful
right error message *)
let (_ : _ gexpr) =
Interpreter.evaluate_expr ctx.decl_ctx Cli.En
Interpreter.evaluate_expr ctx.decl_ctx Global.En
(* Default language to English, no errors should be raised normally
so we don't care *)
e

View File

@ -180,7 +180,7 @@ let lit (fmt : Format.formatter) (l : lit) : unit =
| LUnit -> lit_style fmt "()"
| LRat i ->
lit_style fmt
(Runtime.decimal_to_string ~max_prec_digits:Cli.globals.max_prec_digits i)
(Runtime.decimal_to_string ~max_prec_digits:Global.options.max_prec_digits i)
| LMoney e ->
lit_style fmt (Format.asprintf "¤%s" (Runtime.money_to_string e))
| LDate d -> lit_style fmt (Runtime.date_to_string d)
@ -771,7 +771,7 @@ end
module ExprDebug = ExprGen (ExprDebugParam)
let expr ?(debug = Cli.globals.debug) () ppf e =
let expr ?(debug = Global.options.debug) () ppf e =
if debug then ExprDebug.expr ppf e else ExprConcise.expr ppf e
let scope_let_kind ?debug:(_debug = true) _ctx fmt k =
@ -958,15 +958,15 @@ module UserFacing = struct
(* Refs:
https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Dates_and_numbers#Grouping_of_digits
https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Conventions_concernant_les_nombres#Pour_un_comptage_ou_une_mesure *)
let bigsep (lang : Cli.backend_lang) =
let bigsep (lang : Global.backend_lang) =
match lang with En -> ",", 3 | Fr -> " ", 3 | Pl -> ",", 3
let decsep (lang : Cli.backend_lang) =
let decsep (lang : Global.backend_lang) =
match lang with En -> "." | Fr -> "," | Pl -> "."
let unit (_lang : Cli.backend_lang) ppf () = Format.pp_print_string ppf "()"
let unit (_lang : Global.backend_lang) ppf () = Format.pp_print_string ppf "()"
let bool (lang : Cli.backend_lang) ppf b =
let bool (lang : Global.backend_lang) ppf b =
let s =
match lang, b with
| En, true -> "true"
@ -978,7 +978,7 @@ module UserFacing = struct
in
Format.pp_print_string ppf s
let integer (lang : Cli.backend_lang) ppf n =
let integer (lang : Global.backend_lang) ppf n =
let sep, nsep = bigsep lang in
let nsep = Z.pow (Z.of_int 10) nsep in
if Z.sign n < 0 then Format.pp_print_char ppf '-';
@ -991,7 +991,7 @@ module UserFacing = struct
in
aux (Z.abs n)
let money (lang : Cli.backend_lang) ppf n =
let money (lang : Global.backend_lang) ppf n =
let num = Z.abs n in
let units, cents = Z.div_rem num (Z.of_int 100) in
if Z.sign n < 0 then Format.pp_print_char ppf '-';
@ -1004,7 +1004,7 @@ module UserFacing = struct
| Fr -> Format.pp_print_string ppf ""
| Pl -> Format.pp_print_string ppf " PLN"
let decimal (lang : Cli.backend_lang) ppf r =
let decimal (lang : Global.backend_lang) ppf r =
let den = Q.den r in
let num = Z.abs (Q.num r) in
let int_part, rem = Z.div_rem num den in
@ -1021,7 +1021,7 @@ module UserFacing = struct
| None ->
if Z.equal n Z.zero then None, false
else
let r = Cli.globals.max_prec_digits in
let r = Global.options.max_prec_digits in
Some (r - 1), r <= 1
| Some r -> Some (r - 1), r <= 1
in
@ -1037,19 +1037,19 @@ module UserFacing = struct
in
aux 0
(if Z.equal int_part Z.zero then None
else Some (Cli.globals.max_prec_digits - ndigits int_part))
else Some (Global.options.max_prec_digits - ndigits int_part))
rem
(* It would be nice to print ratios as % but that's impossible to guess.
Trying would lead to inconsistencies where some comparable numbers are in %
and some others not, adding confusion. *)
let date (lang : Cli.backend_lang) ppf d =
let date (lang : Global.backend_lang) ppf d =
let y, m, d = Dates_calc.Dates.date_to_ymd d in
match lang with
| En | Pl -> Format.fprintf ppf "%04d-%02d-%02d" y m d
| Fr -> Format.fprintf ppf "%02d/%02d/%04d" d m y
let duration (lang : Cli.backend_lang) ppf dr =
let duration (lang : Global.backend_lang) ppf dr =
let y, m, d = Dates_calc.Dates.period_to_ymds dr in
let rec filter0 = function
| (0, _) :: (_ :: _ as r) -> filter0 r
@ -1069,7 +1069,7 @@ module UserFacing = struct
ppf;
Format.pp_print_char ppf ']'
let lit_raw (lang : Cli.backend_lang) ppf lit : unit =
let lit_raw (lang : Global.backend_lang) ppf lit : unit =
match lit with
| LUnit -> unit lang ppf ()
| LBool b -> bool lang ppf b
@ -1079,20 +1079,20 @@ module UserFacing = struct
| LDate d -> date lang ppf d
| LDuration dr -> duration lang ppf dr
let lit_to_string (lang : Cli.backend_lang) lit =
let lit_to_string (lang : Global.backend_lang) lit =
let buf = Buffer.create 32 in
let ppf = Format.formatter_of_buffer buf in
lit_raw lang ppf lit;
Format.pp_print_flush ppf ();
Buffer.contents buf
let lit (lang : Cli.backend_lang) ppf lit : unit =
let lit (lang : Global.backend_lang) ppf lit : unit =
with_color (lit_raw lang) Ocolor_types.yellow ppf lit
let rec value :
type a.
?fallback:(Format.formatter -> (a, 't) gexpr -> unit) ->
Cli.backend_lang ->
Global.backend_lang ->
Format.formatter ->
(a, 't) gexpr ->
unit =
@ -1132,7 +1132,7 @@ module UserFacing = struct
fallback ppf e
let expr :
type a. Cli.backend_lang -> Format.formatter -> (a, 't) gexpr -> unit =
type a. Global.backend_lang -> Format.formatter -> (a, 't) gexpr -> unit =
fun lang ->
let rec aux_value : type a t. Format.formatter -> (a, t) gexpr -> unit =
fun ppf e -> value ~fallback lang ppf e

View File

@ -96,22 +96,22 @@ val program : ?debug:bool -> Format.formatter -> ('a, 'm) gexpr program -> unit
(** User-facing, localised printer *)
module UserFacing : sig
val unit : Cli.backend_lang -> Format.formatter -> Runtime.unit -> unit
val bool : Cli.backend_lang -> Format.formatter -> Runtime.bool -> unit
val integer : Cli.backend_lang -> Format.formatter -> Runtime.integer -> unit
val decimal : Cli.backend_lang -> Format.formatter -> Runtime.decimal -> unit
val money : Cli.backend_lang -> Format.formatter -> Runtime.money -> unit
val date : Cli.backend_lang -> Format.formatter -> Runtime.date -> unit
val unit : Global.backend_lang -> Format.formatter -> Runtime.unit -> unit
val bool : Global.backend_lang -> Format.formatter -> Runtime.bool -> unit
val integer : Global.backend_lang -> Format.formatter -> Runtime.integer -> unit
val decimal : Global.backend_lang -> Format.formatter -> Runtime.decimal -> unit
val money : Global.backend_lang -> Format.formatter -> Runtime.money -> unit
val date : Global.backend_lang -> Format.formatter -> Runtime.date -> unit
val duration :
Cli.backend_lang -> Format.formatter -> Runtime.duration -> unit
Global.backend_lang -> Format.formatter -> Runtime.duration -> unit
val lit : Cli.backend_lang -> Format.formatter -> lit -> unit
val lit_to_string : Cli.backend_lang -> lit -> string
val lit : Global.backend_lang -> Format.formatter -> lit -> unit
val lit_to_string : Global.backend_lang -> lit -> string
val value :
?fallback:(Format.formatter -> ('a, 't) gexpr -> unit) ->
Cli.backend_lang ->
Global.backend_lang ->
Format.formatter ->
('a, 't) gexpr ->
unit
@ -121,7 +121,7 @@ module UserFacing : sig
is called upon non-value expressions (by default, [Invalid_argument] is
raised) *)
val expr : Cli.backend_lang -> Format.formatter -> (_, _) gexpr -> unit
val expr : Global.backend_lang -> Format.formatter -> (_, _) gexpr -> unit
(** This combines the user-facing value printer and the generic expression
printer to handle all AST nodes *)
end

View File

@ -159,14 +159,14 @@ let rec format_typ
")" (format_typ ~colors) t2
| TArray t1 -> (
match Mark.remove (UnionFind.get (UnionFind.find t1)) with
| TAny _ when not Cli.globals.debug -> Format.pp_print_string fmt "list"
| TAny _ when not Global.options.debug -> Format.pp_print_string fmt "list"
| _ -> Format.fprintf fmt "@[list of@ %a@]" (format_typ ~colors) t1)
| TDefault t1 ->
Format.pp_print_as fmt 1 "";
format_typ ~colors fmt t1;
Format.pp_print_as fmt 1 ""
| TAny v ->
if Cli.globals.debug then Format.fprintf fmt "<a%d>" (Any.hash v)
if Global.options.debug then Format.fprintf fmt "<a%d>" (Any.hash v)
else Format.pp_print_string fmt "<any>"
| TClosureEnv -> Format.fprintf fmt "closure_env"
@ -234,7 +234,7 @@ let handle_type_error ctx (A.AnyExpr e) t1 t2 =
( (fun ppf ->
Format.fprintf ppf "@[<hv 2>@[<hov>%a@ %a@]:" Format.pp_print_text
"This expression has type" (format_typ ctx) t1;
if Cli.globals.debug then Format.fprintf ppf "@ %a@]" Expr.format e
if Global.options.debug then Format.fprintf ppf "@ %a@]" Expr.format e
else Format.pp_close_box ppf ()),
e_pos );
( (fun ppf ->
@ -248,7 +248,7 @@ let handle_type_error ctx (A.AnyExpr e) t1 t2 =
( (fun ppf ->
Format.fprintf ppf "@[<hv 2>@[<hov>%a:@]" Format.pp_print_text
"While typechecking the following expression";
if Cli.globals.debug then Format.fprintf ppf "@ %a@]" Expr.format e
if Global.options.debug then Format.fprintf ppf "@ %a@]" Expr.format e
else Format.pp_close_box ppf ()),
e_pos );
( (fun ppf ->

View File

@ -333,7 +333,7 @@ and program = {
program_items : law_structure list;
program_source_files : (string[@opaque]) list;
program_used_modules : module_use list;
program_lang : Cli.backend_lang; [@opaque]
program_lang : Global.backend_lang; [@opaque]
}
and source_file = law_structure list

View File

@ -198,14 +198,14 @@ module Parser_En = ParserAux (Lexer_en)
module Parser_Fr = ParserAux (Lexer_fr)
module Parser_Pl = ParserAux (Lexer_pl)
let localised_parser : Cli.backend_lang -> lexbuf -> Ast.source_file = function
let localised_parser : Global.backend_lang -> lexbuf -> Ast.source_file = function
| En -> Parser_En.commands_or_includes
| Fr -> Parser_Fr.commands_or_includes
| Pl -> Parser_Pl.commands_or_includes
(** Lightweight lexer for dependency *)
let lines (file : File.t) (language : Cli.backend_lang) =
let lines (file : File.t) (language : Global.backend_lang) =
let lex_line =
match language with
| En -> Lexer_en.lex_line
@ -387,12 +387,12 @@ let get_interface program =
let with_sedlex_source source_file f =
match source_file with
| Cli.FileName file -> with_sedlex_file file f
| Cli.Contents (str, file) ->
| Global.FileName file -> with_sedlex_file file f
| Global.Contents (str, file) ->
let lexbuf = Sedlexing.Utf8.from_string str in
Sedlexing.set_filename lexbuf file;
f lexbuf
| Cli.Stdin file ->
| Global.Stdin file ->
let lexbuf = Sedlexing.Utf8.from_channel stdin in
Sedlexing.set_filename lexbuf file;
f lexbuf
@ -400,7 +400,7 @@ let with_sedlex_source source_file f =
let check_modname program source_file =
match program.Ast.program_module_name, source_file with
| ( Some (mname, pos),
(Cli.FileName file | Cli.Contents (_, file) | Cli.Stdin file) )
(Global.FileName file | Global.Contents (_, file) | Global.Stdin file) )
when not File.(equal mname Filename.(remove_extension (basename file))) ->
Message.raise_spanned_error pos
"@[<hov>Module declared as@ @{<blue>%s@},@ which@ does@ not@ match@ the@ \
@ -437,7 +437,7 @@ let load_interface ?default_module_name source_file =
Ast.intf_submodules = used_modules;
}
let parse_top_level_file (source_file : Cli.input_src) : Ast.program =
let parse_top_level_file (source_file : File.t Global.input_src) : Ast.program =
let program = with_sedlex_source source_file parse_source in
check_modname program source_file;
{

View File

@ -20,17 +20,17 @@
open Catala_utils
val lines :
File.t -> Cli.backend_lang -> (string * Lexer_common.line_token) Seq.t
File.t -> Global.backend_lang -> (string * Lexer_common.line_token) Seq.t
(** Raw file parser that doesn't interpret any includes and returns the flat law
structure as is *)
val load_interface :
?default_module_name:string -> Cli.input_src -> Ast.interface
?default_module_name:string -> File.t Global.input_src -> Ast.interface
(** Reads only declarations in metadata in the supplied input file, and only
keeps type information. The list of submodules is initialised with names
only and empty contents. *)
val parse_top_level_file : Cli.input_src -> Ast.program
val parse_top_level_file : File.t Global.input_src -> Ast.program
(** Parses a catala file (handling file includes) and returns a program.
Interfaces of the used modules are returned empty, use [load_interface] to
fill them. *)

View File

@ -139,7 +139,7 @@ let rec print_z3model_expr (ctx : context) (ty : typ) (e : Expr.expr) : string =
Catala sources *)
| TUnit -> ""
| TInt -> Expr.to_string e
| TRat -> Arithmetic.Real.to_decimal_string e Cli.globals.max_prec_digits
| TRat -> Arithmetic.Real.to_decimal_string e Global.options.max_prec_digits
(* TODO: Print the right money symbol according to language *)
| TMoney ->
let z3_str = Expr.to_string e in

View File

@ -1,6 +1,6 @@
{
"name": "@catala-lang/rescript-catala",
"version": "0.8.1-b.0",
"version": "0.9.0",
"description": "ReScript wrapper for the Catala runtime",
"scripts": {
"clean": "rescript clean",