Skip to content

Commit 3dae4aa

Browse files
committed
Adding reference to assets
Signed-off-by: Paul-Elliot <[email protected]>
1 parent c3d154d commit 3dae4aa

File tree

13 files changed

+152
-53
lines changed

13 files changed

+152
-53
lines changed

src/document/comment.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ module Reference = struct
8484
| `InstanceVariable (p, f) ->
8585
render_unresolved (p :> t) ^ "." ^ InstanceVariableName.to_string f
8686
| `Label (p, f) -> render_unresolved (p :> t) ^ "." ^ LabelName.to_string f
87+
| `Asset (p, f) -> render_unresolved (p :> t) ^ "." ^ AssetName.to_string f
8788

8889
(* This is the entry point. *)
8990
let to_ir : ?text:Inline.t -> Reference.t -> Inline.t =

src/model/paths_types.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ module rec Reference : sig
518518
| `TInstanceVariable
519519
| `TLabel
520520
| `TPage
521+
| `TAsset
521522
| `TChildPage
522523
| `TChildModule
523524
| `TUnknown ]
@@ -706,7 +707,8 @@ module rec Reference : sig
706707
| `ClassType of signature * ClassTypeName.t
707708
| `Method of class_signature * MethodName.t
708709
| `InstanceVariable of class_signature * InstanceVariableName.t
709-
| `Label of label_parent * LabelName.t ]
710+
| `Label of label_parent * LabelName.t
711+
| `Asset of page * AssetName.t ]
710712
(** @canonical Odoc_model.Paths.Reference.t *)
711713

712714
type asset =

src/model/reference.ml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ let match_extra_odoc_reference_kind (_location as loc) s :
7575
Some `TLabel
7676
| Some "module-type" -> Some `TModuleType
7777
| Some "page" -> Some `TPage
78+
| Some "asset" -> Some `TAsset
7879
| Some "value" ->
7980
d loc "value" "val";
8081
Some `TValue
@@ -323,6 +324,26 @@ let parse whole_reference_location s :
323324
|> Error.raise_exception)
324325
in
325326

327+
let page (kind, identifier, location) tokens : Page.t =
328+
let kind = match_reference_kind location kind in
329+
match tokens with
330+
| [] -> (
331+
match kind with
332+
| (`TUnknown | `TPage) as kind -> `Root (identifier, kind)
333+
| _ -> expected [ "page" ] location |> Error.raise_exception)
334+
| next_token :: tokens -> (
335+
match kind with
336+
| `TUnknown -> `Dot (label_parent next_token tokens, identifier)
337+
| _ ->
338+
let suggestion =
339+
Printf.sprintf "'page-%s' should be first." identifier
340+
in
341+
not_allowed ~what:"Page label"
342+
~in_what:"the last component of a reference path" ~suggestion
343+
location
344+
|> Error.raise_exception)
345+
in
346+
326347
let start_from_last_component (kind, identifier, location) old_kind tokens =
327348
let new_kind = match_reference_kind location kind in
328349
let kind =
@@ -385,6 +406,8 @@ let parse whole_reference_location s :
385406
| `TLabel ->
386407
`Label
387408
(label_parent next_token tokens, LabelName.make_std identifier)
409+
| `TAsset ->
410+
`Asset (page next_token tokens, AssetName.make_std identifier)
388411
| `TChildPage | `TChildModule ->
389412
let suggestion =
390413
Printf.sprintf "'child-%s' should be first." identifier

src/model_desc/paths_desc.ml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ module Names = struct
3434

3535
let labelname = To_string LabelName.to_string
3636

37+
let assetname = To_string AssetName.to_string
38+
3739
let pagename = To_string PageName.to_string
3840

3941
let parametername = To_string ModuleName.to_string
@@ -194,6 +196,7 @@ module General_paths = struct
194196
| `TType -> C0 "`TType"
195197
| `TUnknown -> C0 "`TUnknown"
196198
| `TValue -> C0 "`TValue"
199+
| `TAsset -> C0 "`TValue"
197200
| `TChildPage -> C0 "`TChildPage"
198201
| `TChildModule -> C0 "`TChildModule")
199202

@@ -316,7 +319,9 @@ module General_paths = struct
316319
((x1 :> r), x2),
317320
Pair (reference, Names.instancevariablename) )
318321
| `Label (x1, x2) ->
319-
C ("`Label", ((x1 :> r), x2), Pair (reference, Names.labelname)))
322+
C ("`Label", ((x1 :> r), x2), Pair (reference, Names.labelname))
323+
| `Asset (x1, x2) ->
324+
C ("`Asset", ((x1 :> r), x2), Pair (reference, Names.assetname)))
320325

321326
and resolved_reference : rr t =
322327
Variant

src/xref2/component.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,6 +1514,10 @@ module Fmt = struct
15141514
Format.fprintf ppf "%a.%s" model_reference
15151515
(parent :> t)
15161516
(LabelName.to_string name)
1517+
| `Asset (parent, name) ->
1518+
Format.fprintf ppf "%a.%s" model_reference
1519+
(parent :> t)
1520+
(AssetName.to_string name)
15171521

15181522
and model_asset_reference ppf (r : Odoc_model.Paths.Reference.Asset.t) =
15191523
let open Odoc_model.Paths.Reference in

src/xref2/env.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,7 @@ let open_page page env = add_docs page.Lang.Page.content env
816816

817817
let env_of_page page resolver =
818818
let initial_env = open_page page empty in
819+
let initial_env = { initial_env with parent_page = Some page.name } in
819820
set_resolver initial_env resolver |> open_units resolver
820821

821822
let env_for_reference resolver =

src/xref2/ref_tools.ml

Lines changed: 44 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -729,10 +729,48 @@ let resolve_reference_dot env parent name =
729729
| (`C _ | `CT _) as p -> resolve_reference_dot_class env p name
730730
| `P _ as page -> resolve_reference_dot_page env page name
731731

732+
let resolve_page_reference env (r : Reference.Page.t) =
733+
match r with
734+
| `Resolved _ -> failwith "unimplemented"
735+
| `Dot (_, name) | `Root (name, _) -> Page.in_env env name
736+
737+
let resolve_asset_reference env (m : Reference.Asset.t) =
738+
let has_asset children asset =
739+
List.exists
740+
(function
741+
| Odoc_model.Lang.Page.Asset_child a -> String.equal a asset
742+
| _ -> false)
743+
children
744+
in
745+
let rec find_in_page (page : Identifier.Page.t option) asset_name :
746+
(Reference.Resolved.Asset.t, _) result =
747+
match page with
748+
| Some page -> (
749+
match page.Identifier.iv with
750+
| `Page (parent, page)
751+
| `LeafPage (parent, page) -> (
752+
match Env.lookup_page (PageName.to_string page) env with
753+
| Some { children; name; _ } when has_asset children asset_name ->
754+
Ok (`Identifier (Identifier.Mk.asset_file (name, asset_name)))
755+
| _ ->
756+
let parent = (parent :> Identifier.Page.t option) in
757+
find_in_page parent asset_name))
758+
| None -> Error (`Lookup_by_name (`Asset, asset_name))
759+
in
760+
match m with
761+
| `Resolved r -> Ok r
762+
| `Root (name, _) -> (
763+
match Env.parent_page env with
764+
| None -> Error (`Lookup_by_name (`Asset, name))
765+
| Some parent_page -> find_in_page (Some parent_page) name)
766+
| `Asset (parent_page, name) ->
767+
resolve_page_reference env parent_page >>= fun (_, { name = p; _ }) ->
768+
find_in_page (Some p) (AssetName.to_string name)
769+
732770
(** Warnings may be generated with [Error.implicit_warning] *)
733771
let resolve_reference =
734772
let resolved = resolved3 in
735-
fun env r ->
773+
fun env (r : t) ->
736774
match r with
737775
| `Root (name, `TUnknown) -> (
738776
let identifier id = Ok (`Identifier (id :> Identifier.t)) in
@@ -803,63 +841,19 @@ let resolve_reference =
803841
resolve_class_signature_reference env parent >>= fun p ->
804842
MM.in_class_signature env p name >>= resolved1
805843
| `Root (name, `TInstanceVariable) -> MV.in_env env name >>= resolved1
844+
| (`Asset _ | `Root (_, `TAsset)) as t ->
845+
resolve_asset_reference env t >>= fun res -> Ok (res :> Resolved.t)
806846
| `InstanceVariable (parent, name) ->
807847
resolve_class_signature_reference env parent >>= fun p ->
808848
MV.in_class_signature env p name >>= resolved1
809849

810850
let resolve_module_reference env m =
811851
Odoc_model.Error.catch_warnings (fun () -> resolve_module_reference env m)
812852

813-
let resolve_reference env m =
853+
let resolve_reference :
854+
Env.t -> t -> Resolved.t ref_result Odoc_model.Error.with_warnings =
855+
fun env m ->
814856
Odoc_model.Error.catch_warnings (fun () -> resolve_reference env m)
815857

816-
let resolve_page_reference env (r : Reference.Page.t) =
817-
match r with
818-
| `Resolved _ -> failwith "unimplemented"
819-
| `Dot (_, name) | `Root (name, _) -> Page.in_env env name
820-
821-
let resolve_asset_reference env (m : Reference.Asset.t) =
822-
let has_asset children asset =
823-
List.exists
824-
(function
825-
| Odoc_model.Lang.Page.Asset_child a -> String.equal a asset
826-
| _ -> false)
827-
children
828-
in
829-
let rec find_in_page (page : Identifier.Page.t option) asset_name :
830-
(Reference.Asset.t, _) result =
831-
match page with
832-
| Some page -> (
833-
match page.Identifier.iv with
834-
| `Page (parent, page) -> (
835-
match Env.lookup_page (PageName.to_string page) env with
836-
| Some { children; name; _ } when has_asset children asset_name ->
837-
Ok
838-
(`Resolved
839-
(`Identifier (Identifier.Mk.asset_file (name, asset_name))))
840-
| _ ->
841-
let parent = (parent :> Identifier.Page.t option) in
842-
find_in_page parent asset_name)
843-
| `LeafPage (parent, page) -> (
844-
match Env.lookup_page (PageName.to_string page) env with
845-
| Some { children; name; _ } when has_asset children asset_name ->
846-
Ok
847-
(`Resolved
848-
(`Identifier (Identifier.Mk.asset_file (name, asset_name))))
849-
| _ ->
850-
let parent = (parent :> Identifier.Page.t option) in
851-
find_in_page parent asset_name))
852-
| None -> Error (`Lookup_by_name (`Asset, asset_name))
853-
in
854-
match m with
855-
| `Resolved _ as r -> Ok r
856-
| `Root (name, _) -> (
857-
match Env.parent_page env with
858-
| None -> Error (`Lookup_by_name (`Asset, name))
859-
| Some parent_page -> find_in_page (Some parent_page) name)
860-
| `Asset (parent_page, name) ->
861-
resolve_page_reference env parent_page >>= fun (_, { name = p; _ }) ->
862-
find_in_page (Some p) (AssetName.to_string name)
863-
864858
let resolve_asset_reference env m =
865859
Odoc_model.Error.catch_warnings (fun () -> resolve_asset_reference env m)

src/xref2/ref_tools.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ val resolve_reference :
1515
Env.t -> t -> Resolved.t ref_result Odoc_model.Error.with_warnings
1616

1717
val resolve_asset_reference :
18-
Env.t -> Asset.t -> Asset.t ref_result Odoc_model.Error.with_warnings
18+
Env.t -> Asset.t -> Resolved.Asset.t ref_result Odoc_model.Error.with_warnings
Binary file not shown.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{0 Package page}
2+
3+
A {{!asset-"caml.gif"}reference} to an asset.
4+
5+
And a reference using a page parent: {!page-other_page.asset-"caml_not.gif"}

0 commit comments

Comments
 (0)