Skip to content

Commit 079d709

Browse files
committed
Resolve references to assets
Signed-off-by: Paul-Elliot <[email protected]>
1 parent 2dbd106 commit 079d709

File tree

7 files changed

+60
-5
lines changed

7 files changed

+60
-5
lines changed

src/odoc/resolver.ml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,13 @@ let lookup_path ~possible_unit_names ~named_roots ~hierarchy (tag, path) :
447447
|> List.find_map find_in_hierarchy
448448
|> option_to_result
449449

450+
let lookup_asset_by_path ~pages ~hierarchy path =
451+
let possible_unit_names name = [ "asset-" ^ name ^ ".odoc" ] in
452+
match lookup_path ~possible_unit_names ~named_roots:pages ~hierarchy path with
453+
| Ok (Odoc_file.Asset_content asset) -> Ok asset
454+
| Ok _ -> Error `Not_found (* TODO: Report is not an asset. *)
455+
| Error _ as e -> e
456+
450457
let lookup_page_by_path ~pages ~hierarchy path =
451458
let possible_unit_names name = [ "page-" ^ name ^ ".odoc" ] in
452459
match lookup_path ~possible_unit_names ~named_roots:pages ~hierarchy path with
@@ -472,6 +479,10 @@ let lookup_page ap ~pages ~hierarchy = function
472479
| `Path p -> lookup_page_by_path ~pages ~hierarchy p
473480
| `Name n -> lookup_page_by_name ap n
474481

482+
let lookup_asset ~pages ~hierarchy = function
483+
| `Path p -> lookup_asset_by_path ~pages ~hierarchy p
484+
| `Name _ -> failwith "TODO"
485+
475486
type t = {
476487
important_digests : bool;
477488
ap : Accessible_paths.t;
@@ -566,8 +577,11 @@ let build_compile_env_for_unit
566577
let lookup_unit =
567578
lookup_unit ~important_digests ~imports_map ap ~libs:None ~hierarchy:None
568579
and lookup_page _ = Error `Not_found
580+
and lookup_asset _ = Error `Not_found
569581
and lookup_impl = lookup_impl ap in
570-
let resolver = { Env.open_units; lookup_unit; lookup_page; lookup_impl } in
582+
let resolver =
583+
{ Env.open_units; lookup_unit; lookup_page; lookup_impl; lookup_asset }
584+
in
571585
Env.env_of_unit m ~linking:false resolver
572586

573587
(** [important_digests] and [imports_map] only apply to modules. *)
@@ -589,8 +603,9 @@ let build ?(imports_map = StringMap.empty) ?hierarchy_roots
589603
let lookup_unit =
590604
lookup_unit ~important_digests ~imports_map ap ~libs ~hierarchy
591605
and lookup_page = lookup_page ap ~pages ~hierarchy
606+
and lookup_asset = lookup_asset ~pages ~hierarchy
592607
and lookup_impl = lookup_impl ap in
593-
{ Env.open_units; lookup_unit; lookup_page; lookup_impl }
608+
{ Env.open_units; lookup_unit; lookup_page; lookup_impl; lookup_asset }
594609

595610
let build_compile_env_for_impl t i =
596611
let imports_map =

src/search/json_index/json_search.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ let rec of_id x =
3939
match x.iv with
4040
| `Root (_, name) -> [ ret "Root" (ModuleName.to_string name) ]
4141
| `Page (_, name) -> [ ret "Page" (PageName.to_string name) ]
42+
| `AssetFile (_, name) -> [ ret "Asset" (AssetName.to_string name) ]
4243
| `LeafPage (_, name) -> [ ret "Page" (PageName.to_string name) ]
4344
| `Module (parent, name) ->
4445
ret "Module" (ModuleName.to_string name) :: of_id (parent :> t)
@@ -76,7 +77,7 @@ let rec of_id x =
7677
| `Label (parent, name) ->
7778
ret "Label" (LabelName.to_string name) :: of_id (parent :> t)
7879
| `SourceDir _ | `SourceLocationMod _ | `SourceLocation _ | `SourcePage _
79-
| `SourceLocationInternal _ | `AssetFile _ ->
80+
| `SourceLocationInternal _ ->
8081
[ `Null ]
8182
(* TODO *)
8283

src/xref2/env.ml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type resolver = {
1414
open_units : string list;
1515
lookup_unit : path_query -> (lookup_unit_result, lookup_error) result;
1616
lookup_page : path_query -> (Lang.Page.t, lookup_error) result;
17+
lookup_asset : path_query -> (Lang.Asset.t, lookup_error) result;
1718
lookup_impl : string -> Lang.Implementation.t option;
1819
}
1920

@@ -431,6 +432,11 @@ let lookup_page query env =
431432
| None -> Error `Not_found
432433
| Some r -> r.lookup_page query
433434

435+
let lookup_asset query env =
436+
match env.resolver with
437+
| None -> Error `Not_found
438+
| Some r -> r.lookup_asset query
439+
434440
let lookup_unit query env =
435441
match env.resolver with
436442
| None -> Error `Not_found
@@ -442,6 +448,9 @@ let lookup_impl name env =
442448
let lookup_page_by_name n env = lookup_page (`Name n) env
443449
let lookup_page_by_path p env = lookup_page (`Path p) env
444450

451+
let lookup_asset_by_name p env = lookup_asset (`Name p) env
452+
let lookup_asset_by_path p env = lookup_asset (`Path p) env
453+
445454
let lookup_unit_by_path p env =
446455
match lookup_unit (`Path p) env with
447456
| Ok (Found u) ->

src/xref2/env.mli

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type resolver = {
1414
open_units : string list;
1515
lookup_unit : path_query -> (lookup_unit_result, lookup_error) result;
1616
lookup_page : path_query -> (Lang.Page.t, lookup_error) result;
17+
lookup_asset : path_query -> (Lang.Asset.t, lookup_error) result;
1718
lookup_impl : string -> Lang.Implementation.t option;
1819
}
1920

@@ -95,6 +96,11 @@ val lookup_page_by_name : string -> t -> (Lang.Page.t, lookup_error) result
9596
val lookup_page_by_path :
9697
Reference.Hierarchy.t -> t -> (Lang.Page.t, lookup_error) result
9798

99+
val lookup_asset_by_path :
100+
Reference.Hierarchy.t -> t -> (Lang.Asset.t, lookup_error) result
101+
102+
val lookup_asset_by_name : string -> t -> (Lang.Asset.t, lookup_error) result
103+
98104
val lookup_impl : string -> t -> Lang.Implementation.t option
99105

100106
val lookup_unit_by_path :

src/xref2/ref_tools.ml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ type class_type_lookup_result = Resolved.ClassType.t * Component.ClassType.t
2121

2222
type page_lookup_result = Resolved.Page.t * Odoc_model.Lang.Page.t
2323

24+
type asset_lookup_result = Resolved.Asset.t * Odoc_model.Lang.Asset.t
25+
2426
type type_lookup_result =
2527
[ `T of datatype_lookup_result
2628
| `C of class_lookup_result
@@ -233,6 +235,10 @@ module Path = struct
233235
Env.lookup_page_by_path p env |> handle_lookup_error p >>= fun p ->
234236
Ok (`Identifier p.name, p)
235237

238+
let asset_in_env env p : asset_lookup_result ref_result =
239+
Env.lookup_asset_by_path p env |> handle_lookup_error p >>= fun p ->
240+
Ok (`Identifier p.name, p)
241+
236242
let module_in_env env p : module_lookup_result ref_result =
237243
Env.lookup_unit_by_path p env |> handle_lookup_error p >>= fun m ->
238244
Ok (M.of_element env m)
@@ -626,6 +632,15 @@ module Page = struct
626632
let of_element _env (`Page (id, page)) : t = (`Identifier id, page)
627633
end
628634

635+
module Asset = struct
636+
type t = asset_lookup_result
637+
638+
let in_env env name : t ref_result =
639+
match Env.lookup_asset_by_name name env with
640+
| Ok p -> Ok (`Identifier p.Odoc_model.Lang.Asset.name, p)
641+
| Error `Not_found -> Error (`Lookup_by_name (`Page (* TODO *), name))
642+
end
643+
629644
module LP = struct
630645
(** Label parent *)
631646

@@ -939,7 +954,7 @@ let resolve_reference : _ -> Reference.t -> _ =
939954
resolve_label_parent_reference env parent >>= fun p ->
940955
L.in_label_parent env p name >>= resolved_with_text
941956
| `Root (name, (`TPage | `TChildPage)) -> Page.in_env env name >>= resolved2
942-
| `Root (name, `TAsset) -> Error (`Find_by_name (`Asset_path, name))
957+
| `Root (name, `TAsset) -> Asset.in_env env name >>= resolved2
943958
| `Dot (parent, name) -> resolve_reference_dot env parent name
944959
| `Root (name, `TConstructor) -> CS.in_env env name >>= resolved1
945960
| `Constructor (parent, name) ->
@@ -970,7 +985,7 @@ let resolve_reference : _ -> Reference.t -> _ =
970985
resolve_class_signature_reference env parent >>= fun p ->
971986
MV.in_class_signature env p name >>= resolved1
972987
| `Page_path p -> Path.page_in_env env p >>= resolved2
973-
| `Asset_path (tag, p) -> Error (`Path_error (`Not_found, tag, p))
988+
| `Asset_path a -> Path.asset_in_env env a >>= resolved2
974989
| `Module_path p ->
975990
Path.module_in_env env p
976991
>>= module_lookup_to_signature_lookup env

test/xref2/path_references.t/doc/foo.mld

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@
1010
{!//subdir/dup} {!/pkg/subdir/dup} {!subdir/dup}
1111
{1 Module Test}
1212
{!//Test} {!/libname/Test} {!./Test} {!Test}
13+
14+
{1 Asset}
15+
16+
{!//asset-"img.png"} {!./asset-"img.png"} {!/pkg/asset-"img.png"}

test/xref2/path_references.t/run.t

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
$ odoc compile --output-dir h --parent-id pkg/doc/subdir doc/subdir/bar.mld
77
$ odoc compile --output-dir h --parent-id pkg/doc/subdir doc/subdir/dup.mld
88
$ odoc compile --output-dir h --parent-id pkg/lib/libname test.cmt
9+
$ odoc compile-asset --output-dir h --parent-id pkg/doc --name img.png
910

1011
$ odoc link -P pkg:h/pkg/doc -L libname:h/pkg/lib/libname h/pkg/doc/subdir/page-dup.odoc
1112
$ odoc link -P pkg:h/pkg/doc -L libname:h/pkg/lib/libname h/pkg/doc/subdir/page-bar.odoc
@@ -67,6 +68,10 @@ Helper that extracts references in a compact way. Headings help to interpret the
6768
{"`Reference":[{"`Resolved":{"`Identifier":{"`Root":[{"Some":{"`Page":[{"Some":{"`Page":[{"Some":{"`Page":["None","pkg"]}},"lib"]}},"libname"]}},"Test"]}}},[]]}
6869
{"`Reference":[{"`Any_path":["`TRelativePath",["Test"]]},[]]}
6970
{"`Reference":[{"`Root":["Test","`TUnknown"]},[]]}
71+
["Asset"]
72+
{"`Reference":[{"`Resolved":{"`Identifier":{"`AssetFile":[{"`Page":[{"Some":{"`Page":["None","pkg"]}},"doc"]},"img.png"]}}},[]]}
73+
{"`Reference":[{"`Resolved":{"`Identifier":{"`AssetFile":[{"`Page":[{"Some":{"`Page":["None","pkg"]}},"doc"]},"img.png"]}}},[]]}
74+
{"`Reference":[{"`Resolved":{"`Identifier":{"`AssetFile":[{"`Page":[{"Some":{"`Page":["None","pkg"]}},"doc"]},"img.png"]}}},[]]}
7075

7176
$ odoc_print ./h/pkg/doc/subdir/page-bar.odocl | jq_references
7277
["Title","for","subdir/bar"]

0 commit comments

Comments
 (0)