Skip to content

Commit ea30f77

Browse files
Merge pull request #418 from Leonidas-from-XIV/parse-env-once
Parse env only once
2 parents b7bcb6e + ad90c35 commit ea30f77

File tree

11 files changed

+73
-32
lines changed

11 files changed

+73
-32
lines changed

bin/cli.ml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,20 +68,23 @@ let verbose_findlib =
6868

6969
let prelude =
7070
let parse s =
71-
let _, file = Mdx.Prelude.env_and_file s in
72-
let parse, _ = Arg.non_dir_file in
73-
match parse file with `Ok _ -> `Ok s | `Error e -> `Error e
71+
let env, filename = Mdx.Prelude.env_and_payload s in
72+
let parse, _pp = Arg.non_dir_file in
73+
match parse filename with
74+
| `Ok _ -> `Ok (env, filename)
75+
| `Error _ as e -> e
7476
in
75-
let prelude = (parse, Fmt.string) in
77+
let prelude = (parse, Mdx.Prelude.pp) in
7678
let doc =
7779
"A file to load as prelude. Can be prefixed with $(i,env:) to specify a \
7880
specific environment to load the prelude in. Multiple prelude files can \
79-
be provided:they will be evaluated in the order they are provided on the \
81+
be provided: they will be evaluated in the order they are provided on the \
8082
command-line."
8183
in
8284
named
8385
(fun x -> `Prelude x)
84-
Arg.(value & opt_all prelude [] & info [ "prelude" ] ~doc ~docv:"FILE")
86+
Arg.(
87+
value & opt_all prelude [] & info [ "prelude" ] ~doc ~docv:"[ENV:]FILE")
8588

8689
let prelude_str =
8790
let doc =
@@ -90,9 +93,12 @@ let prelude_str =
9093
not contain any spaces. Multiple prelude strings can be provided: they \
9194
will be evaluated in the order they are provided on the command-line."
9295
in
96+
let parse s = `Ok (Mdx.Prelude.env_and_payload s) in
97+
let prelude = (parse, Mdx.Prelude.pp) in
9398
named
9499
(fun x -> `Prelude_str x)
95-
Arg.(value & opt_all string [] & info [ "prelude-str" ] ~doc ~docv:"STR")
100+
Arg.(
101+
value & opt_all prelude [] & info [ "prelude-str" ] ~doc ~docv:"[ENV:]STR")
96102

97103
let directories =
98104
let doc = "A list of directories to load for the #directory directive." in

bin/cli.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ val silent_eval : [> `Silent_eval of bool ] t
99
val record_backtrace : [> `Record_backtrace of bool ] t
1010
val silent : [> `Silent of bool ] t
1111
val verbose_findlib : [> `Verbose_findlib of bool ] t
12-
val prelude : [> `Prelude of string list ] t
13-
val prelude_str : [> `Prelude_str of string list ] t
12+
val prelude : [> `Prelude of Mdx.Prelude.t list ] t
13+
val prelude_str : [> `Prelude_str of Mdx.Prelude.t list ] t
1414
val directories : [> `Directories of string list ] t
1515
val root : [> `Root of string option ] t
1616
val force_output : [> `Force_output of bool ] t

bin/dune_gen.ml

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,31 @@
1616

1717
let run (`Setup ()) (`Prelude prelude) (`Directories dirs) =
1818
let buffer = Buffer.create 1024 in
19-
let line fmt = Printf.bprintf buffer (fmt ^^ "\n") in
20-
let list l =
21-
Printf.sprintf "[%s]\n"
22-
(String.concat ";" (List.map (Printf.sprintf "%S") l))
19+
let ppf = Format.formatter_of_buffer buffer in
20+
let line fmt = Fmt.kpf (fun ppf -> Fmt.string ppf "\n") ppf fmt in
21+
let pp_list ppf =
22+
Fmt.pf ppf "[%a]\n" (Fmt.list ~sep:(Fmt.any "; ") Fmt.Dump.string)
2323
in
24+
25+
let pp_ocaml_env ppf = function
26+
| Mdx.Ocaml_env.Default -> Fmt.string ppf "Mdx.Ocaml_env.Default"
27+
| Mdx.Ocaml_env.User_defined s ->
28+
Fmt.pf ppf "(Mdx.Ocaml_env.User_defined %S)" s
29+
in
30+
31+
let pp_env ppf = function
32+
| `All -> Fmt.string ppf "`All"
33+
| `One ocaml_env -> Fmt.pf ppf "(`One %a)" pp_ocaml_env ocaml_env
34+
in
35+
36+
let pp_prelude ppf (env, filename) =
37+
Fmt.pf ppf "(%a, %S)" pp_env env filename
38+
in
39+
40+
let pp_preludes ppf preludes =
41+
Fmt.pf ppf "[%a]\n" (Fmt.list ~sep:(Fmt.any "; ") pp_prelude) preludes
42+
in
43+
2444
line "let run_exn_defaults =";
2545
line " let open Mdx_test in";
2646
line " let packages =";
@@ -46,13 +66,14 @@ let run (`Setup ()) (`Prelude prelude) (`Directories dirs) =
4666
line " ~output:(Some `Stdout)";
4767

4868
line "let file = Sys.argv.(1)";
49-
line "let prelude = %s" (list prelude);
69+
line "let prelude = %a" pp_preludes prelude;
5070
line "let directives = List.map (fun path ->";
51-
line " Mdx_top.Directory path) %s" (list dirs);
71+
line " Mdx_top.Directory path) %a" pp_list dirs;
5272
line "let _ = run_exn_defaults";
5373
line " ~file";
5474
line " ~prelude";
5575
line " ~directives";
76+
Fmt.flush ppf ();
5677
Buffer.output_buffer stdout buffer;
5778
0
5879

lib/ocaml_env.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ type t = Default | User_defined of string
33
let mk = function None | Some "" -> Default | Some s -> User_defined s
44
let name = function Default -> "" | User_defined s -> s
55

6+
let pp ppf = function
7+
| Default -> Fmt.string ppf "Default"
8+
| User_defined s -> Fmt.pf ppf "User_defined %S" s
9+
610
type env = t
711

812
module Set = Set.Make (struct

lib/ocaml_env.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
type t = Default | User_defined of string
44

5+
val pp : t Fmt.t
56
val name : t -> string
67
val mk : string option -> t
78

lib/prelude.ml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@
1414
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1515
*)
1616

17-
let env_and_file f =
17+
type t = [ `All | `One of Ocaml_env.t ] * string
18+
19+
let pp ppf = function
20+
| `All, filename -> Fmt.pf ppf "(`All, %S)" filename
21+
| `One ocaml_env, filename ->
22+
Fmt.pf ppf "(`One %a, %S)" Ocaml_env.pp ocaml_env filename
23+
24+
let env_and_payload f =
1825
match Astring.String.cut ~sep:":" f with
1926
| None -> (`All, f)
2027
| Some (e, f) ->

lib/prelude.mli

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,13 @@
1414
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1515
*)
1616

17-
val env_and_file : string -> [ `All | `One of Ocaml_env.t ] * string
18-
(** [env_and_file s] returns the environment and file/prelude string described
17+
type t = [ `All | `One of Ocaml_env.t ] * string
18+
19+
val pp : t Fmt.t
20+
21+
val env_and_payload : string -> t
22+
(** [env_and_payload s] returns the environment and file/prelude string described
1923
by [s].
20-
I.e. [env_and_file "a:f"] associates [f] to the environment named [a],
21-
[env_and_file " :f"] associates [f] to the default environment, and
22-
[env_and_file "f"] associates [f] to all environments. *)
24+
I.e. [env_and_payload "a:f"] associates [f] to the environment named [a],
25+
[env_and_payload " :f"] associates [f] to the default environment, and
26+
[env_and_payload "f"] associates [f] to all environments. *)

lib/test/mdx_test.ml

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -314,15 +314,13 @@ let with_non_det ~on_skip_execution ~on_keep_old_output ~on_evaluation
314314
| _ -> on_evaluation ()
315315

316316
let preludes ~prelude ~prelude_str =
317-
let aux to_lines p =
318-
let env, file = Mdx.Prelude.env_and_file p in
319-
(env, to_lines file)
320-
in
317+
let parse_str (env, content) = (env, [ content ]) in
318+
let parse (env, file) = (env, Mdx.Util.File.read_lines file) in
321319
match (prelude, prelude_str) with
322320
| [], [] -> []
323-
| [], fs -> List.map (aux (fun x -> [ x ])) fs
324-
| fs, [] -> List.map (aux Mdx.Util.File.read_lines) fs
325-
| _ -> Fmt.failwith "only one of --prelude or --prelude-str shoud be used"
321+
| [], fs -> List.map parse_str fs
322+
| fs, [] -> List.map parse fs
323+
| _ -> Fmt.failwith "only one of --prelude or --prelude-str should be used"
326324

327325
let run_exn ~non_deterministic ~silent_eval ~record_backtrace ~syntax ~silent
328326
~verbose_findlib ~prelude ~prelude_str ~file ~section ~root ~force_output

lib/test/mdx_test.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ val run_exn :
1919
syntax:Mdx.Syntax.t option ->
2020
silent:bool ->
2121
verbose_findlib:bool ->
22-
prelude:string list ->
23-
prelude_str:string list ->
22+
prelude:Mdx.Prelude.t list ->
23+
prelude_str:Mdx.Prelude.t list ->
2424
file:string ->
2525
section:string option ->
2626
root:string option ->

test/bin/mdx-dune-gen/misc/basic/dune.gen.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ let run_exn_defaults =
2222
~root:None ~force_output:false
2323
~output:(Some `Stdout)
2424
let file = Sys.argv.(1)
25-
let prelude = ["prelude.ml";"prelude2.ml"]
25+
let prelude = [(`All, "prelude.ml"); (`All, "prelude2.ml")]
2626

2727
let directives = List.map (fun path ->
2828
Mdx_top.Directory path) []

0 commit comments

Comments
 (0)