Skip to content

Commit d105bca

Browse files
committed
Fix root_module and preprocessing bug
do not try to preprocess root_module. Do this by excluding it from the set of "user written" modules. Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
1 parent 0744d6c commit d105bca

File tree

7 files changed

+52
-8
lines changed

7 files changed

+52
-8
lines changed

CHANGES.md

+3
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@ Unreleased
154154
- Fix `root_module` when used in public libraries (#4685, fixes #4684,
155155
@rgrinberg, @CraigFe)
156156

157+
- Fix `root_module` when used with preprocessing (#4683, fixes #4682,
158+
@rgrinberg, @CraigFe)
159+
157160
2.9.0 (unreleased)
158161
------------------
159162

src/dune_rules/ml_sources.ml

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ module Modules = struct
4646
let rev_map =
4747
let rev_modules =
4848
let by_name buildable =
49-
Modules.fold_user_written ~init:[] ~f:(fun m acc ->
49+
Modules.fold_user_available ~init:[] ~f:(fun m acc ->
5050
(Module.name m, buildable) :: acc)
5151
in
5252
List.rev_append
@@ -104,7 +104,7 @@ module Artifacts = struct
104104
in
105105
let modules =
106106
let by_name modules obj_dir =
107-
Modules_group.fold_user_written ~init:modules ~f:(fun m modules ->
107+
Modules_group.fold_user_available ~init:modules ~f:(fun m modules ->
108108
Module_name.Map.add_exn modules (Module.name m) (obj_dir, m))
109109
in
110110
let init =

src/dune_rules/modules.ml

+33
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,34 @@ let wrapped_compat = function
656656
Module_name.Map.empty
657657
| Wrapped w -> w.wrapped_compat
658658

659+
let rec fold_user_available t ~f ~init =
660+
match t with
661+
| Stdlib w -> Stdlib.fold w ~init ~f
662+
| Singleton m -> f m init
663+
| Wrapped { modules; _ }
664+
| Unwrapped modules ->
665+
Module_name.Map.fold modules ~init ~f
666+
| Impl { impl; vlib = _ } ->
667+
(* XXX shouldn't we folding over [vlib] as well? *)
668+
fold_user_available impl ~f ~init
669+
670+
let is_user_written m =
671+
match Module.kind m with
672+
| Root -> false
673+
| Wrapped_compat
674+
| Alias ->
675+
(* Logically, this shold be [acc]. But this is unreachable these are stored
676+
separately *)
677+
assert false
678+
| _ -> true
679+
659680
let rec fold_user_written t ~f ~init =
681+
let f m acc =
682+
if is_user_written m then
683+
f m acc
684+
else
685+
acc
686+
in
660687
match t with
661688
| Stdlib w -> Stdlib.fold w ~init ~f
662689
| Singleton m -> f m init
@@ -666,6 +693,12 @@ let rec fold_user_written t ~f ~init =
666693
| Impl { impl; vlib = _ } -> fold_user_written impl ~f ~init
667694

668695
let rec map_user_written t ~f =
696+
let f m =
697+
if is_user_written m then
698+
f m
699+
else
700+
Memo.Build.return m
701+
in
669702
let open Memo.Build.O in
670703
match t with
671704
| Singleton m ->

src/dune_rules/modules.mli

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ val fold_user_written : t -> f:(Module.t -> 'acc -> 'acc) -> init:'acc -> 'acc
5555
val map_user_written :
5656
t -> f:(Module.t -> Module.t Memo.Build.t) -> t Memo.Build.t
5757

58+
val fold_user_available : t -> f:(Module.t -> 'acc -> 'acc) -> init:'acc -> 'acc
59+
5860
(** Returns all the compatibility modules. *)
5961
val wrapped_compat : t -> Module.Name_map.t
6062

Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
(library
22
(name ppx)
33
(kind ppx_rewriter)
4-
(libraries lib)
54
(ppx.driver (main Ppx.main)))
Original file line numberDiff line numberDiff line change
@@ -1 +1,12 @@
1-
let main () = ()
1+
let main () =
2+
let out = ref "" in
3+
let args =
4+
[ ("-o", Arg.Set_string out, "")
5+
; ("--impl", Arg.Set_string (ref ""), "")
6+
; ("--as-ppx", Arg.Set (ref false), "")
7+
]
8+
in
9+
let anon _ = () in
10+
Arg.parse (Arg.align args) anon "";
11+
let out = open_out !out in
12+
close_out out;

test/blackbox-tests/test-cases/github4682.t/run.t

-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,3 @@ Attempting to use `(root_module ...)` with an executable that uses PPX results
22
in an unexpected build failure:
33

44
$ dune build
5-
Error: Multiple rules generated for _build/default/root.pp.ml-gen:
6-
- dune:5
7-
- <none>:1
8-
[1]

0 commit comments

Comments
 (0)