Skip to content

Commit 7bdcca4

Browse files
committed
substitutions on first class modules (fix ocaml/odoc#75)
1 parent a57d068 commit 7bdcca4

File tree

3 files changed

+44
-15
lines changed

3 files changed

+44
-15
lines changed

src/html_tree.ml

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -124,24 +124,24 @@ module Relative_link = struct
124124
| "" -> suffix
125125
| _ -> prefix ^ "." ^ suffix
126126

127-
let rec _render_raw : type a. (_, _) Identifier.t -> (_, a, _) Fragment.raw -> string =
128-
fun id fragment ->
127+
let rec render_raw : type a. (_, a, _) Fragment.raw -> string =
128+
fun fragment ->
129129
let open Fragment in
130130
match fragment with
131-
| Resolved rr -> render_resolved id rr
132-
| Dot (prefix, suffix) -> dot (_render_raw id prefix) suffix
131+
| Resolved rr -> render_resolved rr
132+
| Dot (prefix, suffix) -> dot (render_raw prefix) suffix
133133

134-
and render_resolved : type a. (_, _) Identifier.t -> (_, a, _) Fragment.Resolved.raw -> string =
135-
fun id fragment ->
134+
and render_resolved : type a. (_, a, _) Fragment.Resolved.raw -> string =
135+
fun fragment ->
136136
let open Fragment.Resolved in
137137
match fragment with
138138
| Root -> ""
139-
| Subst (_, rr) -> render_resolved id (any_sort rr)
140-
| SubstAlias (_, rr) -> render_resolved id (any_sort rr)
141-
| Module (rr, s) -> dot (render_resolved id rr) s
142-
| Type (rr, s) -> dot (render_resolved id rr) s
143-
| Class (rr, s) -> dot (render_resolved id rr) s
144-
| ClassType (rr, s) -> dot (render_resolved id rr) s
139+
| Subst (_, rr) -> render_resolved (any_sort rr)
140+
| SubstAlias (_, rr) -> render_resolved (any_sort rr)
141+
| Module (rr, s) -> dot (render_resolved rr) s
142+
| Type (rr, s) -> dot (render_resolved rr) s
143+
| Class (rr, s) -> dot (render_resolved rr) s
144+
| ClassType (rr, s) -> dot (render_resolved rr) s
145145

146146
let rec to_html : type a. get_package:('b -> string) -> stop_before:bool ->
147147
_ Identifier.signature -> ('b, a, _) Fragment.raw -> _ =
@@ -159,7 +159,7 @@ module Relative_link = struct
159159
end
160160
| Resolved rr ->
161161
let id = Resolved.identifier id (Obj.magic rr : (_, a) Resolved.t) in
162-
let txt = render_resolved id rr in
162+
let txt = render_resolved rr in
163163
begin match Id.href ~get_package ~stop_before id with
164164
| href ->
165165
[ a ~a:[ a_href href ] [ pcdata txt ] ]
@@ -192,6 +192,8 @@ module Relative_link = struct
192192
a_href (prefix ^ name ^ (if !semantic_uris then "" else "/index.html"))
193193
end
194194

195+
let render_fragment = Relative_link.Of_fragment.render_raw
196+
195197
class page_creator ?kind ~path content =
196198
let rec add_dotdot ~n acc =
197199
if n = 0 then

src/html_tree.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ module Relative_link : sig
9090
val to_sub_element : kind:kind -> string -> [> `Href ] attrib
9191
end
9292

93+
val render_fragment : (_, _, Fragment.sort) Fragment.raw -> string
94+
9395
(* TODO: move to a centralized [State] module or something. Along with
9496
Relative_link.semantic_uris. *)
9597
val open_details : bool ref

src/to_html_tree.ml

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -747,9 +747,34 @@ and type_expr
747747
| Poly (polyvars, t) ->
748748
pcdata (String.concat ~sep:" " polyvars ^ ". ") :: type_expr ~get_package t
749749
| Package pkg ->
750-
(* CR trefis: TODO substitutions *)
751750
pcdata "(" :: Markup.keyword "module " ::
752-
Html_tree.Relative_link.of_path ~stop_before:false ~get_package pkg.path @ [pcdata ")"]
751+
Html_tree.Relative_link.of_path ~stop_before:false ~get_package pkg.path @
752+
begin match pkg.substitutions with
753+
| [] -> []
754+
| lst ->
755+
pcdata " " :: Markup.keyword "with" :: pcdata " " ::
756+
list_concat_map ~sep:(Markup.keyword " and ") lst
757+
~f:(package_subst ~get_package pkg.path)
758+
end
759+
@ [pcdata ")"]
760+
761+
and package_subst
762+
: 'inner 'outer. get_package:('a -> string)
763+
-> 'a Path.module_type -> 'a Fragment.type_ * 'a Types.TypeExpr.t
764+
-> ('inner, 'outer) text elt list
765+
= fun ~get_package pkg_path (frag_typ, te) ->
766+
Markup.keyword "type " ::
767+
(match pkg_path with
768+
| Path.Resolved rp ->
769+
let base =
770+
Identifier.signature_of_module_type (Path.Resolved.identifier rp)
771+
in
772+
Html_tree.Relative_link.of_fragment ~get_package ~base
773+
(Fragment.any_sort frag_typ)
774+
| _ ->
775+
[ pcdata (Html_tree.render_fragment (Fragment.any_sort frag_typ)) ]) @
776+
pcdata " " :: Markup.keyword "=" :: pcdata " " ::
777+
type_expr ~get_package te
753778

754779
and value ~get_package (t : _ Types.Value.t) =
755780
let name = Identifier.name t.id in

0 commit comments

Comments
 (0)