Some module fixes

This commit is contained in:
Louis Gesbert 2023-12-01 18:07:16 +01:00
parent 9a255522be
commit 54d956823b
3 changed files with 15 additions and 21 deletions

View File

@ -578,8 +578,13 @@ let gen_build_statements
~outputs:[inc srcv] ~outputs:[inc srcv]
in in
let module_deps = let module_deps =
Option.map Option.map (fun m ->
(fun m -> Nj.build "phony" ~inputs:[inc srcv] ~outputs:[modd m]) Nj.build "phony"
~inputs:[inc srcv;
(!Var.builddir / src /../ m) ^ ".cmi";
(!Var.builddir / src /../ m) ^ ".cmxs";
]
~outputs:[modd m])
item.module_def item.module_def
in in
let ml_file = let ml_file =
@ -604,7 +609,7 @@ let gen_build_statements
| Some m -> | Some m ->
let target ext = (!Var.builddir / src /../ m) ^ "." ^ ext in let target ext = (!Var.builddir / src /../ m) ^ "." ^ ext in
Nj.build "ocaml-module" ~inputs:[ml_file] Nj.build "ocaml-module" ~inputs:[ml_file]
~implicit_in:(List.map (modfile ".cmi") modules) ~implicit_in:(List.map modd modules)
~outputs:[target "cmxs"] ~outputs:[target "cmxs"]
~implicit_out:(List.map target implicit_out_exts) ~implicit_out:(List.map target implicit_out_exts)
~vars: ~vars:
@ -656,6 +661,7 @@ let gen_build_statements
]) ])
include_dirs include_dirs
@ List.map (fun m -> m ^ ".cmx") modules ); @ List.map (fun m -> m ^ ".cmx") modules );
(* FIXME: This doesn't work for module used through file inclusion *)
] ]
in in
let expose_module = let expose_module =
@ -664,11 +670,7 @@ let gen_build_statements
Some Some
(Nj.build "phony" (Nj.build "phony"
~outputs:[m ^ "@module"] ~outputs:[m ^ "@module"]
~inputs: ~inputs:[modd m])
[
(!Var.builddir / src /../ m) ^ ".cmi";
(!Var.builddir / src /../ m) ^ ".cmxs";
])
| _ -> None | _ -> None
in in
let interp_deps = let interp_deps =

View File

@ -1013,7 +1013,7 @@ let form_context (surface, mod_uses) surface_modules : context =
disambiguation. This is only done towards the root context, because disambiguation. This is only done towards the root context, because
submodules are only interfaces which don't need disambiguation ; and submodules are only interfaces which don't need disambiguation ; and
transitive dependencies shouldn't be visible here. *) transitive dependencies shouldn't be visible here. *)
let sub_constructor_idmap, sub_field_idmap = let constructor_idmap, field_idmap =
Ident.Map.fold Ident.Map.fold
(fun _ m (cmap, fmap) -> (fun _ m (cmap, fmap) ->
let lctx = ModuleName.Map.find m ctxt.modules in let lctx = ModuleName.Map.find m ctxt.modules in
@ -1029,22 +1029,14 @@ let form_context (surface, mod_uses) surface_modules : context =
in in
cmap, fmap) cmap, fmap)
mod_uses mod_uses
(Ident.Map.empty, Ident.Map.empty) (ctxt.local.constructor_idmap, ctxt.local.field_idmap)
in in
{ {
ctxt with ctxt with
local = local =
{ {
ctxt.local with ctxt.local with
(* In the root context, don't disambiguate on submodules structs/enums constructor_idmap;
when there is a conflict *) field_idmap;
constructor_idmap =
Ident.Map.union
(fun _ base _ -> Some base)
ctxt.local.constructor_idmap sub_constructor_idmap;
field_idmap =
Ident.Map.union
(fun _ base _ -> Some base)
ctxt.local.field_idmap sub_field_idmap;
}; };
} }

View File

@ -81,7 +81,7 @@ let load_module_interfaces options includes program =
"Circular module dependency" "Circular module dependency"
| None -> | None ->
let intf = Surface.Parser_driver.load_interface (Cli.FileName f) in let intf = Surface.Parser_driver.load_interface (Cli.FileName f) in
let modname = ModuleName.fresh use.Surface.Ast.mod_use_name in let modname = ModuleName.fresh intf.intf_modname in
let seen = File.Map.add f None seen in let seen = File.Map.add f None seen in
let seen, sub_use_map = let seen, sub_use_map =
aux aux