Skip to content

Commit c3d154d

Browse files
committed
Resolve asset references
There is no way to reference an asset in the odoc language yet, but we can already resolve them. Signed-off-by: Paul-Elliot <[email protected]>
1 parent 5ac1ffc commit c3d154d

File tree

12 files changed

+124
-2
lines changed

12 files changed

+124
-2
lines changed

src/model/names.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,4 @@ module LabelName = SimpleName
143143
module PageName = SimpleName
144144
module DefName = SimpleName
145145
module LocalName = SimpleName
146+
module AssetName = SimpleName

src/model/names.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,5 @@ module PageName : SimpleName
9999
module DefName : SimpleName
100100

101101
module LocalName : SimpleName
102+
103+
module AssetName : SimpleName

src/model/paths.ml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,10 @@ module Reference = struct
935935
module Page = struct
936936
type t = Paths_types.Resolved_reference.page
937937
end
938+
939+
module Asset = struct
940+
type t = Paths_types.Resolved_reference.asset
941+
end
938942
end
939943

940944
type t = Paths_types.Reference.any
@@ -1016,4 +1020,8 @@ module Reference = struct
10161020
module Page = struct
10171021
type t = Paths_types.Reference.page
10181022
end
1023+
1024+
module Asset = struct
1025+
type t = Paths_types.Reference.asset
1026+
end
10191027
end

src/model/paths.mli

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,10 @@ module rec Reference : sig
507507
type t = Paths_types.Resolved_reference.page
508508
end
509509

510+
module Asset : sig
511+
type t = Paths_types.Resolved_reference.asset
512+
end
513+
510514
type t = Paths_types.Resolved_reference.any
511515

512516
val identifier : t -> Identifier.t
@@ -588,6 +592,10 @@ module rec Reference : sig
588592
type t = Paths_types.Reference.page
589593
end
590594

595+
module Asset : sig
596+
type t = Paths_types.Reference.asset
597+
end
598+
591599
type t = Paths_types.Reference.any
592600

593601
type tag_any = Paths_types.Reference.tag_any

src/model/paths_types.ml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,8 @@ module Identifier = struct
290290
type reference_label = label
291291

292292
type reference_page = page
293+
294+
type reference_asset = asset_file
293295
end
294296

295297
module rec Path : sig
@@ -706,6 +708,12 @@ module rec Reference : sig
706708
| `InstanceVariable of class_signature * InstanceVariableName.t
707709
| `Label of label_parent * LabelName.t ]
708710
(** @canonical Odoc_model.Paths.Reference.t *)
711+
712+
type asset =
713+
[ `Resolved of Resolved_reference.asset
714+
| `Root of string * [ `TAsset ]
715+
| `Asset of page * AssetName.t ]
716+
(** @canonical Odoc_model.Paths.Reference.Asset.t *)
709717
end =
710718
Reference
711719

@@ -859,5 +867,8 @@ and Resolved_reference : sig
859867
| `InstanceVariable of class_signature * InstanceVariableName.t
860868
| `Label of label_parent * LabelName.t ]
861869
(** @canonical Odoc_model.Paths.Reference.Resolved.t *)
870+
871+
type asset = [ `Identifier of Identifier.reference_asset ]
872+
(** @canonical Odoc_model.Paths.Reference.Resolved.Asset.t *)
862873
end =
863874
Resolved_reference

src/xref2/component.ml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,11 @@ module Fmt = struct
14501450
(parent :> t)
14511451
(LabelName.to_string name)
14521452

1453+
and model_resolved_asset_reference ppf
1454+
(`Identifier id : Odoc_model.Paths.Reference.Resolved.Asset.t) =
1455+
Format.fprintf ppf "%a" model_identifier
1456+
(id :> Odoc_model.Paths.Identifier.t)
1457+
14531458
and model_reference ppf (r : Odoc_model.Paths.Reference.t) =
14541459
let open Odoc_model.Paths.Reference in
14551460
match r with
@@ -1509,6 +1514,17 @@ module Fmt = struct
15091514
Format.fprintf ppf "%a.%s" model_reference
15101515
(parent :> t)
15111516
(LabelName.to_string name)
1517+
1518+
and model_asset_reference ppf (r : Odoc_model.Paths.Reference.Asset.t) =
1519+
let open Odoc_model.Paths.Reference in
1520+
match r with
1521+
| `Resolved r' ->
1522+
Format.fprintf ppf "r(%a)" model_resolved_asset_reference r'
1523+
| `Root (name, _) -> Format.fprintf ppf "unresolvedroot(%s)" name
1524+
| `Asset (parent, name) ->
1525+
Format.fprintf ppf "%a.%s" model_reference
1526+
(parent :> t)
1527+
(AssetName.to_string name)
15121528
end
15131529

15141530
module LocalIdents = struct

src/xref2/component.mli

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,13 @@ module Fmt : sig
623623
val model_resolved_reference :
624624
Format.formatter -> Odoc_model.Paths.Reference.Resolved.t -> unit
625625

626+
val model_resolved_asset_reference :
627+
Format.formatter -> Odoc_model.Paths.Reference.Resolved.Asset.t -> unit
628+
626629
val model_reference : Format.formatter -> Odoc_model.Paths.Reference.t -> unit
630+
631+
val model_asset_reference :
632+
Format.formatter -> Odoc_model.Paths.Reference.Asset.t -> unit
627633
end
628634

629635
module Of_Lang : sig

src/xref2/env.ml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ type t = {
163163
resolver : resolver option;
164164
recorder : recorder option;
165165
fragmentroot : (int * Component.Signature.t) option;
166+
parent_page : Identifier.Page.t option; (** parent page *)
166167
}
167168

168169
let is_linking env = env.linking
@@ -199,6 +200,7 @@ let empty =
199200
recorder = None;
200201
ambiguous_labels = Identifier.Maps.Label.empty;
201202
fragmentroot = None;
203+
parent_page = None;
202204
}
203205

204206
let add_fragment_root sg env =
@@ -802,6 +804,12 @@ let env_of_unit t ~linking resolver =
802804
let env = { empty with linking } in
803805
env |> add_module (t.id :> Identifier.Path.Module.t) dm m.doc
804806
in
807+
let parent_page :> Identifier.Page.t option =
808+
match t.id.iv with
809+
| `Root (None, _) -> None
810+
| `Root (Some parent, _) -> Some parent
811+
in
812+
let initial_env = { initial_env with parent_page } in
805813
set_resolver initial_env resolver |> open_units resolver
806814

807815
let open_page page env = add_docs page.Lang.Page.content env
@@ -870,3 +878,5 @@ let verify_lookups env lookups =
870878
| true, Some r -> r.lookups <- LookupTypeSet.union r.lookups lookups
871879
| _ -> ());
872880
result
881+
882+
let parent_page env = env.parent_page

src/xref2/env.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,5 @@ val len : int ref
178178
val n : int ref
179179

180180
val verify_lookups : t -> LookupTypeSet.t -> bool
181+
182+
val parent_page : t -> Identifier.Page.t option

src/xref2/errors.ml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ module Tools_error = struct
99
[ `Module of Cpath.module_ ]
1010
(* Failed to resolve a module path when applying a fragment item *) ]
1111

12-
type reference_kind = [ `S | `T | `C | `CT | `Page | `Cons | `Field | `Label ]
12+
type reference_kind =
13+
[ `S | `T | `C | `CT | `Page | `Cons | `Field | `Label | `Asset ]
1314

1415
type expansion_of_module_error =
1516
[ `OpaqueModule (* The module does not have an expansion *)
@@ -115,6 +116,7 @@ module Tools_error = struct
115116
| `Cons -> "constructor"
116117
| `Field -> "field"
117118
| `Label -> "label"
119+
| `Asset -> "asset"
118120
in
119121
Format.pp_print_string fmt k
120122

@@ -291,7 +293,8 @@ type what =
291293
| `Module_type_u_expr of Component.ModuleType.U.expr
292294
| `Child_module of string
293295
| `Child_page of string
294-
| `Reference of Reference.t ]
296+
| `Reference of Reference.t
297+
| `Asset_reference of Reference.Asset.t ]
295298

296299
let report ~(what : what) ?tools_error action =
297300
let action =
@@ -340,6 +343,7 @@ let report ~(what : what) ?tools_error action =
340343
| `Child_module rf -> r "child module" Astring.String.pp rf
341344
| `Child_page rf -> r "child page" Astring.String.pp rf
342345
| `Reference ref -> r "reference" model_reference ref
346+
| `Asset_reference ref -> r "asset reference" model_asset_reference ref
343347
in
344348
match kind_of_error ~what tools_error with
345349
| Some (`Root name) -> Lookup_failures.report_root ~name

0 commit comments

Comments
 (0)