aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Blaauwbroek2020-04-10 19:02:07 +0200
committerThéo Zimmermann2020-05-12 14:13:51 +0200
commitbd78f3282f76c31a7579dc667732821a9aac889c (patch)
tree5c704a4defe538849e0ebd44dced9d20b96e5c09
parent007ed9e21f69a157ffff3fa5f990f62ab2756416 (diff)
Interleave commandline require/set/unset commands
-rw-r--r--stm/stm.ml66
-rw-r--r--stm/stm.mli23
-rw-r--r--toplevel/ccompile.ml43
-rw-r--r--toplevel/ccompile.mli2
-rw-r--r--toplevel/coqargs.ml36
-rw-r--r--toplevel/coqargs.mli9
-rw-r--r--toplevel/coqtop.ml5
7 files changed, 97 insertions, 87 deletions
diff --git a/stm/stm.ml b/stm/stm.ml
index 5790bfc07e..b296f8f08f 100644
--- a/stm/stm.ml
+++ b/stm/stm.ml
@@ -2576,6 +2576,21 @@ end (* }}} *)
(******************************************************************************)
(** STM initialization options: *)
+
+type option_command = OptionSet of string option | OptionUnset
+
+type injection_command =
+ | OptionInjection of (Goptions.option_name * option_command)
+ (** Set flags or options before the initial state is ready. *)
+ | RequireInjection of (string * string option * bool option)
+ (** Require libraries before the initial state is
+ ready. Parameters follow [Library], that is to say,
+ [lib,prefix,import_export] means require library [lib] from
+ optional [prefix] and [import_export] if [Some false/Some true]
+ is used. *)
+ (* -load-vernac-source interleaving is not supported yet *)
+ (* | LoadInjection of (string * bool) *)
+
type stm_init_options =
{ doc_type : stm_doc_type
(** The STM does set some internal flags differently depending on
@@ -2589,12 +2604,9 @@ type stm_init_options =
(** [vo] load paths for the document. Usually extracted from -R
options / _CoqProject *)
- ; require_libs : (string * string option * bool option) list
- (** Require [require_libs] before the initial state is
- ready. Parameters follow [Library], that is to say,
- [lib,prefix,import_export] means require library [lib] from
- optional [prefix] and [import_export] if [Some false/Some true]
- is used. *)
+ ; injections : injection_command list
+ (** Injects Require and Set/Unset commands before the initial
+ state is ready *)
; stm_options : AsyncOpts.stm_opt
(** Low-level STM options *)
@@ -2625,13 +2637,51 @@ let dirpath_of_file f =
let ldir = Libnames.add_dirpath_suffix ldir0 id in
ldir
-let new_doc { doc_type ; ml_load_path; vo_load_path; require_libs; stm_options } =
+let new_doc { doc_type ; ml_load_path; vo_load_path; injections; stm_options } =
let require_file (dir, from, exp) =
let mp = Libnames.qualid_of_string dir in
let mfrom = Option.map Libnames.qualid_of_string from in
Flags.silently (Vernacentries.vernac_require mfrom exp) [mp] in
+ let interp_set_option opt v old =
+ let open Goptions in
+ let err expect =
+ let opt = String.concat " " opt in
+ let got = v in (* avoid colliding with Pp.v *)
+ CErrors.user_err
+ Pp.(str "-set: " ++ str opt ++
+ str" expects " ++ str expect ++
+ str" but got " ++ str got)
+ in
+ match old with
+ | BoolValue _ ->
+ let v = match String.trim v with
+ | "true" -> true
+ | "false" | "" -> false
+ | _ -> err "a boolean"
+ in
+ BoolValue v
+ | IntValue _ ->
+ let v = String.trim v in
+ let v = match int_of_string_opt v with
+ | Some _ as v -> v
+ | None -> if v = "" then None else err "an int"
+ in
+ IntValue v
+ | StringValue _ -> StringValue v
+ | StringOptValue _ -> StringOptValue (Some v) in
+
+ let set_option = let open Goptions in function
+ | opt, OptionUnset -> unset_option_value_gen ~locality:OptLocal opt
+ | opt, OptionSet None -> set_bool_option_value_gen ~locality:OptLocal opt true
+ | opt, OptionSet (Some v) -> set_option_value ~locality:OptLocal (interp_set_option opt) opt v in
+
+ let handle_injection = function
+ | RequireInjection r -> require_file r
+ (* | LoadInjection l -> *)
+ | OptionInjection o -> set_option o in
+
(* Set the options from the new documents *)
AsyncOpts.cur_opt := stm_options;
@@ -2670,7 +2720,7 @@ let new_doc { doc_type ; ml_load_path; vo_load_path; require_libs; stm_options }
end;
(* Import initial libraries. *)
- List.iter require_file require_libs;
+ List.iter handle_injection injections;
(* We record the state at this point! *)
State.define ~doc ~cache:true ~redefine:true (fun () -> ()) Stateid.initial;
diff --git a/stm/stm.mli b/stm/stm.mli
index 2c27d63b82..9780c96512 100644
--- a/stm/stm.mli
+++ b/stm/stm.mli
@@ -52,6 +52,20 @@ type stm_doc_type =
| VioDoc of string (* file path *)
| Interactive of interactive_top (* module path *)
+type option_command = OptionSet of string option | OptionUnset
+
+type injection_command =
+ | OptionInjection of (Goptions.option_name * option_command)
+ (** Set flags or options before the initial state is ready. *)
+ | RequireInjection of (string * string option * bool option)
+ (** Require libraries before the initial state is
+ ready. Parameters follow [Library], that is to say,
+ [lib,prefix,import_export] means require library [lib] from
+ optional [prefix] and [import_export] if [Some false/Some true]
+ is used. *)
+ (* -load-vernac-source interleaving is not supported yet *)
+ (* | LoadInjection of (string * bool) *)
+
(** STM initialization options: *)
type stm_init_options =
{ doc_type : stm_doc_type
@@ -66,12 +80,9 @@ type stm_init_options =
(** [vo] load paths for the document. Usually extracted from -R
options / _CoqProject *)
- ; require_libs : (string * string option * bool option) list
- (** Require [require_libs] before the initial state is
- ready. Parameters follow [Library], that is to say,
- [lib,prefix,import_export] means require library [lib] from
- optional [prefix] and [import_export] if [Some false/Some true]
- is used. *)
+ ; injections : injection_command list
+ (** Injects Require and Set/Unset commands before the initial
+ state is ready *)
; stm_options : AsyncOpts.stm_opt
(** Low-level STM options *)
diff --git a/toplevel/ccompile.ml b/toplevel/ccompile.ml
index c8b8660b92..524f818523 100644
--- a/toplevel/ccompile.ml
+++ b/toplevel/ccompile.ml
@@ -92,41 +92,6 @@ let create_empty_file filename =
let f = open_out filename in
close_out f
-let interp_set_option opt v old =
- let open Goptions in
- let err expect =
- let opt = String.concat " " opt in
- let got = v in (* avoid colliding with Pp.v *)
- CErrors.user_err
- Pp.(str "-set: " ++ str opt ++
- str" expects " ++ str expect ++
- str" but got " ++ str got)
- in
- match old with
- | BoolValue _ ->
- let v = match String.trim v with
- | "true" -> true
- | "false" | "" -> false
- | _ -> err "a boolean"
- in
- BoolValue v
- | IntValue _ ->
- let v = String.trim v in
- let v = match int_of_string_opt v with
- | Some _ as v -> v
- | None -> if v = "" then None else err "an int"
- in
- IntValue v
- | StringValue _ -> StringValue v
- | StringOptValue _ -> StringOptValue (Some v)
-
-let set_option = let open Goptions in function
- | opt, OptionUnset -> unset_option_value_gen ~locality:OptLocal opt
- | opt, OptionSet None -> set_bool_option_value_gen ~locality:OptLocal opt true
- | opt, OptionSet (Some v) -> set_option_value ~locality:OptLocal (interp_set_option opt) opt v
-
-let set_options = List.iter set_option
-
(* Compile a vernac file *)
let compile opts copts ~echo ~f_in ~f_out =
let open Vernac.State in
@@ -140,7 +105,7 @@ let compile opts copts ~echo ~f_in ~f_out =
++ str ".")
in
let ml_load_path, vo_load_path = build_load_path opts in
- let require_libs = require_libs opts in
+ let injections = injection_commands opts in
let stm_options = opts.config.stm_flags in
let output_native_objects = match opts.config.native_compiler with
| NativeOff -> false | NativeOn {ondemand} -> not ondemand
@@ -165,11 +130,10 @@ let compile opts copts ~echo ~f_in ~f_out =
let doc, sid = Topfmt.(in_phase ~phase:LoadingPrelude)
Stm.new_doc
Stm.{ doc_type = VoDoc long_f_dot_out; ml_load_path;
- vo_load_path; require_libs; stm_options;
+ vo_load_path; injections; stm_options;
} in
let state = { doc; sid; proof = None; time = opts.config.time } in
let state = load_init_vernaculars opts ~state in
- set_options opts.config.set_options;
let ldir = Stm.get_ldir ~doc:state.doc in
Aux_file.(start_aux_file
~aux_file:(aux_file_name_for long_f_dot_out)
@@ -218,12 +182,11 @@ let compile opts copts ~echo ~f_in ~f_out =
let doc, sid = Topfmt.(in_phase ~phase:LoadingPrelude)
Stm.new_doc
Stm.{ doc_type = VioDoc long_f_dot_out; ml_load_path;
- vo_load_path; require_libs; stm_options;
+ vo_load_path; injections; stm_options;
} in
let state = { doc; sid; proof = None; time = opts.config.time } in
let state = load_init_vernaculars opts ~state in
- set_options opts.config.set_options;
let ldir = Stm.get_ldir ~doc:state.doc in
let state = Vernac.load_vernac ~echo ~check:false ~interactive:false ~state long_f_dot_in in
let doc = Stm.finish ~doc:state.doc in
diff --git a/toplevel/ccompile.mli b/toplevel/ccompile.mli
index eb66dbaafc..8c154488d0 100644
--- a/toplevel/ccompile.mli
+++ b/toplevel/ccompile.mli
@@ -17,5 +17,3 @@ val compile_files : Coqargs.t -> Coqcargs.t -> unit
(** [do_vio opts] process [.vio] files in [opts] *)
val do_vio : Coqargs.t -> Coqcargs.t -> unit
-
-val set_options : (Goptions.option_name * Coqargs.option_command) list -> unit
diff --git a/toplevel/coqargs.ml b/toplevel/coqargs.ml
index 17435c051e..c7ad5edb1f 100644
--- a/toplevel/coqargs.ml
+++ b/toplevel/coqargs.ml
@@ -38,8 +38,6 @@ type color = [`ON | `AUTO | `EMACS | `OFF]
type native_compiler = NativeOff | NativeOn of { ondemand : bool }
-type option_command = OptionSet of string option | OptionUnset
-
type coqargs_logic_config = {
impredicative_set : Declarations.set_predicativity;
indices_matter : bool;
@@ -59,7 +57,6 @@ type coqargs_config = {
debug : bool;
time : bool;
print_emacs : bool;
- set_options : (Goptions.option_name * option_command) list;
}
type coqargs_pre = {
@@ -69,10 +66,9 @@ type coqargs_pre = {
ml_includes : string list;
vo_includes : Loadpath.vo_path list;
- vo_requires : (string * string option * bool option) list;
- (* None = No Import; Some false = Import; Some true = Export *)
load_vernacular_list : (string * bool) list;
+ injections : Stm.injection_command list;
inputstate : string option;
}
@@ -124,7 +120,6 @@ let default_config = {
debug = false;
time = false;
print_emacs = false;
- set_options = [];
(* Quiet / verbosity options should be here *)
}
@@ -135,8 +130,8 @@ let default_pre = {
load_rcfile = true;
ml_includes = [];
vo_includes = [];
- vo_requires = [];
load_vernacular_list = [];
+ injections = [];
inputstate = None;
}
@@ -167,13 +162,13 @@ let add_vo_include opts unix_path coq_path implicit =
unix_path; coq_path; has_ml = false; implicit; recursive = true } :: opts.pre.vo_includes }}
let add_vo_require opts d p export =
- { opts with pre = { opts.pre with vo_requires = (d, p, export) :: opts.pre.vo_requires }}
+ { opts with pre = { opts.pre with injections = Stm.RequireInjection (d, p, export) :: opts.pre.injections }}
let add_load_vernacular opts verb s =
- { opts with pre = { opts.pre with load_vernacular_list = (CUnix.make_suffix s ".v",verb) :: opts.pre.load_vernacular_list }}
+ { opts with pre = { opts.pre with load_vernacular_list = (CUnix.make_suffix s ".v",verb) :: opts.pre.load_vernacular_list }}
let add_set_option opts opt_name value =
- { opts with config = { opts.config with set_options = (opt_name, value) :: opts.config.set_options }}
+ { opts with pre = { opts.pre with injections = Stm.OptionInjection (opt_name, value) :: opts.pre.injections }}
(** Options for proof general *)
let set_emacs opts =
@@ -486,10 +481,10 @@ let parse_args ~help ~init arglist : t * string list =
| "-set" ->
let opt, v = parse_option_set @@ next() in
- add_set_option oval opt (OptionSet v)
+ add_set_option oval opt (Stm.OptionSet v)
| "-unset" ->
- add_set_option oval (to_opt_key @@ next ()) OptionUnset
+ add_set_option oval (to_opt_key @@ next ()) Stm.OptionUnset
|"-native-output-dir" ->
let native_output_dir = next () in
@@ -513,18 +508,18 @@ let parse_args ~help ~init arglist : t * string list =
|"-config"|"--config" -> set_query oval PrintConfig
|"-debug" -> Coqinit.set_debug (); oval
|"-diffs" ->
- add_set_option oval Proof_diffs.opt_name @@ OptionSet (Some (next ()))
+ add_set_option oval Proof_diffs.opt_name @@ Stm.OptionSet (Some (next ()))
|"-stm-debug" -> Stm.stm_debug := true; oval
|"-emacs" -> set_emacs oval
|"-impredicative-set" ->
set_logic (fun o -> { o with impredicative_set = Declarations.ImpredicativeSet }) oval
|"-allow-sprop" ->
- add_set_option oval Vernacentries.allow_sprop_opt_name (OptionSet None)
+ add_set_option oval Vernacentries.allow_sprop_opt_name (Stm.OptionSet None)
|"-disallow-sprop" ->
- add_set_option oval Vernacentries.allow_sprop_opt_name OptionUnset
+ add_set_option oval Vernacentries.allow_sprop_opt_name Stm.OptionUnset
|"-sprop-cumulative" ->
warn_deprecated_sprop_cumul();
- add_set_option oval Vernacentries.cumul_sprop_opt_name (OptionSet None)
+ add_set_option oval Vernacentries.cumul_sprop_opt_name (Stm.OptionSet None)
|"-indices-matter" -> set_logic (fun o -> { o with indices_matter = true }) oval
|"-m"|"--memory" -> { oval with post = { oval.post with memory_stat = true }}
|"-noinit"|"-nois" -> { oval with pre = { oval.pre with load_init = false }}
@@ -564,12 +559,9 @@ let parse_args ~help ~init args =
pre = { opts.pre with
ml_includes = List.rev opts.pre.ml_includes
; vo_includes = List.rev opts.pre.vo_includes
- ; vo_requires = List.rev opts.pre.vo_requires
; load_vernacular_list = List.rev opts.pre.load_vernacular_list
+ ; injections = List.rev opts.pre.injections
}
- ; config = { opts.config with
- set_options = List.rev opts.config.set_options
- } ;
} in
opts, extra
@@ -579,8 +571,8 @@ let parse_args ~help ~init args =
(* prelude_data == From Coq Require Import Prelude. *)
let prelude_data = "Prelude", Some "Coq", Some false
-let require_libs opts =
- if opts.pre.load_init then prelude_data :: opts.pre.vo_requires else opts.pre.vo_requires
+let injection_commands opts =
+ if opts.pre.load_init then Stm.RequireInjection prelude_data :: opts.pre.injections else opts.pre.injections
let build_load_path opts =
let ml_path, vo_path =
diff --git a/toplevel/coqargs.mli b/toplevel/coqargs.mli
index a51ed6766a..c8634b7847 100644
--- a/toplevel/coqargs.mli
+++ b/toplevel/coqargs.mli
@@ -14,8 +14,6 @@ val default_toplevel : Names.DirPath.t
type native_compiler = NativeOff | NativeOn of { ondemand : bool }
-type option_command = OptionSet of string option | OptionUnset
-
type coqargs_logic_config = {
impredicative_set : Declarations.set_predicativity;
indices_matter : bool;
@@ -35,7 +33,6 @@ type coqargs_config = {
debug : bool;
time : bool;
print_emacs : bool;
- set_options : (Goptions.option_name * option_command) list;
}
type coqargs_pre = {
@@ -45,10 +42,10 @@ type coqargs_pre = {
ml_includes : CUnix.physical_path list;
vo_includes : Loadpath.vo_path list;
- vo_requires : (string * string option * bool option) list;
- (* None = No Import; Some false = Import; Some true = Export *)
load_vernacular_list : (string * bool) list;
+ injections : Stm.injection_command list;
+
inputstate : string option;
}
@@ -79,5 +76,5 @@ val default : t
val parse_args : help:Usage.specific_usage -> init:t -> string list -> t * string list
val error_wrong_arg : string -> unit
-val require_libs : t -> (string * string option * bool option) list
+val injection_commands : t -> Stm.injection_command list
val build_load_path : t -> CUnix.physical_path list * Loadpath.vo_path list
diff --git a/toplevel/coqtop.ml b/toplevel/coqtop.ml
index 7aad856d0a..2d450d430a 100644
--- a/toplevel/coqtop.ml
+++ b/toplevel/coqtop.ml
@@ -243,13 +243,13 @@ let init_document opts =
(* Next line allows loading .vos files when in interactive mode *)
Flags.load_vos_libraries := true;
let ml_load_path, vo_load_path = build_load_path opts in
- let require_libs = require_libs opts in
+ let injections = injection_commands opts in
let stm_options = opts.config.stm_flags in
let open Vernac.State in
let doc, sid =
Stm.(new_doc
{ doc_type = Interactive opts.config.logic.toplevel_name;
- ml_load_path; vo_load_path; require_libs; stm_options;
+ ml_load_path; vo_load_path; injections; stm_options;
}) in
{ doc; sid; proof = None; time = opts.config.time }
@@ -273,7 +273,6 @@ type run_mode = Interactive | Batch
let init_toploop opts =
let state = init_document opts in
let state = Ccompile.load_init_vernaculars opts ~state in
- Ccompile.set_options opts.config.set_options;
state
let coqtop_init run_mode ~opts =