@@ -207,8 +207,12 @@ module Mangle = struct
207
207
| None -> base
208
208
| Some prefix -> prefix :: base
209
209
in
210
- let name = Module_name.Unique. to_name ~loc: Loc. none obj_name in
211
- let path = if has_lib_interface then [ name ] else interface :: path in
210
+ let name =
211
+ if has_lib_interface then
212
+ Module_name.Unique. to_name ~loc: Loc. none obj_name
213
+ else interface
214
+ in
215
+ let path = if has_lib_interface then [ name ] else path @ [ interface ] in
212
216
Module. generated ~path ~obj_name ~kind ~src_dir name
213
217
214
218
let wrap_module t m ~interface =
@@ -246,6 +250,8 @@ module Group = struct
246
250
| Group of t
247
251
| Module of Module. t
248
252
253
+ let alias t = t.alias
254
+
249
255
module Of_trie = struct
250
256
let of_trie ~src_dir ~mangle ~interface ~rev_path trie =
251
257
let rec loop interface rev_path trie =
@@ -477,34 +483,42 @@ module Group = struct
477
483
match Module_name.Map. find modules name with
478
484
| Some (Group g ) -> g
479
485
| Some (Module m ) ->
480
- Code_error. raise " for_alias : unexpected module"
486
+ Code_error. raise " group_of_alias : unexpected module"
481
487
[ (" m" , Module. to_dyn m); (" alias" , Module. to_dyn alias) ]
482
488
| None ->
483
- Code_error. raise " for_alias: not found"
484
- [ (" alias" , Module. to_dyn alias) ]
489
+ Code_error. raise " group_of_alias: not found"
490
+ [ (" name" , Module_name. to_dyn name)
491
+ ; (" modules" , Module_name.Map. to_dyn dyn_of_node modules)
492
+ ; (" alias" , Module. to_dyn alias)
493
+ ]
485
494
486
495
let path_of_alias_module alias =
487
496
match Module. kind alias with
488
497
| Alias for_ -> for_
489
- | _ -> Code_error. raise " for_alias : not an alias module" []
498
+ | _ -> Code_error. raise " group_of_alias : not an alias module" []
490
499
491
- let make_for_alias t alias path =
500
+ let make_group_of_alias t alias path =
492
501
let rec loop (t : t ) = function
493
502
| [] -> t
494
503
| name :: path ->
495
504
let group = find_module alias t.modules name in
496
505
loop group path
497
506
in
498
- let group = loop t path in
499
- let modules = Module_name.Map. remove group.modules group.name in
500
- Module_name.Map. map modules ~f: (fun (g : node ) ->
501
- match g with
502
- | Module m -> m
503
- | Group g -> lib_interface g)
507
+ loop t path
504
508
end
505
509
506
- let for_alias t alias =
507
- For_alias. make_for_alias t alias (For_alias. path_of_alias_module alias)
510
+ let group_of_alias t alias =
511
+ For_alias. make_group_of_alias t alias (For_alias. path_of_alias_module alias)
512
+
513
+ let for_alias t =
514
+ Module_name.Map. remove t.modules t.name
515
+ |> Module_name.Map. to_list_map ~f: (fun name node ->
516
+ let m =
517
+ match node with
518
+ | Module m -> m
519
+ | Group g -> lib_interface g
520
+ in
521
+ (name, m))
508
522
end
509
523
510
524
module Unwrapped = struct
@@ -570,12 +584,12 @@ module Unwrapped = struct
570
584
| Module m -> m
571
585
| Group g -> Group. lib_interface g)
572
586
573
- let for_alias t alias =
587
+ let group_of_alias t alias =
574
588
match Group.For_alias. path_of_alias_module alias with
575
589
| [] -> assert false
576
590
| name :: path ->
577
591
let group = Group.For_alias. find_module alias t name in
578
- Group.For_alias. make_for_alias group alias path
592
+ Group.For_alias. make_group_of_alias group alias path
579
593
580
594
module Memo_traversals = struct
581
595
let parallel_map t ~f = Group.Memo_traversals. parallel_map_modules t ~f
@@ -611,7 +625,7 @@ module Wrapped = struct
611
625
| Module m -> f m init
612
626
| Group t -> Group. fold t ~f ~init )
613
627
614
- let for_alias t m = Group. for_alias t.group m
628
+ let group_of_alias t m = Group. group_of_alias t.group m
615
629
616
630
let encode { group; wrapped_compat; wrapped; toplevel_module = _ } =
617
631
let open Dune_lang.Encoder in
@@ -920,25 +934,46 @@ let rec fold_no_vlib t ~init ~f =
920
934
| Wrapped w -> Wrapped. fold w ~init ~f
921
935
| Impl { vlib = _ ; impl } -> fold_no_vlib impl ~f ~init
922
936
923
- let rec for_alias t m =
924
- match t with
925
- | Stdlib _ | Singleton _ -> Module_name.Map. empty
926
- | Unwrapped w -> Unwrapped. for_alias w m
927
- | Wrapped w -> Wrapped. for_alias w m
928
- | Impl { vlib; impl } ->
929
- let impl = for_alias impl m in
930
- let vlib = for_alias vlib m in
931
- Module_name.Map. merge impl vlib ~f: (fun _ impl vlib ->
932
- match (impl, vlib) with
933
- | None , None -> assert false
934
- | Some _ , _ -> impl
935
- | _ , Some vlib -> Option. some_if (Module. visibility vlib = Public ) vlib)
936
-
937
- let fold_no_vlib_with_aliases t ~init ~normal ~alias =
938
- fold_no_vlib t ~init ~f: (fun m acc ->
939
- match Module. kind m with
940
- | Alias _ -> alias m (for_alias t m) acc
941
- | _ -> normal m acc)
937
+ let fold_no_vlib_with_aliases =
938
+ let rec group_of_alias t m =
939
+ match t with
940
+ | Wrapped w -> Some (Wrapped. group_of_alias w m)
941
+ | Unwrapped w -> Some (Unwrapped. group_of_alias w m)
942
+ | Impl { vlib; impl } -> (
943
+ let vlib = group_of_alias vlib m in
944
+ let impl = group_of_alias impl m in
945
+ match (vlib, impl) with
946
+ | None , None -> assert false
947
+ | Some _ , None -> vlib
948
+ | None , Some _ -> impl
949
+ | Some vlib , Some impl ->
950
+ let modules =
951
+ Module_name.Map. merge vlib.modules impl.modules ~f: (fun _ vlib impl ->
952
+ match (vlib, impl) with
953
+ | None , None -> assert false
954
+ | _ , Some _ -> impl
955
+ | Some vlib , _ ->
956
+ let vlib =
957
+ match (vlib : Group.node ) with
958
+ | Module m -> m
959
+ | Group g -> Group. lib_interface g
960
+ in
961
+ Option. some_if (Module. visibility vlib = Public ) vlib
962
+ |> Option. map ~f: (fun m -> Group. Module m))
963
+ in
964
+ Some { impl with Group. modules })
965
+ | _ -> None
966
+ in
967
+ fun t ~init ~normal ~alias ->
968
+ fold_no_vlib t ~init ~f: (fun m acc ->
969
+ match Module. kind m with
970
+ | Alias _ -> (
971
+ match group_of_alias t m with
972
+ | None ->
973
+ Code_error. raise " alias module for group without alias"
974
+ [ (" t" , to_dyn t); (" m" , Module. to_dyn m) ]
975
+ | Some group -> alias group acc)
976
+ | _ -> normal m acc)
942
977
943
978
type split_by_lib =
944
979
{ vlib : Module .t list
@@ -1131,3 +1166,19 @@ let source_dirs =
1131
1166
Module. sources m
1132
1167
|> List. fold_left ~init: acc ~f: (fun acc f ->
1133
1168
Path.Set. add acc (Path. parent_exn f)))
1169
+
1170
+ let canonical_path t (group : Group.t ) m =
1171
+ let path =
1172
+ let path = Module. path m in
1173
+ match Module_name.Map. find group.modules (Module. name m) with
1174
+ | None | Some (Group. Module _ ) -> path
1175
+ | Some (Group _ ) ->
1176
+ (* The path for group interfaces always duplicates
1177
+ the last component.
1178
+
1179
+ For example: foo/foo.ml would has the path [ "Foo"; "Foo" ] *)
1180
+ path |> List. rev |> List. tl |> List. rev
1181
+ in
1182
+ match t with
1183
+ | Impl { impl = Wrapped w ; _ } | Wrapped w -> w.group.name :: path
1184
+ | _ -> Module. path m
0 commit comments