summaryrefslogtreecommitdiffstats
path: root/ocamldoc/odoc_cross.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocamldoc/odoc_cross.ml')
-rw-r--r--ocamldoc/odoc_cross.ml68
1 files changed, 68 insertions, 0 deletions
diff --git a/ocamldoc/odoc_cross.ml b/ocamldoc/odoc_cross.ml
index 70c3c0eb2..28e6ae5bf 100644
--- a/ocamldoc/odoc_cross.ml
+++ b/ocamldoc/odoc_cross.ml
@@ -15,6 +15,7 @@
module Name = Odoc_name
open Odoc_module
open Odoc_class
+open Odoc_extension
open Odoc_exception
open Odoc_types
open Odoc_value
@@ -60,6 +61,7 @@ module P_alias =
let p_recfield _ _ _ = false
let p_const _ _ _ = false
let p_type t _ = (false, false)
+ let p_extension x _ = x.xt_alias <> None
let p_exception e _ = e.ex_alias <> None
let p_attribute a _ = false
let p_method m _ = false
@@ -79,6 +81,9 @@ let (module_aliases : (Name.t, Name.t * alias_state) Hashtbl.t) = Hashtbl.create
(** Couples of module or module type name aliases. *)
let module_and_modtype_aliases = Hashtbl.create 13;;
+(** Couples of extension name aliases. *)
+let extension_aliases = Hashtbl.create 13;;
+
(** Couples of exception name aliases. *)
let exception_aliases = Hashtbl.create 13;;
@@ -102,6 +107,15 @@ let rec build_alias_list = function
| _ -> ()
);
build_alias_list q
+ | (Odoc_search.Res_extension x) :: q ->
+ (
+ match x.xt_alias with
+ None -> ()
+ | Some xa ->
+ Hashtbl.add extension_aliases
+ x.xt_name (xa.xa_name,Alias_to_resolve)
+ );
+ build_alias_list q
| (Odoc_search.Res_exception e) :: q ->
(
match e.ex_alias with
@@ -119,6 +133,7 @@ let rec build_alias_list = function
let get_alias_names module_list =
Hashtbl.clear module_aliases;
Hashtbl.clear module_and_modtype_aliases;
+ Hashtbl.clear extension_aliases;
Hashtbl.clear exception_aliases;
build_alias_list (Search_alias.search module_list 0)
@@ -183,6 +198,7 @@ let kind_name_exists kind =
| RK_class_type -> (fun e -> match e with Odoc_search.Res_class_type _ -> true | _ -> false)
| RK_value -> (fun e -> match e with Odoc_search.Res_value _ -> true | _ -> false)
| RK_type -> (fun e -> match e with Odoc_search.Res_type _ -> true | _ -> false)
+ | RK_extension -> (fun e -> match e with Odoc_search.Res_extension _ -> true | _ -> false)
| RK_exception -> (fun e -> match e with Odoc_search.Res_exception _ -> true | _ -> false)
| RK_attribute -> (fun e -> match e with Odoc_search.Res_attribute _ -> true | _ -> false)
| RK_method -> (fun e -> match e with Odoc_search.Res_method _ -> true | _ -> false)
@@ -200,6 +216,7 @@ let class_exists = kind_name_exists RK_class
let class_type_exists = kind_name_exists RK_class_type
let value_exists = kind_name_exists RK_value
let type_exists = kind_name_exists RK_type
+let extension_exists = kind_name_exists RK_extension
let exception_exists = kind_name_exists RK_exception
let attribute_exists = kind_name_exists RK_attribute
let method_exists = kind_name_exists RK_method
@@ -238,6 +255,14 @@ let lookup_class_type name =
| Odoc_search.Res_class_type c -> c
| _ -> assert false
+let lookup_extension name =
+ match List.find
+ (fun k -> match k with Odoc_search.Res_extension _ -> true | _ -> false)
+ (get_known_elements name)
+ with
+ | Odoc_search.Res_extension x -> x
+ | _ -> assert false
+
let lookup_exception name =
match List.find
(fun k -> match k with Odoc_search.Res_exception _ -> true | _ -> false)
@@ -262,6 +287,8 @@ class scan =
method! scan_type_pre t =
add_known_element t.ty_name (Odoc_search.Res_type t);
true
+ method! scan_extension_constructor x =
+ add_known_element x.xt_name (Odoc_search.Res_extension x)
method! scan_exception e =
add_known_element e.ex_name (Odoc_search.Res_exception e)
method! scan_attribute a =
@@ -298,6 +325,7 @@ type not_found_name =
| NF_c of Name.t
| NF_ct of Name.t
| NF_cct of Name.t
+ | NF_xt of Name.t
| NF_ex of Name.t
(** Functions to find and associate aliases elements. *)
@@ -466,6 +494,7 @@ and associate_in_module_element module_list m_name (acc_b_modif, acc_incomplete_
| Element_class cl -> associate_in_class module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) cl
| Element_class_type ct -> associate_in_class_type module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) ct
| Element_value _ -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found)
+ | Element_type_extension te -> associate_in_type_extension module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) te
| Element_exception ex ->
(
match ex.ex_alias with
@@ -617,6 +646,29 @@ and associate_in_class_type module_list (acc_b_modif, acc_incomplete_top_module_
in
iter_kind (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) ct.clt_kind
+and associate_in_type_extension module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) te =
+ List.fold_left
+ (fun (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) xt ->
+ match xt.xt_alias with
+ None -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found)
+ | Some xa ->
+ match xa.xa_xt with
+ Some _ ->
+ (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found)
+ | None ->
+ let xt_opt =
+ try Some (lookup_extension xa.xa_name)
+ with Not_found -> None
+ in
+ match xt_opt with
+ None -> (acc_b_modif, (Name.head xt.xt_name) :: acc_incomplete_top_module_names, (NF_xt xa.xa_name) :: acc_names_not_found)
+ | Some x ->
+ xa.xa_xt <- Some x ;
+ (true, acc_incomplete_top_module_names, acc_names_not_found))
+ (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found)
+ te.te_constructors
+
+
(*************************************************************)
(** Association of types to elements referenced in comments .*)
@@ -630,6 +682,7 @@ let not_found_of_kind kind name =
| RK_class_type -> Odoc_messages.cross_class_type_not_found
| RK_value -> Odoc_messages.cross_value_not_found
| RK_type -> Odoc_messages.cross_type_not_found
+ | RK_extension -> Odoc_messages.cross_extension_not_found
| RK_exception -> Odoc_messages.cross_exception_not_found
| RK_attribute -> Odoc_messages.cross_attribute_not_found
| RK_method -> Odoc_messages.cross_method_not_found
@@ -687,6 +740,7 @@ let rec assoc_comments_text_elements parent_name module_list t_ele =
| Odoc_search.Res_class_type ct -> (ct.clt_name, RK_class_type)
| Odoc_search.Res_value v -> (v.val_name, RK_value)
| Odoc_search.Res_type t -> (t.ty_name, RK_type)
+ | Odoc_search.Res_extension x -> (x.xt_name, RK_extension)
| Odoc_search.Res_exception e -> (e.ex_name, RK_exception)
| Odoc_search.Res_attribute a -> (a.att_value.val_name, RK_attribute)
| Odoc_search.Res_method m -> (m.met_value.val_name, RK_method)
@@ -747,6 +801,7 @@ let rec assoc_comments_text_elements parent_name module_list t_ele =
| RK_class_type -> class_type_exists
| RK_value -> value_exists
| RK_type -> type_exists
+ | RK_extension -> extension_exists
| RK_exception -> exception_exists
| RK_attribute -> attribute_exists
| RK_method -> method_exists
@@ -817,6 +872,8 @@ let rec assoc_comments_module_element parent_name module_list m_ele =
Element_class_type (assoc_comments_class_type module_list ct)
| Element_value v ->
Element_value (assoc_comments_value module_list v)
+ | Element_type_extension te ->
+ Element_type_extension (assoc_comments_type_extension parent_name module_list te)
| Element_exception e ->
Element_exception (assoc_comments_exception module_list e)
| Element_type t ->
@@ -938,6 +995,15 @@ and assoc_comments_value module_list v =
assoc_comments_parameter_list parent module_list v.val_parameters;
v
+and assoc_comments_extension_constructor module_list x =
+ let parent = Name.father x.xt_name in
+ x.xt_text <- ao (assoc_comments_info parent module_list) x.xt_text
+
+and assoc_comments_type_extension parent_name module_list te =
+ te.te_info <- ao (assoc_comments_info parent_name module_list) te.te_info;
+ List.iter (assoc_comments_extension_constructor module_list) te.te_constructors;
+ te
+
and assoc_comments_exception module_list e =
let parent = Name.father e.ex_name in
e.ex_info <- ao (assoc_comments_info parent module_list) e.ex_info ;
@@ -956,6 +1022,7 @@ and assoc_comments_type module_list t =
List.iter
(fun rf -> rf.rf_text <- ao (assoc_comments_info parent module_list) rf.rf_text)
fl
+ | Type_open -> ()
);
t
@@ -1018,6 +1085,7 @@ let associate module_list =
| NF_c n -> Odoc_messages.cross_class_not_found n
| NF_ct n -> Odoc_messages.cross_class_type_not_found n
| NF_cct n -> Odoc_messages.cross_class_or_class_type_not_found n
+ | NF_xt n -> Odoc_messages.cross_extension_not_found n
| NF_ex n -> Odoc_messages.cross_exception_not_found n
);
)