Skip to content

Commit cb6f4ff

Browse files
committed
Populate environment with assets
Signed-off-by: Paul-Elliot <[email protected]>
1 parent 49c8edc commit cb6f4ff

File tree

5 files changed

+75
-39
lines changed

5 files changed

+75
-39
lines changed

src/xref2/component.ml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,8 @@ module Element = struct
527527
(* No component for pages yet *)
528528
type page = [ `Page of Identifier.Page.t * Odoc_model.Lang.Page.t ]
529529

530+
type asset = [ `Asset of Identifier.AssetFile.t ]
531+
530532
type label_parent = [ signature | type_ | page ]
531533

532534
type fragment_type_parent = [ signature | datatype ]
@@ -543,7 +545,8 @@ module Element = struct
543545
| extension
544546
| extension_decl
545547
| field
546-
| page ]
548+
| page
549+
| asset ]
547550

548551
let identifier : [< any ] -> Odoc_model.Paths.Identifier.t =
549552
let open Odoc_model.Paths.Identifier in
@@ -561,6 +564,7 @@ module Element = struct
561564
| `Extension (id, _, _) -> (id :> t)
562565
| `ExtensionDecl (id, _) -> (id :> t)
563566
| `Page (id, _) -> (id :> t)
567+
| `Asset id -> (id :> t)
564568
end
565569

566570
module Fmt = struct

src/xref2/component.mli

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,8 @@ module Element : sig
491491
(* No component for pages yet *)
492492
type page = [ `Page of Identifier.Page.t * Odoc_model.Lang.Page.t ]
493493

494+
type asset = [ `Asset of Identifier.AssetFile.t ]
495+
494496
type label_parent = [ signature | type_ | page ]
495497

496498
type fragment_type_parent = [ signature | datatype ]
@@ -507,7 +509,8 @@ module Element : sig
507509
| extension
508510
| extension_decl
509511
| field
510-
| page ]
512+
| page
513+
| asset ]
511514

512515
val identifier : [< any ] -> Identifier.t
513516
end

src/xref2/env.ml

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ type kind =
8484
| Kind_Exception
8585
| Kind_Extension
8686
| Kind_Field
87+
| Kind_asset
8788

8889
module ElementsByName : sig
8990
type t
@@ -163,7 +164,6 @@ type t = {
163164
resolver : resolver option;
164165
recorder : recorder option;
165166
fragmentroot : (int * Component.Signature.t) option;
166-
parent_page : Identifier.Page.t option; (** parent page *)
167167
}
168168

169169
let is_linking env = env.linking
@@ -200,7 +200,6 @@ let empty =
200200
recorder = None;
201201
ambiguous_labels = Identifier.Maps.Label.empty;
202202
fragmentroot = None;
203-
parent_page = None;
204203
}
205204

206205
let add_fragment_root sg env =
@@ -358,6 +357,10 @@ let add_extension_constructor identifier
358357
add_to_elts Kind_Extension identifier (`Extension (identifier, ec, te)) env
359358
|> add_cdocs identifier ec.doc
360359

360+
let add_asset identifier env =
361+
if env.linking then add_to_elts Kind_asset identifier (`Asset identifier) env
362+
else env
363+
361364
let module_of_unit : Lang.Compilation_unit.t -> Component.Module.t =
362365
fun unit ->
363366
let id = (unit.id :> Paths.Identifier.Module.t) in
@@ -597,6 +600,9 @@ let s_fragment_type_parent : Component.Element.fragment_type_parent scope =
597600
| #Component.Element.fragment_type_parent as r -> Some r
598601
| _ -> None)
599602

603+
let s_asset : Component.Element.asset scope =
604+
make_scope (function #Component.Element.asset as r -> Some r | _ -> None)
605+
600606
let len = ref 0
601607

602608
let n = ref 0
@@ -806,6 +812,29 @@ let open_units resolver env =
806812
| _ -> env)
807813
env resolver.open_units
808814

815+
let rec collect_assets env (page : Lang.Page.t) =
816+
let env =
817+
match page.name with
818+
| { iv = `Page (Some parent, _); _ }
819+
| { iv = `LeafPage (Some parent, _); _ } -> (
820+
let parent_name = match parent.iv with `Page (_, name) -> name in
821+
match lookup_page (PageName.to_string parent_name) env with
822+
| None -> env
823+
| Some parent_page -> collect_assets env parent_page)
824+
| _ -> env
825+
in
826+
let env =
827+
List.fold_left
828+
(fun env new_asset ->
829+
let id = Identifier.Mk.asset_file (page.name, new_asset) in
830+
add_asset id env)
831+
env
832+
(List.filter_map
833+
(function Lang.Page.Asset_child c -> Some c | _ -> None)
834+
page.children)
835+
in
836+
env
837+
809838
let env_of_unit t ~linking resolver =
810839
let open Lang.Compilation_unit in
811840
let initial_env =
@@ -814,20 +843,25 @@ let env_of_unit t ~linking resolver =
814843
let env = { empty with linking } in
815844
env |> add_module (t.id :> Identifier.Path.Module.t) dm m.doc
816845
in
817-
let parent_page :> Identifier.Page.t option =
846+
let initial_env = set_resolver initial_env resolver |> open_units resolver in
847+
let initial_env =
818848
match t.id.iv with
819-
| `Root (None, _) -> None
820-
| `Root (Some parent, _) -> Some parent
849+
| `Root (None, _) -> initial_env
850+
| `Root (Some parent, _) -> (
851+
let parent_name = match parent.iv with `Page (_, name) -> name in
852+
match lookup_page (PageName.to_string parent_name) initial_env with
853+
| None -> initial_env
854+
| Some parent_page -> collect_assets initial_env parent_page)
821855
in
822-
let initial_env = { initial_env with parent_page } in
823-
set_resolver initial_env resolver |> open_units resolver
856+
initial_env
824857

825858
let open_page page env = add_docs page.Lang.Page.content env
826859

827860
let env_of_page page resolver =
828861
let initial_env = open_page page empty in
829-
let initial_env = { initial_env with parent_page = Some page.name } in
830-
set_resolver initial_env resolver |> open_units resolver
862+
let initial_env = set_resolver initial_env resolver |> open_units resolver in
863+
let initial_env = collect_assets initial_env page in
864+
initial_env
831865

832866
let env_for_reference resolver =
833867
set_resolver empty resolver |> open_units resolver
@@ -889,5 +923,3 @@ let verify_lookups env lookups =
889923
| true, Some r -> r.lookups <- LookupTypeSet.union r.lookups lookups
890924
| _ -> ());
891925
result
892-
893-
let parent_page env = env.parent_page

src/xref2/env.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ val s_label_parent : Component.Element.label_parent scope
146146

147147
val s_fragment_type_parent : Component.Element.fragment_type_parent scope
148148

149+
val s_asset : Component.Element.asset scope
150+
149151
(* val open_component_signature :
150152
Paths_types.Identifier.signature -> Component.Signature.t -> t -> t *)
151153

@@ -184,5 +186,3 @@ val len : int ref
184186
val n : int ref
185187

186188
val verify_lookups : t -> LookupTypeSet.t -> bool
187-
188-
val parent_page : t -> Identifier.Page.t option

src/xref2/ref_tools.ml

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ let ref_kind_of_element = function
7474
| `ExtensionDecl _ -> "extension-decl"
7575
| `Field _ -> "field"
7676
| `Page _ -> "page"
77+
| `Asset _ -> "asset"
7778

7879
let ref_kind_of_find = function
7980
| `FModule _ | `FModule_subst _ -> "module"
@@ -580,6 +581,10 @@ end
580581
module A = struct
581582
(** Assets *)
582583

584+
let in_env env name =
585+
env_lookup_by_name ~kind:`Asset Env.s_asset name env >>= fun (`Asset id) ->
586+
Ok (`Identifier id)
587+
583588
let rec in_page env (page : Odoc_model.Lang.Page.t) (asset_name : string) :
584589
(Reference.Resolved.Asset.t, _) result =
585590
let has_asset children asset =
@@ -854,12 +859,7 @@ let resolve_page_reference env (r : Reference.Page.t) =
854859
let resolve_asset_reference env (m : Reference.Asset.t) =
855860
match m with
856861
| `Resolved r -> Ok r
857-
| `Root (name, _) -> (
858-
match Env.parent_page env with
859-
| None -> Error (`Lookup_by_name (`Asset, name))
860-
| Some parent_page ->
861-
Page.in_env_from_id env parent_page >>= fun (_, page) ->
862-
A.in_page env page name)
862+
| `Root (name, _) -> A.in_env env name
863863
| `Dot (parent, name) ->
864864
let x =
865865
resolve_label_parent_reference env parent >>= function
@@ -878,24 +878,21 @@ let resolve_reference =
878878
match r with
879879
| `Root (name, `TUnknown) -> (
880880
let identifier id = Ok (`Identifier (id :> Identifier.t)) in
881-
match env_lookup_by_name Env.s_any name env with
882-
| Ok (`Module (_, _) as e) -> resolved (M.of_element env e)
883-
| Ok (`ModuleType (_, _) as e) -> resolved (MT.of_element env e)
884-
| Ok (`Value (id, _)) -> identifier id
885-
| Ok (`Type (id, _)) -> identifier id
886-
| Ok (`Label (id, _)) -> identifier id
887-
| Ok (`Class (id, _)) -> identifier id
888-
| Ok (`ClassType (id, _)) -> identifier id
889-
| Ok (`Constructor (id, _)) -> identifier id
890-
| Ok (`Exception (id, _)) -> identifier id
891-
| Ok (`Extension (id, _, _)) -> identifier id
892-
| Ok (`ExtensionDecl (id, _)) -> identifier id
893-
| Ok (`Field (id, _)) -> identifier id
894-
| Ok (`Page (id, _)) -> identifier id
895-
| Error _ as e -> (
896-
match resolve_asset_reference env (`Root (name, `TAsset)) with
897-
| Ok res -> resolved1 res
898-
| Error _ -> e))
881+
env_lookup_by_name Env.s_any name env >>= function
882+
| `Module (_, _) as e -> resolved (M.of_element env e)
883+
| `ModuleType (_, _) as e -> resolved (MT.of_element env e)
884+
| `Value (id, _) -> identifier id
885+
| `Type (id, _) -> identifier id
886+
| `Label (id, _) -> identifier id
887+
| `Class (id, _) -> identifier id
888+
| `ClassType (id, _) -> identifier id
889+
| `Constructor (id, _) -> identifier id
890+
| `Exception (id, _) -> identifier id
891+
| `Extension (id, _, _) -> identifier id
892+
| `ExtensionDecl (id, _) -> identifier id
893+
| `Field (id, _) -> identifier id
894+
| `Page (id, _) -> identifier id
895+
| `Asset id -> identifier id)
899896
| `Resolved r -> Ok r
900897
| `Root (name, (`TModule | `TChildModule)) -> M.in_env env name >>= resolved
901898
| `Module (parent, name) ->

0 commit comments

Comments
 (0)