@@ -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] *)
733771let 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
810850let 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-
864858let resolve_asset_reference env m =
865859 Odoc_model.Error. catch_warnings (fun () -> resolve_asset_reference env m)
0 commit comments