Skip to content

Commit 9f7e813

Browse files
Julowjonludlam
authored andcommitted
Avoid possibly unmatched pkg_name and pkg_dir
Propagate both values from the places where they are known at the same time as it seems that both values are going to be useful almost everywhere.
1 parent 40d0b59 commit 9f7e813

File tree

5 files changed

+80
-73
lines changed

5 files changed

+80
-73
lines changed

src/driver/compile.ml

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,17 @@ type compiled = {
1717
include_dirs : Fpath.Set.t;
1818
impl : impl option;
1919
pkg_args : pkg_args;
20-
pkg_name : string;
21-
pkg_dir : Fpath.t;
20+
pkgdir : Packages.pkgdir;
2221
}
2322

2423
let mk_byhash (pkgs : Packages.t Util.StringMap.t) =
2524
Util.StringMap.fold
26-
(fun pkgname pkg acc ->
25+
(fun _pkgname pkg acc ->
2726
List.fold_left
2827
(fun acc (lib : Packages.libty) ->
2928
List.fold_left
3029
(fun acc (m : Packages.modulety) ->
31-
Util.StringMap.add m.m_intf.mif_hash (pkgname, m) acc)
30+
Util.StringMap.add m.m_intf.mif_hash m acc)
3231
acc lib.modules)
3332
acc pkg.Packages.libraries)
3433
pkgs Util.StringMap.empty
@@ -69,8 +68,7 @@ let init_stats (pkgs : Packages.t Util.StringMap.t) =
6968

7069
open Eio.Std
7170

72-
type partial =
73-
(string * compiled) list * (string * Packages.modulety) Util.StringMap.t
71+
type partial = (string * compiled) list * Packages.modulety Util.StringMap.t
7472

7573
let unmarshal filename =
7674
let ic = open_in_bin (Fpath.to_string filename) in
@@ -139,7 +137,7 @@ let compile ?partial ~output_dir ?linked_dir all =
139137
| None ->
140138
Logs.debug (fun m -> m "Error locating hash: %s" hash);
141139
Error Not_found
142-
| Some (package_name, modty) ->
140+
| Some modty ->
143141
let deps = modty.m_intf.mif_deps in
144142
let odoc_file = Fpath.(output_dir // modty.m_intf.mif_odoc_file) in
145143
let odocl_file = Fpath.(linked_dir // modty.m_intf.mif_odocl_file) in
@@ -199,8 +197,7 @@ let compile ?partial ~output_dir ?linked_dir all =
199197
include_dirs = includes;
200198
impl;
201199
pkg_args;
202-
pkg_dir = modty.m_pkg_dir;
203-
pkg_name = package_name;
200+
pkgdir = modty.m_pkg;
204201
}
205202
in
206203

@@ -226,7 +223,7 @@ let compile ?partial ~output_dir ?linked_dir all =
226223
in
227224
let result =
228225
Util.StringMap.fold
229-
(fun package_name (pkg : Packages.t) acc ->
226+
(fun _pkgname (pkg : Packages.t) acc ->
230227
Logs.debug (fun m ->
231228
m "Package %s mlds: [%a]" pkg.name
232229
Fmt.(list ~sep:sp Packages.pp_mld)
@@ -255,8 +252,7 @@ let compile ?partial ~output_dir ?linked_dir all =
255252
include_dirs;
256253
impl = None;
257254
pkg_args;
258-
pkg_dir = mld.mld_pkg_dir;
259-
pkg_name = package_name;
255+
pkgdir = mld.mld_pkg;
260256
}
261257
:: acc)
262258
acc pkg.mlds)
@@ -268,17 +264,21 @@ let compile ?partial ~output_dir ?linked_dir all =
268264
| None -> ());
269265
result
270266

271-
type linked = { output_file : Fpath.t; src : Fpath.t option; pkg_dir : Fpath.t }
267+
type linked = {
268+
output_file : Fpath.t;
269+
src : Fpath.t option;
270+
pkgdir : Packages.pkgdir;
271+
}
272272

273273
let link : compiled list -> _ =
274274
fun compiled ->
275275
let link : compiled -> linked list =
276276
fun c ->
277277
let includes = Fpath.Set.add c.odoc_output_dir c.include_dirs in
278278
let link input_file output_file =
279-
let { pkg_args = { libs; docs }; pkg_name; _ } = c in
280-
Odoc.link ~input_file ~output_file ~includes ~libs ~docs
281-
~current_package:pkg_name ()
279+
let { pkg_args = { libs; docs }; pkgdir = current_package, _; _ } = c in
280+
Odoc.link ~input_file ~output_file ~includes ~libs ~docs ~current_package
281+
()
282282
in
283283
let impl =
284284
match c.impl with
@@ -287,7 +287,7 @@ let link : compiled list -> _ =
287287
m "Linking impl: %a -> %a" Fpath.pp impl_odoc Fpath.pp impl_odocl);
288288
link impl_odoc impl_odocl;
289289
Atomic.incr Stats.stats.linked_impls;
290-
[ { pkg_dir = c.pkg_dir; output_file = impl_odocl; src = Some src } ]
290+
[ { pkgdir = c.pkgdir; output_file = impl_odocl; src = Some src } ]
291291
| None -> []
292292
in
293293
match c.m with
@@ -300,12 +300,12 @@ let link : compiled list -> _ =
300300
(match c.m with
301301
| Module _ -> Atomic.incr Stats.stats.linked_units
302302
| Mld _ -> Atomic.incr Stats.stats.linked_mlds);
303-
{ output_file = c.odocl_file; src = None; pkg_dir = c.pkg_dir } :: impl
303+
{ output_file = c.odocl_file; src = None; pkgdir = c.pkgdir } :: impl
304304
in
305305
Fiber.List.map link compiled |> List.concat
306306

307307
let index_one ~odocl_dir pkgname pkg =
308-
let dir = pkg.Packages.pkg_dir in
308+
let _, dir = pkg.Packages.pkgdir in
309309
let output_file = Fpath.(odocl_dir // dir / Odoc.index_filename) in
310310
let libs =
311311
List.map
@@ -319,10 +319,9 @@ let index_one ~odocl_dir pkgname pkg =
319319
let index ~odocl_dir pkgs = Util.StringMap.iter (index_one ~odocl_dir) pkgs
320320

321321
let sherlodoc_index_one ~html_dir ~odocl_dir _ pkg_content =
322-
let inputs =
323-
[ Fpath.(odocl_dir // pkg_content.Packages.pkg_dir / Odoc.index_filename) ]
324-
in
325-
let dst = Fpath.(html_dir // Sherlodoc.db_js_file pkg_content.pkg_dir) in
322+
let _, pkg_dir = pkg_content.Packages.pkgdir in
323+
let inputs = [ Fpath.(odocl_dir // pkg_dir / Odoc.index_filename) ] in
324+
let dst = Fpath.(html_dir // Sherlodoc.db_js_file pkg_dir) in
326325
let dst_dir, _ = Fpath.split_base dst in
327326
Util.mkdir_p dst_dir;
328327
Sherlodoc.index ~format:`js ~inputs ~dst ()
@@ -338,15 +337,17 @@ let sherlodoc ~html_dir ~odocl_dir pkgs =
338337
let inputs =
339338
pkgs |> Util.StringMap.bindings
340339
|> List.map (fun (_pkgname, pkg) ->
341-
Fpath.(odocl_dir // pkg.Packages.pkg_dir / Odoc.index_filename))
340+
let _, pkg_dir = pkg.Packages.pkgdir in
341+
Fpath.(odocl_dir // pkg_dir / Odoc.index_filename))
342342
in
343343
Sherlodoc.index ~format ~inputs ~dst ()
344344

345345
let html_generate output_dir ~odocl_dir linked =
346346
let html_generate : linked -> unit =
347347
fun l ->
348-
let search_uris = [ Sherlodoc.db_js_file l.pkg_dir; Sherlodoc.js_file ] in
349-
let index = Some Fpath.(odocl_dir // l.pkg_dir / Odoc.index_filename) in
348+
let _, pkg_dir = l.pkgdir in
349+
let search_uris = [ Sherlodoc.db_js_file pkg_dir; Sherlodoc.js_file ] in
350+
let index = Some Fpath.(odocl_dir // pkg_dir / Odoc.index_filename) in
350351
Odoc.html_generate ~search_uris ?index
351352
~output_dir:(Fpath.to_string output_dir)
352353
~input_file:l.output_file ?source:l.src ();

src/driver/dune_style.ml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,17 @@ let of_dune_build dir =
3434
let cmtidir =
3535
Fpath.(path / Printf.sprintf ".%s.objs" libname / "byte")
3636
in
37-
let pkg_dir = Fpath.rem_prefix dir path |> Option.get in
38-
( pkg_dir,
39-
Packages.Lib.v ~pkg_dir
37+
(* Map lib names to package names. *)
38+
let pkgdir = (libname, Fpath.rem_prefix dir path |> Option.get) in
39+
( pkgdir,
40+
Packages.Lib.v ~pkgdir
4041
~libname_of_archive:(Util.StringMap.singleton libname libname)
41-
~pkg_name:libname ~dir:path ~cmtidir:(Some cmtidir) ))
42+
~dir:path ~cmtidir:(Some cmtidir) ))
4243
libs
4344
in
4445
let packages =
4546
List.filter_map
46-
(fun (pkg_dir, lib) ->
47+
(fun (pkgdir, lib) ->
4748
match lib with
4849
| [ lib ] ->
4950
Some
@@ -54,7 +55,7 @@ let of_dune_build dir =
5455
libraries = [ lib ];
5556
mlds = [];
5657
mld_odoc_dir = Fpath.v lib.Packages.lib_name;
57-
pkg_dir;
58+
pkgdir;
5859
other_docs = Fpath.Set.empty;
5960
} )
6061
| _ -> None)

src/driver/packages.ml

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
(* Packages *)
22

3+
type pkgdir = string * Fpath.t
4+
35
type dep = string * Digest.t
46

57
type id = Odoc.id
@@ -32,7 +34,7 @@ type modulety = {
3234
m_intf : intf;
3335
m_impl : impl option;
3436
m_hidden : bool;
35-
m_pkg_dir : Fpath.t;
37+
m_pkg : pkgdir;
3638
(* The 'top dir' of a package, relative to [_odoc] or [_html] *)
3739
}
3840

@@ -42,7 +44,7 @@ type mld = {
4244
mld_parent_id : id;
4345
mld_path : Fpath.t; (* Absolute or relative to cwd *)
4446
mld_deps : Fpath.t list;
45-
mld_pkg_dir : Fpath.t;
47+
mld_pkg : pkgdir;
4648
(* The 'top dir' of a package, relative to [_odoc] or [_html] *)
4749
}
4850

@@ -61,20 +63,21 @@ type t = {
6163
libraries : libty list;
6264
mlds : mld list;
6365
mld_odoc_dir : Fpath.t; (* Relative to [odoc] dir *)
64-
pkg_dir : Fpath.t;
66+
pkgdir : pkgdir;
6567
other_docs : Fpath.Set.t;
6668
}
6769

6870
let maybe_prepend_top top_dir dir =
6971
match top_dir with None -> dir | Some d -> Fpath.(d // dir)
7072

71-
let pkg_dir top_dir pkg_name = maybe_prepend_top top_dir Fpath.(v pkg_name)
73+
let find_pkg top_dir pkg_name =
74+
(pkg_name, maybe_prepend_top top_dir Fpath.(v pkg_name))
7275

73-
let parent_of_lib pkg_dir lib_name = Fpath.(pkg_dir / "lib" / lib_name)
76+
let parent_of_lib (_, pkg_dir) lib_name = Fpath.(pkg_dir / "lib" / lib_name)
7477

75-
let parent_of_pages pkg_dir = Fpath.(pkg_dir / "doc")
78+
let parent_of_pages (_, pkg_dir) = Fpath.(pkg_dir / "doc")
7679

77-
let parent_of_src pkg_dir lib_name = Fpath.(pkg_dir / "src" / lib_name)
80+
let parent_of_src (_, pkg_dir) lib_name = Fpath.(pkg_dir / "src" / lib_name)
7881

7982
module Module = struct
8083
type t = modulety
@@ -85,7 +88,7 @@ module Module = struct
8588

8689
let is_hidden name = Astring.String.is_infix ~affix:"__" name
8790

88-
let vs pkg_dir lib_name libsdir cmtidir modules =
91+
let vs pkgdir lib_name libsdir cmtidir modules =
8992
let dir = match cmtidir with None -> libsdir | Some dir -> dir in
9093
let mk m_name =
9194
let exists ext =
@@ -105,7 +108,7 @@ module Module = struct
105108
| _ -> None)
106109
in
107110
let mk_intf mif_path =
108-
let mif_parent_id = parent_of_lib pkg_dir lib_name in
111+
let mif_parent_id = parent_of_lib pkgdir lib_name in
109112
let mif_odoc_file =
110113
Fpath.(
111114
mif_parent_id
@@ -125,7 +128,7 @@ module Module = struct
125128
| Error _ -> failwith "bad deps"
126129
in
127130
let mk_impl mip_path =
128-
let mip_parent_id = parent_of_lib pkg_dir lib_name in
131+
let mip_parent_id = parent_of_lib pkgdir lib_name in
129132
let mip_odoc_file =
130133
Fpath.(
131134
mip_parent_id
@@ -148,7 +151,7 @@ module Module = struct
148151
m "Found source file %a for %s" Fpath.pp src_path m_name);
149152
let src_name = Fpath.filename src_path in
150153
let src_id =
151-
Fpath.(parent_of_src pkg_dir lib_name / src_name)
154+
Fpath.(parent_of_src pkgdir lib_name / src_name)
152155
|> Odoc.id_of_fpath
153156
in
154157
Some { src_path; src_id }
@@ -166,7 +169,7 @@ module Module = struct
166169
let m_hidden = is_hidden m_name in
167170
try
168171
let r (m_intf, m_impl) =
169-
Some { m_name; m_intf; m_impl; m_hidden; m_pkg_dir = pkg_dir }
172+
Some { m_name; m_intf; m_impl; m_hidden; m_pkg = pkgdir }
170173
in
171174
match state with
172175
| Some cmt, Some cmti -> r (mk_intf cmti, Some (mk_impl cmt))
@@ -184,7 +187,8 @@ module Module = struct
184187
end
185188

186189
module Lib = struct
187-
let v ~pkg_dir ~libname_of_archive ~pkg_name ~dir ~cmtidir =
190+
let v ~pkgdir ~libname_of_archive ~dir ~cmtidir =
191+
let pkg_name, _ = pkgdir in
188192
Logs.debug (fun m ->
189193
m "Classifying dir %a for package %s" Fpath.pp dir pkg_name);
190194
let dirs =
@@ -211,8 +215,8 @@ module Lib = struct
211215
m "Defaulting to name of library: %s" archive_name);
212216
archive_name
213217
in
214-
let modules = Module.vs pkg_dir lib_name dir cmtidir modules in
215-
let odoc_dir = parent_of_lib pkg_dir lib_name in
218+
let modules = Module.vs pkgdir lib_name dir cmtidir modules in
219+
let odoc_dir = parent_of_lib pkgdir lib_name in
216220
Some { lib_name; odoc_dir; archive_name; modules }
217221
with _ ->
218222
Logs.err (fun m ->
@@ -335,8 +339,8 @@ let of_libs ~packages_dir libs =
335339
match rel_path with
336340
| None -> acc
337341
| Some rel_path ->
338-
let pkg_dir = pkg_dir packages_dir pkg_name in
339-
let id = Fpath.(parent_of_pages pkg_dir // rel_path) in
342+
let pkgdir = find_pkg packages_dir pkg_name in
343+
let id = Fpath.(parent_of_pages pkgdir // rel_path) in
340344
let mld_parent_id = id |> Fpath.parent |> Fpath.rem_empty_seg in
341345
let page_name = Fpath.(rem_ext mld_path |> filename) in
342346
let odoc_file =
@@ -350,7 +354,7 @@ let of_libs ~packages_dir libs =
350354
mld_parent_id = Odoc.id_of_fpath mld_parent_id;
351355
mld_path;
352356
mld_deps;
353-
mld_pkg_dir = pkg_dir;
357+
mld_pkg = pkgdir;
354358
}
355359
:: acc)
356360
odoc_pages []
@@ -369,11 +373,10 @@ let of_libs ~packages_dir libs =
369373
Logs.debug (fun m -> m "No package for dir %a\n%!" Fpath.pp dir);
370374
acc
371375
| Some pkg ->
372-
let pkg_dir = pkg_dir packages_dir pkg.name in
376+
let pkgdir = find_pkg packages_dir pkg.name in
373377

374378
let libraries =
375-
Lib.v ~pkg_dir ~libname_of_archive ~pkg_name:pkg.name ~dir
376-
~cmtidir:None
379+
Lib.v ~pkgdir ~libname_of_archive ~dir ~cmtidir:None
377380
in
378381
let libraries =
379382
List.filter
@@ -404,7 +407,7 @@ let of_libs ~packages_dir libs =
404407
mlds = update_mlds pkg.mlds libraries;
405408
}
406409
| None ->
407-
let mld_odoc_dir = parent_of_pages pkg_dir in
410+
let mld_odoc_dir = parent_of_pages pkgdir in
408411
Some
409412
{
410413
name = pkg.name;
@@ -413,7 +416,7 @@ let of_libs ~packages_dir libs =
413416
mlds;
414417
mld_odoc_dir;
415418
other_docs;
416-
pkg_dir;
419+
pkgdir;
417420
})
418421
acc)
419422
dirs Util.StringMap.empty

0 commit comments

Comments
 (0)