summaryrefslogtreecommitdiffstats
path: root/ocamldoc/odoc_ast.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocamldoc/odoc_ast.ml')
-rw-r--r--ocamldoc/odoc_ast.ml2144
1 files changed, 1072 insertions, 1072 deletions
diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml
index 466fc6e71..c10d771e6 100644
--- a/ocamldoc/odoc_ast.ml
+++ b/ocamldoc/odoc_ast.ml
@@ -43,15 +43,15 @@ let simple_blank = "[ \013\009\012]"
module Typedtree_search =
struct
type ele =
- | M of string
- | MT of string
- | T of string
- | C of string
- | CT of string
- | E of string
- | ER of string
- | P of string
- | IM of string
+ | M of string
+ | MT of string
+ | T of string
+ | C of string
+ | CT of string
+ | E of string
+ | ER of string
+ | P of string
+ | IM of string
type tab = (ele, Typedtree.structure_item) Hashtbl.t
type tab_values = (Odoc_module.Name.t, Typedtree.pattern * Typedtree.expression) Hashtbl.t
@@ -65,45 +65,45 @@ module Typedtree_search =
let add_to_hashes table table_values tt =
match tt with
| Typedtree.Tstr_module (ident, _) ->
- Hashtbl.add table (M (Name.from_ident ident)) tt
- | Typedtree.Tstr_modtype (ident, _) ->
- Hashtbl.add table (MT (Name.from_ident ident)) tt
- | Typedtree.Tstr_exception (ident, _) ->
- Hashtbl.add table (E (Name.from_ident ident)) tt
- | Typedtree.Tstr_exn_rebind (ident, _) ->
- Hashtbl.add table (ER (Name.from_ident ident)) tt
- | Typedtree.Tstr_type ident_type_decl_list ->
- List.iter
- (fun (id, e) ->
- Hashtbl.add table (T (Name.from_ident id))
- (Typedtree.Tstr_type [(id,e)]))
- ident_type_decl_list
- | Typedtree.Tstr_class info_list ->
- List.iter
- (fun ((id,_,_,_) as ci) ->
- Hashtbl.add table (C (Name.from_ident id))
- (Typedtree.Tstr_class [ci]))
- info_list
- | Typedtree.Tstr_cltype info_list ->
- List.iter
- (fun ((id,_) as ci) ->
- Hashtbl.add table
- (CT (Name.from_ident id))
- (Typedtree.Tstr_cltype [ci]))
- info_list
- | Typedtree.Tstr_value (_, pat_exp_list) ->
- List.iter
- (fun (pat,exp) ->
- match iter_val_pattern pat.Typedtree.pat_desc with
- None -> ()
- | Some n -> Hashtbl.add table_values n (pat,exp)
- )
- pat_exp_list
- | Typedtree.Tstr_primitive (ident, _) ->
- Hashtbl.add table (P (Name.from_ident ident)) tt
- | Typedtree.Tstr_open _ -> ()
- | Typedtree.Tstr_include _ -> ()
- | Typedtree.Tstr_eval _ -> ()
+ Hashtbl.add table (M (Name.from_ident ident)) tt
+ | Typedtree.Tstr_modtype (ident, _) ->
+ Hashtbl.add table (MT (Name.from_ident ident)) tt
+ | Typedtree.Tstr_exception (ident, _) ->
+ Hashtbl.add table (E (Name.from_ident ident)) tt
+ | Typedtree.Tstr_exn_rebind (ident, _) ->
+ Hashtbl.add table (ER (Name.from_ident ident)) tt
+ | Typedtree.Tstr_type ident_type_decl_list ->
+ List.iter
+ (fun (id, e) ->
+ Hashtbl.add table (T (Name.from_ident id))
+ (Typedtree.Tstr_type [(id,e)]))
+ ident_type_decl_list
+ | Typedtree.Tstr_class info_list ->
+ List.iter
+ (fun ((id,_,_,_) as ci) ->
+ Hashtbl.add table (C (Name.from_ident id))
+ (Typedtree.Tstr_class [ci]))
+ info_list
+ | Typedtree.Tstr_cltype info_list ->
+ List.iter
+ (fun ((id,_) as ci) ->
+ Hashtbl.add table
+ (CT (Name.from_ident id))
+ (Typedtree.Tstr_cltype [ci]))
+ info_list
+ | Typedtree.Tstr_value (_, pat_exp_list) ->
+ List.iter
+ (fun (pat,exp) ->
+ match iter_val_pattern pat.Typedtree.pat_desc with
+ None -> ()
+ | Some n -> Hashtbl.add table_values n (pat,exp)
+ )
+ pat_exp_list
+ | Typedtree.Tstr_primitive (ident, _) ->
+ Hashtbl.add table (P (Name.from_ident ident)) tt
+ | Typedtree.Tstr_open _ -> ()
+ | Typedtree.Tstr_include _ -> ()
+ | Typedtree.Tstr_eval _ -> ()
let tables typedtree =
let t = Hashtbl.create 13 in
@@ -113,8 +113,8 @@ module Typedtree_search =
let search_module table name =
match Hashtbl.find table (M name) with
- (Typedtree.Tstr_module (_, module_expr)) -> module_expr
- | _ -> assert false
+ (Typedtree.Tstr_module (_, module_expr)) -> module_expr
+ | _ -> assert false
let search_module_type table name =
match Hashtbl.find table (MT name) with
@@ -129,69 +129,69 @@ module Typedtree_search =
let search_exception_rebind table name =
match Hashtbl.find table (ER name) with
| (Typedtree.Tstr_exn_rebind (_, p)) -> p
- | _ -> assert false
+ | _ -> assert false
let search_type_declaration table name =
match Hashtbl.find table (T name) with
| (Typedtree.Tstr_type [(_,decl)]) -> decl
- | _ -> assert false
+ | _ -> assert false
let search_class_exp table name =
match Hashtbl.find table (C name) with
| (Typedtree.Tstr_class [(_,_,_,ce)]) ->
- (
- try
- let type_decl = search_type_declaration table name in
- (ce, type_decl.Types.type_params)
- with
- Not_found ->
- (ce, [])
- )
- | _ -> assert false
+ (
+ try
+ let type_decl = search_type_declaration table name in
+ (ce, type_decl.Types.type_params)
+ with
+ Not_found ->
+ (ce, [])
+ )
+ | _ -> assert false
let search_class_type_declaration table name =
match Hashtbl.find table (CT name) with
| (Typedtree.Tstr_cltype [(_,cltype_decl)]) -> cltype_decl
- | _ -> assert false
+ | _ -> assert false
let search_value table name = Hashtbl.find table name
let search_primitive table name =
match Hashtbl.find table (P name) with
- Tstr_primitive (ident, val_desc) -> val_desc.Types.val_type
- | _ -> assert false
+ Tstr_primitive (ident, val_desc) -> val_desc.Types.val_type
+ | _ -> assert false
let get_nth_inherit_class_expr cls n =
let rec iter cpt = function
- | [] ->
- raise Not_found
- | Typedtree.Cf_inher (clexp, _, _) :: q ->
- if n = cpt then clexp else iter (cpt+1) q
- | _ :: q ->
- iter cpt q
+ | [] ->
+ raise Not_found
+ | Typedtree.Cf_inher (clexp, _, _) :: q ->
+ if n = cpt then clexp else iter (cpt+1) q
+ | _ :: q ->
+ iter cpt q
in
iter 0 cls.Typedtree.cl_field
let search_attribute_type cls name =
let rec iter = function
- | [] ->
- raise Not_found
- | Typedtree.Cf_val (_, ident, exp) :: q
- when Name.from_ident ident = name ->
- exp.Typedtree.exp_type
- | _ :: q ->
- iter q
+ | [] ->
+ raise Not_found
+ | Typedtree.Cf_val (_, ident, exp) :: q
+ when Name.from_ident ident = name ->
+ exp.Typedtree.exp_type
+ | _ :: q ->
+ iter q
in
iter cls.Typedtree.cl_field
let search_method_expression cls name =
let rec iter = function
- | [] ->
- raise Not_found
- | Typedtree.Cf_meth (label, exp) :: q when label = name ->
- exp
- | _ :: q ->
- iter q
+ | [] ->
+ raise Not_found
+ | Typedtree.Cf_meth (label, exp) :: q when label = name ->
+ exp
+ | _ :: q ->
+ iter q
in
iter cls.Typedtree.cl_field
end
@@ -230,42 +230,42 @@ module Analyser =
*)
let tt_param_info_from_pattern env f_desc pat =
let rec iter_pattern pat =
- match pat.pat_desc with
- Typedtree.Tpat_var ident ->
- let name = Name.from_ident ident in
- Simple_name { sn_name = name ;
- sn_text = f_desc name ;
- sn_type = Odoc_env.subst_type env pat.pat_type
- }
-
- | Typedtree.Tpat_alias (pat, _) ->
- iter_pattern pat
-
- | Typedtree.Tpat_tuple patlist ->
- Tuple
- (List.map iter_pattern patlist,
- Odoc_env.subst_type env pat.pat_type)
-
- | Typedtree.Tpat_construct (cons_desc, _) when
- (* we give a name to the parameter only if it unit *)
- (match cons_desc.cstr_res.desc with
- Tconstr (p, _, _) ->
- Path.same p Predef.path_unit
- | _ ->
- false)
- ->
- (* a () argument, it never has description *)
- Simple_name { sn_name = "()" ;
- sn_text = None ;
- sn_type = Odoc_env.subst_type env pat.pat_type
- }
-
- | _ ->
+ match pat.pat_desc with
+ Typedtree.Tpat_var ident ->
+ let name = Name.from_ident ident in
+ Simple_name { sn_name = name ;
+ sn_text = f_desc name ;
+ sn_type = Odoc_env.subst_type env pat.pat_type
+ }
+
+ | Typedtree.Tpat_alias (pat, _) ->
+ iter_pattern pat
+
+ | Typedtree.Tpat_tuple patlist ->
+ Tuple
+ (List.map iter_pattern patlist,
+ Odoc_env.subst_type env pat.pat_type)
+
+ | Typedtree.Tpat_construct (cons_desc, _) when
+ (* we give a name to the parameter only if it unit *)
+ (match cons_desc.cstr_res.desc with
+ Tconstr (p, _, _) ->
+ Path.same p Predef.path_unit
+ | _ ->
+ false)
+ ->
+ (* a () argument, it never has description *)
+ Simple_name { sn_name = "()" ;
+ sn_text = None ;
+ sn_type = Odoc_env.subst_type env pat.pat_type
+ }
+
+ | _ ->
(* implicit pattern matching -> anonymous parameter *)
- Simple_name { sn_name = "()" ;
- sn_text = None ;
- sn_type = Odoc_env.subst_type env pat.pat_type
- }
+ Simple_name { sn_name = "()" ;
+ sn_text = None ;
+ sn_type = Odoc_env.subst_type env pat.pat_type
+ }
in
iter_pattern pat
@@ -273,119 +273,119 @@ module Analyser =
the (pattern, expression) structures encountered. *)
let rec tt_analyse_function_parameters env current_comment_opt pat_exp_list =
match pat_exp_list with
- [] ->
- (* This case means we have a 'function' without pattern, that's impossible *)
- raise (Failure "tt_analyse_function_parameters: 'function' without pattern")
+ [] ->
+ (* This case means we have a 'function' without pattern, that's impossible *)
+ raise (Failure "tt_analyse_function_parameters: 'function' without pattern")
- | (pattern_param, exp) :: second_ele :: q ->
+ | (pattern_param, exp) :: second_ele :: q ->
(* implicit pattern matching -> anonymous parameter and no more parameter *)
- (* A VOIR : le label ? *)
- let parameter = Odoc_parameter.Tuple ([], Odoc_env.subst_type env pattern_param.pat_type) in
- [ parameter ]
+ (* A VOIR : le label ? *)
+ let parameter = Odoc_parameter.Tuple ([], Odoc_env.subst_type env pattern_param.pat_type) in
+ [ parameter ]
| (pattern_param, func_body) :: [] ->
- let parameter =
- tt_param_info_from_pattern
- env
- (Odoc_parameter.desc_from_info_opt current_comment_opt)
- pattern_param
+ let parameter =
+ tt_param_info_from_pattern
+ env
+ (Odoc_parameter.desc_from_info_opt current_comment_opt)
+ pattern_param
- in
+ in
(* For optional parameters with a default value, a special treatment is required *)
(* we look if the name of the parameter we just add is "*opt*", which means
- that there is a let param_name = ... in ... just right now *)
- let (p, next_exp) =
- match parameter with
- Simple_name { sn_name = "*opt*" } ->
- (
- (
- match func_body.exp_desc with
- Typedtree.Texp_let (_, ({pat_desc = Typedtree.Tpat_var id } , exp) :: _, func_body2) ->
- let name = Name.from_ident id in
- let new_param = Simple_name
- { sn_name = name ;
- sn_text = Odoc_parameter.desc_from_info_opt current_comment_opt name ;
- sn_type = Odoc_env.subst_type env exp.exp_type
- }
- in
- (new_param, func_body2)
- | _ ->
- print_DEBUG3 "Pas le bon filtre pour le paramètre optionnel avec valeur par défaut.";
- (parameter, func_body)
- )
- )
- | _ ->
- (parameter, func_body)
- in
+ that there is a let param_name = ... in ... just right now *)
+ let (p, next_exp) =
+ match parameter with
+ Simple_name { sn_name = "*opt*" } ->
+ (
+ (
+ match func_body.exp_desc with
+ Typedtree.Texp_let (_, ({pat_desc = Typedtree.Tpat_var id } , exp) :: _, func_body2) ->
+ let name = Name.from_ident id in
+ let new_param = Simple_name
+ { sn_name = name ;
+ sn_text = Odoc_parameter.desc_from_info_opt current_comment_opt name ;
+ sn_type = Odoc_env.subst_type env exp.exp_type
+ }
+ in
+ (new_param, func_body2)
+ | _ ->
+ print_DEBUG3 "Pas le bon filtre pour le paramètre optionnel avec valeur par défaut.";
+ (parameter, func_body)
+ )
+ )
+ | _ ->
+ (parameter, func_body)
+ in
(* continue if the body is still a function *)
- match next_exp.exp_desc with
- Texp_function (pat_exp_list, _) ->
- p :: (tt_analyse_function_parameters env current_comment_opt pat_exp_list)
- | _ ->
+ match next_exp.exp_desc with
+ Texp_function (pat_exp_list, _) ->
+ p :: (tt_analyse_function_parameters env current_comment_opt pat_exp_list)
+ | _ ->
(* something else ; no more parameter *)
- [ p ]
+ [ p ]
(** Analysis of a Tstr_value from the typedtree. Create and return a list of [t_value].
- @raise Failure if an error occurs.*)
+ @raise Failure if an error occurs.*)
let tt_analyse_value env current_module_name comment_opt loc pat_exp rec_flag =
let (pat, exp) = pat_exp in
match (pat.pat_desc, exp.exp_desc) with
- (Typedtree.Tpat_var ident, Typedtree.Texp_function (pat_exp_list2, partial)) ->
+ (Typedtree.Tpat_var ident, Typedtree.Texp_function (pat_exp_list2, partial)) ->
(* a new function is defined *)
- let name_pre = Name.from_ident ident in
- let name = Name.parens_if_infix name_pre in
- let complete_name = Name.concat current_module_name name in
- (* create the value *)
- let new_value = {
- val_name = complete_name ;
- val_info = comment_opt ;
- val_type = Odoc_env.subst_type env pat.Typedtree.pat_type ;
- val_recursive = rec_flag = Asttypes.Recursive ;
- val_parameters = tt_analyse_function_parameters env comment_opt pat_exp_list2 ;
- val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
- val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- }
- in
- [ new_value ]
-
+ let name_pre = Name.from_ident ident in
+ let name = Name.parens_if_infix name_pre in
+ let complete_name = Name.concat current_module_name name in
+ (* create the value *)
+ let new_value = {
+ val_name = complete_name ;
+ val_info = comment_opt ;
+ val_type = Odoc_env.subst_type env pat.Typedtree.pat_type ;
+ val_recursive = rec_flag = Asttypes.Recursive ;
+ val_parameters = tt_analyse_function_parameters env comment_opt pat_exp_list2 ;
+ val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
+ val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ }
+ in
+ [ new_value ]
+
| (Typedtree.Tpat_var ident, _) ->
- (* a new value is defined *)
- let name_pre = Name.from_ident ident in
- let name = Name.parens_if_infix name_pre in
- let complete_name = Name.concat current_module_name name in
- let new_value = {
- val_name = complete_name ;
- val_info = comment_opt ;
- val_type = Odoc_env.subst_type env pat.Typedtree.pat_type ;
- val_recursive = rec_flag = Asttypes.Recursive ;
- val_parameters = [] ;
- val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
- val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- }
- in
- [ new_value ]
-
+ (* a new value is defined *)
+ let name_pre = Name.from_ident ident in
+ let name = Name.parens_if_infix name_pre in
+ let complete_name = Name.concat current_module_name name in
+ let new_value = {
+ val_name = complete_name ;
+ val_info = comment_opt ;
+ val_type = Odoc_env.subst_type env pat.Typedtree.pat_type ;
+ val_recursive = rec_flag = Asttypes.Recursive ;
+ val_parameters = [] ;
+ val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
+ val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ }
+ in
+ [ new_value ]
+
| (Typedtree.Tpat_tuple lpat, _) ->
- (* new identifiers are defined *)
- (* A VOIR : by now we don't accept to have global variables defined in tuples *)
- []
-
+ (* new identifiers are defined *)
+ (* A VOIR : by now we don't accept to have global variables defined in tuples *)
+ []
+
| _ ->
- (* something else, we don't care ? A VOIR *)
- []
+ (* something else, we don't care ? A VOIR *)
+ []
(** This function takes a Typedtree.class_expr and returns a string which can stand for the class name.
The name can be "object ... end" if the class expression is not an ident or a class constraint or a class apply. *)
let rec tt_name_of_class_expr clexp =
match clexp.Typedtree.cl_desc with
- Typedtree.Tclass_ident p -> Name.from_path p
- | Typedtree.Tclass_constraint (class_expr, _, _, _)
- | Typedtree.Tclass_apply (class_expr, _) -> tt_name_of_class_expr class_expr
+ Typedtree.Tclass_ident p -> Name.from_path p
+ | Typedtree.Tclass_constraint (class_expr, _, _, _)
+ | Typedtree.Tclass_apply (class_expr, _) -> tt_name_of_class_expr class_expr
(*
- | Typedtree.Tclass_fun (_, _, class_expr, _) -> tt_name_of_class_expr class_expr
- | Typedtree.Tclass_let (_,_,_, class_expr) -> tt_name_of_class_expr class_expr
+ | Typedtree.Tclass_fun (_, _, class_expr, _) -> tt_name_of_class_expr class_expr
+ | Typedtree.Tclass_let (_,_,_, class_expr) -> tt_name_of_class_expr class_expr
*)
- | _ -> Odoc_messages.object_end
+ | _ -> Odoc_messages.object_end
(** Analysis of a method expression to get the method parameters.
@param first indicates if we're analysing the method for
@@ -394,358 +394,358 @@ module Analyser =
*)
let rec tt_analyse_method_expression env current_method_name comment_opt ?(first=true) exp =
match exp.Typedtree.exp_desc with
- Typedtree.Texp_function (pat_exp_list, _) ->
- (
- match pat_exp_list with
- [] ->
- (* it is not a function since there are no parameters *)
- (* we can't get here normally *)
- raise (Failure (Odoc_messages.bad_tree^" "^(Odoc_messages.method_without_param current_method_name)))
- | l ->
- match l with
- [] ->
- (* cas impossible, on l'a filtré avant *)
- assert false
- | (pattern_param, exp) :: second_ele :: q ->
+ Typedtree.Texp_function (pat_exp_list, _) ->
+ (
+ match pat_exp_list with
+ [] ->
+ (* it is not a function since there are no parameters *)
+ (* we can't get here normally *)
+ raise (Failure (Odoc_messages.bad_tree^" "^(Odoc_messages.method_without_param current_method_name)))
+ | l ->
+ match l with
+ [] ->
+ (* cas impossible, on l'a filtré avant *)
+ assert false
+ | (pattern_param, exp) :: second_ele :: q ->
(* implicit pattern matching -> anonymous parameter *)
- (* Note : We can't match this pattern if it is the first call to the function. *)
- let new_param = Simple_name
- { sn_name = "??" ; sn_text = None;
- sn_type = Odoc_env.subst_type env pattern_param.Typedtree.pat_type }
- in
- [ new_param ]
-
- | (pattern_param, body) :: [] ->
- (* if this is the first call to the function, this is the first parameter and we skip it *)
- if not first then
- (
- let parameter =
- tt_param_info_from_pattern
- env
- (Odoc_parameter.desc_from_info_opt comment_opt)
- pattern_param
- in
+ (* Note : We can't match this pattern if it is the first call to the function. *)
+ let new_param = Simple_name
+ { sn_name = "??" ; sn_text = None;
+ sn_type = Odoc_env.subst_type env pattern_param.Typedtree.pat_type }
+ in
+ [ new_param ]
+
+ | (pattern_param, body) :: [] ->
+ (* if this is the first call to the function, this is the first parameter and we skip it *)
+ if not first then
+ (
+ let parameter =
+ tt_param_info_from_pattern
+ env
+ (Odoc_parameter.desc_from_info_opt comment_opt)
+ pattern_param
+ in
(* For optional parameters with a default value, a special treatment is required. *)
(* We look if the name of the parameter we just add is "*opt*", which means
- that there is a let param_name = ... in ... just right now. *)
- let (current_param, next_exp) =
- match parameter with
- Simple_name { sn_name = "*opt*"} ->
- (
- (
- match body.exp_desc with
- Typedtree.Texp_let (_, ({pat_desc = Typedtree.Tpat_var id } , exp) :: _, body2) ->
- let name = Name.from_ident id in
- let new_param = Simple_name
- { sn_name = name ;
- sn_text = Odoc_parameter.desc_from_info_opt comment_opt name ;
- sn_type = Odoc_env.subst_type env exp.Typedtree.exp_type ;
- }
- in
- (new_param, body2)
- | _ ->
- print_DEBUG3 "Pas le bon filtre pour le paramètre optionnel avec valeur par défaut.";
- (parameter, body)
- )
- )
- | _ ->
- (* no *opt* parameter, we add the parameter then continue *)
- (parameter, body)
- in
- current_param :: (tt_analyse_method_expression env current_method_name comment_opt ~first: false next_exp)
- )
- else
- tt_analyse_method_expression env current_method_name comment_opt ~first: false body
- )
+ that there is a let param_name = ... in ... just right now. *)
+ let (current_param, next_exp) =
+ match parameter with
+ Simple_name { sn_name = "*opt*"} ->
+ (
+ (
+ match body.exp_desc with
+ Typedtree.Texp_let (_, ({pat_desc = Typedtree.Tpat_var id } , exp) :: _, body2) ->
+ let name = Name.from_ident id in
+ let new_param = Simple_name
+ { sn_name = name ;
+ sn_text = Odoc_parameter.desc_from_info_opt comment_opt name ;
+ sn_type = Odoc_env.subst_type env exp.Typedtree.exp_type ;
+ }
+ in
+ (new_param, body2)
+ | _ ->
+ print_DEBUG3 "Pas le bon filtre pour le paramètre optionnel avec valeur par défaut.";
+ (parameter, body)
+ )
+ )
+ | _ ->
+ (* no *opt* parameter, we add the parameter then continue *)
+ (parameter, body)
+ in
+ current_param :: (tt_analyse_method_expression env current_method_name comment_opt ~first: false next_exp)
+ )
+ else
+ tt_analyse_method_expression env current_method_name comment_opt ~first: false body
+ )
| _ ->
- (* no more parameter *)
- []
+ (* no more parameter *)
+ []
(** Analysis of a [Parsetree.class_struture] and a [Typedtree.class_structure] to get a couple
(inherited classes, class elements). *)
let analyse_class_structure env current_class_name tt_class_sig last_pos pos_limit p_cls tt_cls =
let rec iter acc_inher acc_fields last_pos = function
- | [] ->
- let s = get_string_of_file last_pos pos_limit in
- let (_, ele_coms) = My_ir.all_special !file_name s in
- let ele_comments =
- List.fold_left
- (fun acc -> fun sc ->
- match sc.Odoc_types.i_desc with
- None ->
- acc
- | Some t ->
- acc @ [Class_comment t])
- []
- ele_coms
- in
- (acc_inher, acc_fields @ ele_comments)
-
- | (Parsetree.Pcf_inher (p_clexp, _)) :: q ->
- let tt_clexp =
- let n = List.length acc_inher in
- try Typedtree_search.get_nth_inherit_class_expr tt_cls n
- with Not_found -> raise (Failure (Odoc_messages.inherit_classexp_not_found_in_typedtree n))
- in
- let (info_opt, ele_comments) = get_comments_in_class last_pos p_clexp.Parsetree.pcl_loc.Location.loc_start in
- let text_opt = match info_opt with None -> None | Some i -> i.Odoc_types.i_desc in
- let name = tt_name_of_class_expr tt_clexp in
- let inher = { ic_name = Odoc_env.full_class_or_class_type_name env name ; ic_class = None ; ic_text = text_opt } in
- iter (acc_inher @ [ inher ]) (acc_fields @ ele_comments)
- p_clexp.Parsetree.pcl_loc.Location.loc_end
- q
-
- | (Parsetree.Pcf_val (label, mutable_flag, expression, loc)) :: q ->
- let complete_name = Name.concat current_class_name label in
- let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start in
- let type_exp =
- try Typedtree_search.search_attribute_type tt_cls label
- with Not_found -> raise (Failure (Odoc_messages.attribute_not_found_in_typedtree complete_name))
- in
- let att =
- {
- att_value = { val_name = complete_name ;
- val_info = info_opt ;
- val_type = Odoc_env.subst_type env type_exp ;
- val_recursive = false ;
- val_parameters = [] ;
- val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
- val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- } ;
- att_mutable = mutable_flag = Asttypes.Mutable ;
- }
- in
- iter acc_inher (acc_fields @ ele_comments @ [ Class_attribute att ]) loc.Location.loc_end q
+ | [] ->
+ let s = get_string_of_file last_pos pos_limit in
+ let (_, ele_coms) = My_ir.all_special !file_name s in
+ let ele_comments =
+ List.fold_left
+ (fun acc -> fun sc ->
+ match sc.Odoc_types.i_desc with
+ None ->
+ acc
+ | Some t ->
+ acc @ [Class_comment t])
+ []
+ ele_coms
+ in
+ (acc_inher, acc_fields @ ele_comments)
+
+ | (Parsetree.Pcf_inher (p_clexp, _)) :: q ->
+ let tt_clexp =
+ let n = List.length acc_inher in
+ try Typedtree_search.get_nth_inherit_class_expr tt_cls n
+ with Not_found -> raise (Failure (Odoc_messages.inherit_classexp_not_found_in_typedtree n))
+ in
+ let (info_opt, ele_comments) = get_comments_in_class last_pos p_clexp.Parsetree.pcl_loc.Location.loc_start in
+ let text_opt = match info_opt with None -> None | Some i -> i.Odoc_types.i_desc in
+ let name = tt_name_of_class_expr tt_clexp in
+ let inher = { ic_name = Odoc_env.full_class_or_class_type_name env name ; ic_class = None ; ic_text = text_opt } in
+ iter (acc_inher @ [ inher ]) (acc_fields @ ele_comments)
+ p_clexp.Parsetree.pcl_loc.Location.loc_end
+ q
+
+ | (Parsetree.Pcf_val (label, mutable_flag, expression, loc)) :: q ->
+ let complete_name = Name.concat current_class_name label in
+ let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start in
+ let type_exp =
+ try Typedtree_search.search_attribute_type tt_cls label
+ with Not_found -> raise (Failure (Odoc_messages.attribute_not_found_in_typedtree complete_name))
+ in
+ let att =
+ {
+ att_value = { val_name = complete_name ;
+ val_info = info_opt ;
+ val_type = Odoc_env.subst_type env type_exp ;
+ val_recursive = false ;
+ val_parameters = [] ;
+ val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
+ val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ } ;
+ att_mutable = mutable_flag = Asttypes.Mutable ;
+ }
+ in
+ iter acc_inher (acc_fields @ ele_comments @ [ Class_attribute att ]) loc.Location.loc_end q
- | (Parsetree.Pcf_virt (label, private_flag, _, loc)) :: q ->
- let complete_name = Name.concat current_class_name label in
- let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start in
- let met_type =
- try Odoc_sig.Signature_search.search_method_type label tt_class_sig
- with Not_found -> raise (Failure (Odoc_messages.method_type_not_found current_class_name label))
- in
- let real_type =
- match met_type.Types.desc with
- Tarrow (_, _, t, _) ->
- t
- | _ ->
- (* ?!? : not an arrow type ! return the original type *)
- met_type
- in
- let met =
- {
- met_value = { val_name = complete_name ;
- val_info = info_opt ;
- val_type = Odoc_env.subst_type env real_type ;
- val_recursive = false ;
- val_parameters = [] ;
- val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
- val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- } ;
- met_private = private_flag = Asttypes.Private ;
- met_virtual = true ;
- }
- in
- (* update the parameter description *)
- Odoc_value.update_value_parameters_text met.met_value;
-
- iter acc_inher (acc_fields @ ele_comments @ [ Class_method met ]) loc.Location.loc_end q
-
- | (Parsetree.Pcf_meth (label, private_flag, _, loc)) :: q ->
- let complete_name = Name.concat current_class_name label in
- let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start in
- let exp =
- try Typedtree_search.search_method_expression tt_cls label
- with Not_found -> raise (Failure (Odoc_messages.method_not_found_in_typedtree complete_name))
- in
- let real_type =
- match exp.exp_type.desc with
- Tarrow (_, _, t,_) ->
- t
- | _ ->
- (* ?!? : not an arrow type ! return the original type *)
- exp.Typedtree.exp_type
- in
- let met =
- {
- met_value = { val_name = complete_name ;
- val_info = info_opt ;
- val_type = Odoc_env.subst_type env real_type ;
- val_recursive = false ;
- val_parameters = tt_analyse_method_expression env complete_name info_opt exp ;
- val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
- val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- } ;
- met_private = private_flag = Asttypes.Private ;
- met_virtual = false ;
- }
- in
- (* update the parameter description *)
- Odoc_value.update_value_parameters_text met.met_value;
-
- iter acc_inher (acc_fields @ ele_comments @ [ Class_method met ]) loc.Location.loc_end q
-
- | Parsetree.Pcf_cstr (_, _, loc) :: q ->
- (* don't give a $*%@ ! *)
- iter acc_inher acc_fields loc.Location.loc_end q
-
- | Parsetree.Pcf_let (_, _, loc) :: q ->
- (* don't give a $*%@ ! *)
- iter acc_inher acc_fields loc.Location.loc_end q
-
- | (Parsetree.Pcf_init exp) :: q ->
- iter acc_inher acc_fields exp.Parsetree.pexp_loc.Location.loc_end q
+ | (Parsetree.Pcf_virt (label, private_flag, _, loc)) :: q ->
+ let complete_name = Name.concat current_class_name label in
+ let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start in
+ let met_type =
+ try Odoc_sig.Signature_search.search_method_type label tt_class_sig
+ with Not_found -> raise (Failure (Odoc_messages.method_type_not_found current_class_name label))
+ in
+ let real_type =
+ match met_type.Types.desc with
+ Tarrow (_, _, t, _) ->
+ t
+ | _ ->
+ (* ?!? : not an arrow type ! return the original type *)
+ met_type
+ in
+ let met =
+ {
+ met_value = { val_name = complete_name ;
+ val_info = info_opt ;
+ val_type = Odoc_env.subst_type env real_type ;
+ val_recursive = false ;
+ val_parameters = [] ;
+ val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
+ val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ } ;
+ met_private = private_flag = Asttypes.Private ;
+ met_virtual = true ;
+ }
+ in
+ (* update the parameter description *)
+ Odoc_value.update_value_parameters_text met.met_value;
+
+ iter acc_inher (acc_fields @ ele_comments @ [ Class_method met ]) loc.Location.loc_end q
+
+ | (Parsetree.Pcf_meth (label, private_flag, _, loc)) :: q ->
+ let complete_name = Name.concat current_class_name label in
+ let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start in
+ let exp =
+ try Typedtree_search.search_method_expression tt_cls label
+ with Not_found -> raise (Failure (Odoc_messages.method_not_found_in_typedtree complete_name))
+ in
+ let real_type =
+ match exp.exp_type.desc with
+ Tarrow (_, _, t,_) ->
+ t
+ | _ ->
+ (* ?!? : not an arrow type ! return the original type *)
+ exp.Typedtree.exp_type
+ in
+ let met =
+ {
+ met_value = { val_name = complete_name ;
+ val_info = info_opt ;
+ val_type = Odoc_env.subst_type env real_type ;
+ val_recursive = false ;
+ val_parameters = tt_analyse_method_expression env complete_name info_opt exp ;
+ val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
+ val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ } ;
+ met_private = private_flag = Asttypes.Private ;
+ met_virtual = false ;
+ }
+ in
+ (* update the parameter description *)
+ Odoc_value.update_value_parameters_text met.met_value;
+
+ iter acc_inher (acc_fields @ ele_comments @ [ Class_method met ]) loc.Location.loc_end q
+
+ | Parsetree.Pcf_cstr (_, _, loc) :: q ->
+ (* don't give a $*%@ ! *)
+ iter acc_inher acc_fields loc.Location.loc_end q
+
+ | Parsetree.Pcf_let (_, _, loc) :: q ->
+ (* don't give a $*%@ ! *)
+ iter acc_inher acc_fields loc.Location.loc_end q
+
+ | (Parsetree.Pcf_init exp) :: q ->
+ iter acc_inher acc_fields exp.Parsetree.pexp_loc.Location.loc_end q
in
iter [] [] last_pos (snd p_cls)
-
+
(** Analysis of a [Parsetree.class_expr] and a [Typedtree.class_expr] to get a a couple (class parameters, class kind). *)
let rec analyse_class_kind env current_class_name comment_opt last_pos p_class_expr tt_class_exp =
match (p_class_expr.Parsetree.pcl_desc, tt_class_exp.Typedtree.cl_desc) with
- (Parsetree.Pcl_constr (lid, _), tt_class_exp_desc ) ->
- let name =
- match tt_class_exp_desc with
- Typedtree.Tclass_ident p -> Name.from_path p
- | _ ->
- (* we try to get the name from the environment. *)
+ (Parsetree.Pcl_constr (lid, _), tt_class_exp_desc ) ->
+ let name =
+ match tt_class_exp_desc with
+ Typedtree.Tclass_ident p -> Name.from_path p
+ | _ ->
+ (* we try to get the name from the environment. *)
(* A VOIR : dommage qu'on n'ait pas un Tclass_ident :-( même quand on a class tutu = toto *)
- Name.from_longident lid
- in
- (* On n'a pas ici les paramètres de type sous forme de Types.type_expr,
- par contre on peut les trouver dans le class_type *)
- let params =
- match tt_class_exp.Typedtree.cl_type with
- Types.Tcty_constr (p2, type_exp_list, cltyp) ->
- (* cltyp is the class type for [type_exp_list] p *)
- type_exp_list
- | _ ->
- []
- in
- ([],
- Class_constr
- {
- cco_name = Odoc_env.full_class_name env name ;
- cco_class = None ;
- cco_type_parameters = List.map (Odoc_env.subst_type env) params ;
- } )
+ Name.from_longident lid
+ in
+ (* On n'a pas ici les paramètres de type sous forme de Types.type_expr,
+ par contre on peut les trouver dans le class_type *)
+ let params =
+ match tt_class_exp.Typedtree.cl_type with
+ Types.Tcty_constr (p2, type_exp_list, cltyp) ->
+ (* cltyp is the class type for [type_exp_list] p *)
+ type_exp_list
+ | _ ->
+ []
+ in
+ ([],
+ Class_constr
+ {
+ cco_name = Odoc_env.full_class_name env name ;
+ cco_class = None ;
+ cco_type_parameters = List.map (Odoc_env.subst_type env) params ;
+ } )
| (Parsetree.Pcl_structure p_class_structure, Typedtree.Tclass_structure tt_class_structure) ->
- (* we need the class signature to get the type of methods in analyse_class_structure *)
- let tt_class_sig =
- match tt_class_exp.Typedtree.cl_type with
- Types.Tcty_signature class_sig -> class_sig
- | _ -> raise (Failure "analyse_class_kind: no class signature for a class structure.")
- in
- let (inherited_classes, class_elements) = analyse_class_structure
- env
- current_class_name
- tt_class_sig
- last_pos
- p_class_expr.Parsetree.pcl_loc.Location.loc_end
- p_class_structure
- tt_class_structure
- in
- ([],
- Class_structure (inherited_classes, class_elements) )
-
+ (* we need the class signature to get the type of methods in analyse_class_structure *)
+ let tt_class_sig =
+ match tt_class_exp.Typedtree.cl_type with
+ Types.Tcty_signature class_sig -> class_sig
+ | _ -> raise (Failure "analyse_class_kind: no class signature for a class structure.")
+ in
+ let (inherited_classes, class_elements) = analyse_class_structure
+ env
+ current_class_name
+ tt_class_sig
+ last_pos
+ p_class_expr.Parsetree.pcl_loc.Location.loc_end
+ p_class_structure
+ tt_class_structure
+ in
+ ([],
+ Class_structure (inherited_classes, class_elements) )
+
| (Parsetree.Pcl_fun (label, expression_opt, pattern, p_class_expr2),
- Typedtree.Tclass_fun (pat, ident_exp_list, tt_class_expr2, partial)) ->
- (* we check that this is not an optional parameter with
- a default value. In this case, we look for the good parameter pattern *)
- let (parameter, next_tt_class_exp) =
- match pat.Typedtree.pat_desc with
- Typedtree.Tpat_var ident when Name.from_ident ident = "*opt*" ->
- (
- (* there must be a Tclass_let just after *)
- match tt_class_expr2.Typedtree.cl_desc with
- Typedtree.Tclass_let (_, ({pat_desc = Typedtree.Tpat_var id } , exp) :: _, _, tt_class_expr3) ->
- let name = Name.from_ident id in
- let new_param = Simple_name
- { sn_name = name ;
- sn_text = Odoc_parameter.desc_from_info_opt comment_opt name ;
- sn_type = Odoc_env.subst_type env exp.exp_type
- }
- in
- (new_param, tt_class_expr3)
- | _ ->
- (* strange case *)
- (* we create the parameter and add it to the class *)
- raise (Failure "analyse_class_kind: strange case")
- )
+ Typedtree.Tclass_fun (pat, ident_exp_list, tt_class_expr2, partial)) ->
+ (* we check that this is not an optional parameter with
+ a default value. In this case, we look for the good parameter pattern *)
+ let (parameter, next_tt_class_exp) =
+ match pat.Typedtree.pat_desc with
+ Typedtree.Tpat_var ident when Name.from_ident ident = "*opt*" ->
+ (
+ (* there must be a Tclass_let just after *)
+ match tt_class_expr2.Typedtree.cl_desc with
+ Typedtree.Tclass_let (_, ({pat_desc = Typedtree.Tpat_var id } , exp) :: _, _, tt_class_expr3) ->
+ let name = Name.from_ident id in
+ let new_param = Simple_name
+ { sn_name = name ;
+ sn_text = Odoc_parameter.desc_from_info_opt comment_opt name ;
+ sn_type = Odoc_env.subst_type env exp.exp_type
+ }
+ in
+ (new_param, tt_class_expr3)
+ | _ ->
+ (* strange case *)
+ (* we create the parameter and add it to the class *)
+ raise (Failure "analyse_class_kind: strange case")
+ )
| _ ->
- (* no optional parameter with default value, we create the parameter *)
- let new_param =
- tt_param_info_from_pattern
- env
- (Odoc_parameter.desc_from_info_opt comment_opt)
- pat
- in
- (new_param, tt_class_expr2)
- in
- let (params, k) = analyse_class_kind env current_class_name comment_opt last_pos p_class_expr2 next_tt_class_exp in
- (parameter :: params, k)
+ (* no optional parameter with default value, we create the parameter *)
+ let new_param =
+ tt_param_info_from_pattern
+ env
+ (Odoc_parameter.desc_from_info_opt comment_opt)
+ pat
+ in
+ (new_param, tt_class_expr2)
+ in
+ let (params, k) = analyse_class_kind env current_class_name comment_opt last_pos p_class_expr2 next_tt_class_exp in
+ (parameter :: params, k)
| (Parsetree.Pcl_apply (p_class_expr2, _), Tclass_apply (tt_class_expr2, exp_opt_optional_list)) ->
- let applied_name =
+ let applied_name =
(* we want an ident, or else the class applied will appear in the form object ... end,
- because if the class applied has no name, the code is kinda ugly, isn't it ? *)
- match tt_class_expr2.Typedtree.cl_desc with
- Typedtree.Tclass_ident p -> Name.from_path p (* A VOIR : obtenir le nom complet *)
- | _ ->
+ because if the class applied has no name, the code is kinda ugly, isn't it ? *)
+ match tt_class_expr2.Typedtree.cl_desc with
+ Typedtree.Tclass_ident p -> Name.from_path p (* A VOIR : obtenir le nom complet *)
+ | _ ->
(* A VOIR : dommage qu'on n'ait pas un Tclass_ident :-( même quand on a class tutu = toto *)
- match p_class_expr2.Parsetree.pcl_desc with
- Parsetree.Pcl_constr (lid, _) ->
- (* we try to get the name from the environment. *)
- Name.from_longident lid
- | _ ->
- Odoc_messages.object_end
- in
- let param_exps = List.fold_left
- (fun acc -> fun (exp_opt, _) ->
- match exp_opt with
- None -> acc
- | Some e -> acc @ [e])
- []
- exp_opt_optional_list
- in
- let param_types = List.map (fun e -> e.Typedtree.exp_type) param_exps in
- let params_code =
- List.map
- (fun e -> get_string_of_file
- e.exp_loc.Location.loc_start
- e.exp_loc.Location.loc_end)
- param_exps
- in
- ([],
- Class_apply
- { capp_name = Odoc_env.full_class_name env applied_name ;
- capp_class = None ;
- capp_params = param_types ;
- capp_params_code = params_code ;
- } )
+ match p_class_expr2.Parsetree.pcl_desc with
+ Parsetree.Pcl_constr (lid, _) ->
+ (* we try to get the name from the environment. *)
+ Name.from_longident lid
+ | _ ->
+ Odoc_messages.object_end
+ in
+ let param_exps = List.fold_left
+ (fun acc -> fun (exp_opt, _) ->
+ match exp_opt with
+ None -> acc
+ | Some e -> acc @ [e])
+ []
+ exp_opt_optional_list
+ in
+ let param_types = List.map (fun e -> e.Typedtree.exp_type) param_exps in
+ let params_code =
+ List.map
+ (fun e -> get_string_of_file
+ e.exp_loc.Location.loc_start
+ e.exp_loc.Location.loc_end)
+ param_exps
+ in
+ ([],
+ Class_apply
+ { capp_name = Odoc_env.full_class_name env applied_name ;
+ capp_class = None ;
+ capp_params = param_types ;
+ capp_params_code = params_code ;
+ } )
| (Parsetree.Pcl_let (_, _, p_class_expr2), Typedtree.Tclass_let (_, _, _, tt_class_expr2)) ->
- (* we don't care about these lets *)
- analyse_class_kind env current_class_name comment_opt last_pos p_class_expr2 tt_class_expr2
+ (* we don't care about these lets *)
+ analyse_class_kind env current_class_name comment_opt last_pos p_class_expr2 tt_class_expr2
| (Parsetree.Pcl_constraint (p_class_expr2, p_class_type2),
- Typedtree.Tclass_constraint (tt_class_expr2, _, _, _)) ->
- let (l, class_kind) = analyse_class_kind env current_class_name comment_opt last_pos p_class_expr2 tt_class_expr2 in
- (* A VOIR : analyse du class type ? on n'a pas toutes les infos. cf. Odoc_sig.analyse_class_type_kind *)
- let class_type_kind =
- (*Sig.analyse_class_type_kind
- env
- ""
- p_class_type2.Parsetree.pcty_loc.Location.loc_start
- p_class_type2
- tt_class_expr2.Typedtree.cl_type
- *)
- Class_type { cta_name = Odoc_messages.object_end ;
- cta_class = None ; cta_type_parameters = [] }
- in
- (l, Class_constraint (class_kind, class_type_kind))
-
- | _ ->
- raise (Failure "analyse_class_kind: Parsetree and typedtree don't match.")
+ Typedtree.Tclass_constraint (tt_class_expr2, _, _, _)) ->
+ let (l, class_kind) = analyse_class_kind env current_class_name comment_opt last_pos p_class_expr2 tt_class_expr2 in
+ (* A VOIR : analyse du class type ? on n'a pas toutes les infos. cf. Odoc_sig.analyse_class_type_kind *)
+ let class_type_kind =
+ (*Sig.analyse_class_type_kind
+ env
+ ""
+ p_class_type2.Parsetree.pcty_loc.Location.loc_start
+ p_class_type2
+ tt_class_expr2.Typedtree.cl_type
+ *)
+ Class_type { cta_name = Odoc_messages.object_end ;
+ cta_class = None ; cta_type_parameters = [] }
+ in
+ (l, Class_constraint (class_kind, class_type_kind))
+
+ | _ ->
+ raise (Failure "analyse_class_kind: Parsetree and typedtree don't match.")
(** Analysis of a [Parsetree.class_declaration] and a [Typedtree.class_expr] to return a [t_class].*)
let analyse_class env current_module_name comment_opt p_class_decl tt_type_params tt_class_exp =
@@ -756,24 +756,24 @@ module Analyser =
let virt = p_class_decl.Parsetree.pci_virt = Asttypes.Virtual in
let cltype = Odoc_env.subst_class_type env tt_class_exp.Typedtree.cl_type in
let (parameters, kind) = analyse_class_kind
- env
- complete_name
- comment_opt
- pos_start
- p_class_decl.Parsetree.pci_expr
- tt_class_exp
+ env
+ complete_name
+ comment_opt
+ pos_start
+ p_class_decl.Parsetree.pci_expr
+ tt_class_exp
in
let cl =
- {
- cl_name = complete_name ;
- cl_info = comment_opt ;
- cl_type = cltype ;
- cl_virtual = virt ;
- cl_type_parameters = type_parameters ;
- cl_kind = kind ;
- cl_parameters = parameters ;
- cl_loc = { loc_impl = Some (!file_name, pos_start) ; loc_inter = None } ;
- }
+ {
+ cl_name = complete_name ;
+ cl_info = comment_opt ;
+ cl_type = cltype ;
+ cl_virtual = virt ;
+ cl_type_parameters = type_parameters ;
+ cl_kind = kind ;
+ cl_parameters = parameters ;
+ cl_loc = { loc_impl = Some (!file_name, pos_start) ; loc_inter = None } ;
+ }
in
cl
@@ -781,26 +781,26 @@ module Analyser =
is not an ident of a constraint on an ident. *)
let rec tt_name_from_module_expr mod_expr =
match mod_expr.Typedtree.mod_desc with
- Typedtree.Tmod_ident p -> Name.from_path p
+ Typedtree.Tmod_ident p -> Name.from_path p
| Typedtree.Tmod_constraint (m_exp, _, _) -> tt_name_from_module_expr m_exp
| Typedtree.Tmod_structure _
| Typedtree.Tmod_functor _
| Typedtree.Tmod_apply _ ->
- Odoc_messages.struct_end
+ Odoc_messages.struct_end
(** Get the list of included modules in a module structure of a typed tree. *)
let tt_get_included_module_list tt_structure =
let f acc item =
- match item with
- Typedtree.Tstr_include (mod_expr, _) ->
- acc @ [
- { (* A VOIR : chercher dans les modules et les module types, avec quel env ? *)
- im_name = tt_name_from_module_expr mod_expr ;
- im_module = None ;
- }
- ]
- | _ ->
- acc
+ match item with
+ Typedtree.Tstr_include (mod_expr, _) ->
+ acc @ [
+ { (* A VOIR : chercher dans les modules et les module types, avec quel env ? *)
+ im_name = tt_name_from_module_expr mod_expr ;
+ im_module = None ;
+ }
+ ]
+ | _ ->
+ acc
in
List.fold_left f [] tt_structure
@@ -808,14 +808,14 @@ module Analyser =
the ones found in typed tree structure of the module. *)
let replace_dummy_included_modules module_elements included_modules =
let rec f = function
- | ([], _) ->
- []
- | ((Element_included_module im) :: q, (im_repl :: im_q)) ->
- (Element_included_module im_repl) :: (f (q, im_q))
- | ((Element_included_module im) :: q, []) ->
- (Element_included_module im) :: q
- | (ele :: q, l) ->
- ele :: (f (q, l))
+ | ([], _) ->
+ []
+ | ((Element_included_module im) :: q, (im_repl :: im_q)) ->
+ (Element_included_module im_repl) :: (f (q, im_q))
+ | ((Element_included_module im) :: q, []) ->
+ (Element_included_module im) :: q
+ | (ele :: q, l) ->
+ ele :: (f (q, l))
in
f (module_elements, included_modules)
@@ -824,430 +824,430 @@ module Analyser =
print_DEBUG "Odoc_ast:analyse_struture";
let (table, table_values) = Typedtree_search.tables typedtree in
let rec iter env last_pos = function
- [] ->
- let s = get_string_of_file last_pos pos_limit in
- let (_, ele_coms) = My_ir.all_special !file_name s in
- let ele_comments =
- List.fold_left
- (fun acc -> fun sc ->
- match sc.Odoc_types.i_desc with
- None ->
- acc
- | Some t ->
- acc @ [Element_module_comment t])
- []
- ele_coms
- in
- ele_comments
- | item :: q ->
- let (comment_opt, ele_comments) =
- get_comments_in_module last_pos item.Parsetree.pstr_loc.Location.loc_start
- in
- let pos_limit2 =
- match q with
- [] -> pos_limit
- | item2 :: _ -> item2.Parsetree.pstr_loc.Location.loc_start
- in
- let (maybe_more, new_env, elements) = analyse_structure_item
- env
- current_module_name
- item.Parsetree.pstr_loc
- pos_limit2
- comment_opt
- item.Parsetree.pstr_desc
- typedtree
- table
- table_values
- in
- ele_comments @ elements @ (iter new_env (item.Parsetree.pstr_loc.Location.loc_end + maybe_more) q)
+ [] ->
+ let s = get_string_of_file last_pos pos_limit in
+ let (_, ele_coms) = My_ir.all_special !file_name s in
+ let ele_comments =
+ List.fold_left
+ (fun acc -> fun sc ->
+ match sc.Odoc_types.i_desc with
+ None ->
+ acc
+ | Some t ->
+ acc @ [Element_module_comment t])
+ []
+ ele_coms
+ in
+ ele_comments
+ | item :: q ->
+ let (comment_opt, ele_comments) =
+ get_comments_in_module last_pos item.Parsetree.pstr_loc.Location.loc_start
+ in
+ let pos_limit2 =
+ match q with
+ [] -> pos_limit
+ | item2 :: _ -> item2.Parsetree.pstr_loc.Location.loc_start
+ in
+ let (maybe_more, new_env, elements) = analyse_structure_item
+ env
+ current_module_name
+ item.Parsetree.pstr_loc
+ pos_limit2
+ comment_opt
+ item.Parsetree.pstr_desc
+ typedtree
+ table
+ table_values
+ in
+ ele_comments @ elements @ (iter new_env (item.Parsetree.pstr_loc.Location.loc_end + maybe_more) q)
in
iter env last_pos parsetree
(** Analysis of a parse tree structure item to obtain a new environment and a list of elements.*)
and analyse_structure_item env current_module_name loc pos_limit comment_opt parsetree_item_desc typedtree
- table table_values =
+ table table_values =
print_DEBUG "Odoc_ast:analyse_struture_item";
match parsetree_item_desc with
- Parsetree.Pstr_eval _ ->
- (* don't care *)
- (0, env, [])
+ Parsetree.Pstr_eval _ ->
+ (* don't care *)
+ (0, env, [])
| Parsetree.Pstr_value (rec_flag, pat_exp_list) ->
- (* of rec_flag * (pattern * expression) list *)
- (* For each value, look for the value name, then look in the
- typedtree for the corresponding information,
- at last analyse this information to build the value *)
- let rec iter_pat = function
- | Parsetree.Ppat_any -> None
- | Parsetree.Ppat_var name -> Some name
- | Parsetree.Ppat_tuple _ -> None (* A VOIR quand on traitera les tuples *)
- | Parsetree.Ppat_constraint (pat, _) -> iter_pat pat.Parsetree.ppat_desc
- | _ -> None
- in
- let rec iter ?(first=false) last_pos acc_env acc p_e_list =
- match p_e_list with
- [] ->
- (acc_env, acc)
- | (pat, exp) :: q ->
- let value_name_opt = iter_pat pat.Parsetree.ppat_desc in
- let new_last_pos = exp.Parsetree.pexp_loc.Location.loc_end in
- match value_name_opt with
- None ->
- iter new_last_pos acc_env acc q
- | Some name ->
- try
- let pat_exp = Typedtree_search.search_value table_values name in
- let (info_opt, ele_comments) =
- (* we already have the optional comment for the first value. *)
- if first then
- (comment_opt, [])
- else
- get_comments_in_module
- last_pos
- pat.Parsetree.ppat_loc.Location.loc_start
- in
- let l_values = tt_analyse_value
- env
- current_module_name
- info_opt
- loc
- pat_exp
- rec_flag
- in
- let new_env = List.fold_left
- (fun e -> fun v ->
- Odoc_env.add_value e v.val_name
- )
- acc_env
- l_values
- in
- let l_ele = List.map (fun v -> Element_value v) l_values in
- iter
- new_last_pos
- new_env
- (acc @ ele_comments @ l_ele)
- q
- with
- Not_found ->
- iter new_last_pos acc_env acc q
- in
- let (new_env, l_ele) = iter ~first: true loc.Location.loc_start env [] pat_exp_list in
- (0, new_env, l_ele)
+ (* of rec_flag * (pattern * expression) list *)
+ (* For each value, look for the value name, then look in the
+ typedtree for the corresponding information,
+ at last analyse this information to build the value *)
+ let rec iter_pat = function
+ | Parsetree.Ppat_any -> None
+ | Parsetree.Ppat_var name -> Some name
+ | Parsetree.Ppat_tuple _ -> None (* A VOIR quand on traitera les tuples *)
+ | Parsetree.Ppat_constraint (pat, _) -> iter_pat pat.Parsetree.ppat_desc
+ | _ -> None
+ in
+ let rec iter ?(first=false) last_pos acc_env acc p_e_list =
+ match p_e_list with
+ [] ->
+ (acc_env, acc)
+ | (pat, exp) :: q ->
+ let value_name_opt = iter_pat pat.Parsetree.ppat_desc in
+ let new_last_pos = exp.Parsetree.pexp_loc.Location.loc_end in
+ match value_name_opt with
+ None ->
+ iter new_last_pos acc_env acc q
+ | Some name ->
+ try
+ let pat_exp = Typedtree_search.search_value table_values name in
+ let (info_opt, ele_comments) =
+ (* we already have the optional comment for the first value. *)
+ if first then
+ (comment_opt, [])
+ else
+ get_comments_in_module
+ last_pos
+ pat.Parsetree.ppat_loc.Location.loc_start
+ in
+ let l_values = tt_analyse_value
+ env
+ current_module_name
+ info_opt
+ loc
+ pat_exp
+ rec_flag
+ in
+ let new_env = List.fold_left
+ (fun e -> fun v ->
+ Odoc_env.add_value e v.val_name
+ )
+ acc_env
+ l_values
+ in
+ let l_ele = List.map (fun v -> Element_value v) l_values in
+ iter
+ new_last_pos
+ new_env
+ (acc @ ele_comments @ l_ele)
+ q
+ with
+ Not_found ->
+ iter new_last_pos acc_env acc q
+ in
+ let (new_env, l_ele) = iter ~first: true loc.Location.loc_start env [] pat_exp_list in
+ (0, new_env, l_ele)
| Parsetree.Pstr_primitive (name_pre, val_desc) ->
- (* of string * value_description *)
- print_DEBUG ("Parsetree.Pstr_primitive ("^name_pre^", ["^(String.concat ", " val_desc.Parsetree.pval_prim)^"]");
- let typ = Typedtree_search.search_primitive table name_pre in
- let name = Name.parens_if_infix name_pre in
- let complete_name = Name.concat current_module_name name in
- let new_value = {
- val_name = complete_name ;
- val_info = comment_opt ;
- val_type = Odoc_env.subst_type env typ ;
- val_recursive = false ;
- val_parameters = [] ;
- val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
- val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- }
- in
- let new_env = Odoc_env.add_value env new_value.val_name in
- (0, new_env, [Element_value new_value])
+ (* of string * value_description *)
+ print_DEBUG ("Parsetree.Pstr_primitive ("^name_pre^", ["^(String.concat ", " val_desc.Parsetree.pval_prim)^"]");
+ let typ = Typedtree_search.search_primitive table name_pre in
+ let name = Name.parens_if_infix name_pre in
+ let complete_name = Name.concat current_module_name name in
+ let new_value = {
+ val_name = complete_name ;
+ val_info = comment_opt ;
+ val_type = Odoc_env.subst_type env typ ;
+ val_recursive = false ;
+ val_parameters = [] ;
+ val_code = Some (get_string_of_file loc.Location.loc_start loc.Location.loc_end) ;
+ val_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ }
+ in
+ let new_env = Odoc_env.add_value env new_value.val_name in
+ (0, new_env, [Element_value new_value])
| Parsetree.Pstr_type name_typedecl_list ->
- (* of (string * type_declaration) list *)
- (* we start by extending the environment *)
- let new_env =
- List.fold_left
- (fun acc_env -> fun (name, _) ->
- let complete_name = Name.concat current_module_name name in
- Odoc_env.add_type acc_env complete_name
- )
- env
- name_typedecl_list
- in
- let rec f ?(first=false) maybe_more_acc last_pos name_type_decl_list =
- match name_type_decl_list with
- [] -> (maybe_more_acc, [])
- | (name, type_decl) :: q ->
- let complete_name = Name.concat current_module_name name in
- let loc_start = type_decl.Parsetree.ptype_loc.Location.loc_start in
- let loc_end = type_decl.Parsetree.ptype_loc.Location.loc_end in
- let pos_limit2 =
- match q with
- [] -> pos_limit
- | (_, td) :: _ -> td.Parsetree.ptype_loc.Location.loc_start
- in
- let (maybe_more, name_comment_list) =
- Sig.name_comment_from_type_kind
- loc_start loc_end
- pos_limit2
- type_decl.Parsetree.ptype_kind
- in
- let tt_type_decl =
- try Typedtree_search.search_type_declaration table name
- with Not_found -> raise (Failure (Odoc_messages.type_not_found_in_typedtree complete_name))
- in
- let (com_opt, ele_comments) = (* the comment for the first type was already retrieved *)
- if first then
- (comment_opt , [])
- else
- get_comments_in_module last_pos loc_start
- in
- let kind = Sig.get_type_kind
- new_env name_comment_list
- tt_type_decl.Types.type_kind
- in
- let t =
- {
- ty_name = complete_name ;
- ty_info = com_opt ;
- ty_parameters = List.map
- (Odoc_env.subst_type new_env)
- tt_type_decl.Types.type_params ;
- ty_kind = kind ;
- ty_manifest =
- (match tt_type_decl.Types.type_manifest with
- None -> None
- | Some t -> Some (Odoc_env.subst_type new_env t));
- ty_loc = { loc_impl = Some (!file_name, loc_start) ; loc_inter = None } ;
- }
- in
- let new_end = loc_end + maybe_more in
- let (maybe_more2, info_after_opt) =
- My_ir.just_after_special
- !file_name
- (get_string_of_file new_end pos_limit2)
- in
- t.ty_info <- Sig.merge_infos t.ty_info info_after_opt ;
- let (maybe_more3, eles) = f (maybe_more + maybe_more2) (new_end + maybe_more2) q in
- (maybe_more3, ele_comments @ ((Element_type t) :: eles))
- in
- let (maybe_more, eles) = f ~first: true 0 loc.Location.loc_start name_typedecl_list in
- (maybe_more, new_env, eles)
+ (* of (string * type_declaration) list *)
+ (* we start by extending the environment *)
+ let new_env =
+ List.fold_left
+ (fun acc_env -> fun (name, _) ->
+ let complete_name = Name.concat current_module_name name in
+ Odoc_env.add_type acc_env complete_name
+ )
+ env
+ name_typedecl_list
+ in
+ let rec f ?(first=false) maybe_more_acc last_pos name_type_decl_list =
+ match name_type_decl_list with
+ [] -> (maybe_more_acc, [])
+ | (name, type_decl) :: q ->
+ let complete_name = Name.concat current_module_name name in
+ let loc_start = type_decl.Parsetree.ptype_loc.Location.loc_start in
+ let loc_end = type_decl.Parsetree.ptype_loc.Location.loc_end in
+ let pos_limit2 =
+ match q with
+ [] -> pos_limit
+ | (_, td) :: _ -> td.Parsetree.ptype_loc.Location.loc_start
+ in
+ let (maybe_more, name_comment_list) =
+ Sig.name_comment_from_type_kind
+ loc_start loc_end
+ pos_limit2
+ type_decl.Parsetree.ptype_kind
+ in
+ let tt_type_decl =
+ try Typedtree_search.search_type_declaration table name
+ with Not_found -> raise (Failure (Odoc_messages.type_not_found_in_typedtree complete_name))
+ in
+ let (com_opt, ele_comments) = (* the comment for the first type was already retrieved *)
+ if first then
+ (comment_opt , [])
+ else
+ get_comments_in_module last_pos loc_start
+ in
+ let kind = Sig.get_type_kind
+ new_env name_comment_list
+ tt_type_decl.Types.type_kind
+ in
+ let t =
+ {
+ ty_name = complete_name ;
+ ty_info = com_opt ;
+ ty_parameters = List.map
+ (Odoc_env.subst_type new_env)
+ tt_type_decl.Types.type_params ;
+ ty_kind = kind ;
+ ty_manifest =
+ (match tt_type_decl.Types.type_manifest with
+ None -> None
+ | Some t -> Some (Odoc_env.subst_type new_env t));
+ ty_loc = { loc_impl = Some (!file_name, loc_start) ; loc_inter = None } ;
+ }
+ in
+ let new_end = loc_end + maybe_more in
+ let (maybe_more2, info_after_opt) =
+ My_ir.just_after_special
+ !file_name
+ (get_string_of_file new_end pos_limit2)
+ in
+ t.ty_info <- Sig.merge_infos t.ty_info info_after_opt ;
+ let (maybe_more3, eles) = f (maybe_more + maybe_more2) (new_end + maybe_more2) q in
+ (maybe_more3, ele_comments @ ((Element_type t) :: eles))
+ in
+ let (maybe_more, eles) = f ~first: true 0 loc.Location.loc_start name_typedecl_list in
+ (maybe_more, new_env, eles)
| Parsetree.Pstr_exception (name, excep_decl) ->
- (* a new exception is defined *)
- let complete_name = Name.concat current_module_name name in
- (* we get the exception declaration in the typed tree *)
- let tt_excep_decl =
- try Typedtree_search.search_exception table name
- with Not_found ->
- raise (Failure (Odoc_messages.exception_not_found_in_typedtree complete_name))
- in
- let new_env = Odoc_env.add_exception env complete_name in
- let new_ex =
- {
- ex_name = complete_name ;
- ex_info = comment_opt ;
- ex_args = List.map (Odoc_env.subst_type new_env) tt_excep_decl ;
- ex_alias = None ;
- ex_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- }
- in
- (0, new_env, [ Element_exception new_ex ])
+ (* a new exception is defined *)
+ let complete_name = Name.concat current_module_name name in
+ (* we get the exception declaration in the typed tree *)
+ let tt_excep_decl =
+ try Typedtree_search.search_exception table name
+ with Not_found ->
+ raise (Failure (Odoc_messages.exception_not_found_in_typedtree complete_name))
+ in
+ let new_env = Odoc_env.add_exception env complete_name in
+ let new_ex =
+ {
+ ex_name = complete_name ;
+ ex_info = comment_opt ;
+ ex_args = List.map (Odoc_env.subst_type new_env) tt_excep_decl ;
+ ex_alias = None ;
+ ex_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ }
+ in
+ (0, new_env, [ Element_exception new_ex ])
| Parsetree.Pstr_exn_rebind (name, _) ->
- (* a new exception is defined *)
- let complete_name = Name.concat current_module_name name in
- (* we get the exception rebind in the typed tree *)
- let tt_path =
- try Typedtree_search.search_exception_rebind table name
- with Not_found ->
- raise (Failure (Odoc_messages.exception_not_found_in_typedtree complete_name))
- in
- let new_env = Odoc_env.add_exception env complete_name in
- let new_ex =
- {
- ex_name = complete_name ;
- ex_info = comment_opt ;
- ex_args = [] ;
- ex_alias = Some { ea_name = (Odoc_env.full_exception_name env (Name.from_path tt_path)) ;
- ea_ex = None ; } ;
- ex_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- }
- in
- (0, new_env, [ Element_exception new_ex ])
+ (* a new exception is defined *)
+ let complete_name = Name.concat current_module_name name in
+ (* we get the exception rebind in the typed tree *)
+ let tt_path =
+ try Typedtree_search.search_exception_rebind table name
+ with Not_found ->
+ raise (Failure (Odoc_messages.exception_not_found_in_typedtree complete_name))
+ in
+ let new_env = Odoc_env.add_exception env complete_name in
+ let new_ex =
+ {
+ ex_name = complete_name ;
+ ex_info = comment_opt ;
+ ex_args = [] ;
+ ex_alias = Some { ea_name = (Odoc_env.full_exception_name env (Name.from_path tt_path)) ;
+ ea_ex = None ; } ;
+ ex_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ }
+ in
+ (0, new_env, [ Element_exception new_ex ])
| Parsetree.Pstr_module (name, module_expr) ->
- (
- (* of string * module_expr *)
- try
- let tt_module_expr = Typedtree_search.search_module table name in
- let new_module = analyse_module
- env
- current_module_name
- name
- comment_opt
- module_expr
- tt_module_expr
- in
- let new_env = Odoc_env.add_module env new_module.m_name in
- let new_env2 =
- match new_module.m_type with
+ (
+ (* of string * module_expr *)
+ try
+ let tt_module_expr = Typedtree_search.search_module table name in
+ let new_module = analyse_module
+ env
+ current_module_name
+ name
+ comment_opt
+ module_expr
+ tt_module_expr
+ in
+ let new_env = Odoc_env.add_module env new_module.m_name in
+ let new_env2 =
+ match new_module.m_type with
(* A VOIR : cela peut-il être Tmty_ident ? dans ce cas, on aurait pas la signature *)
- Types.Tmty_signature s ->
- Odoc_env.add_signature new_env new_module.m_name
- ~rel: (Name.simple new_module.m_name) s
- | _ ->
- new_env
- in
- (0, new_env2, [ Element_module new_module ])
- with
- Not_found ->
- let complete_name = Name.concat current_module_name name in
- raise (Failure (Odoc_messages.module_not_found_in_typedtree complete_name))
- )
+ Types.Tmty_signature s ->
+ Odoc_env.add_signature new_env new_module.m_name
+ ~rel: (Name.simple new_module.m_name) s
+ | _ ->
+ new_env
+ in
+ (0, new_env2, [ Element_module new_module ])
+ with
+ Not_found ->
+ let complete_name = Name.concat current_module_name name in
+ raise (Failure (Odoc_messages.module_not_found_in_typedtree complete_name))
+ )
| Parsetree.Pstr_modtype (name, modtype) ->
- let complete_name = Name.concat current_module_name name in
- let tt_module_type =
- try Typedtree_search.search_module_type table name
- with Not_found ->
- raise (Failure (Odoc_messages.module_type_not_found_in_typedtree complete_name))
- in
- let kind = Sig.analyse_module_type_kind env complete_name
- modtype tt_module_type
- in
- let mt =
- {
- mt_name = complete_name ;
- mt_info = comment_opt ;
- mt_type = Some tt_module_type ;
- mt_is_interface = false ;
- mt_file = !file_name ;
- mt_kind = Some kind ;
- mt_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
- }
- in
- let new_env = Odoc_env.add_module_type env mt.mt_name in
- let new_env2 =
- match tt_module_type with
+ let complete_name = Name.concat current_module_name name in
+ let tt_module_type =
+ try Typedtree_search.search_module_type table name
+ with Not_found ->
+ raise (Failure (Odoc_messages.module_type_not_found_in_typedtree complete_name))
+ in
+ let kind = Sig.analyse_module_type_kind env complete_name
+ modtype tt_module_type
+ in
+ let mt =
+ {
+ mt_name = complete_name ;
+ mt_info = comment_opt ;
+ mt_type = Some tt_module_type ;
+ mt_is_interface = false ;
+ mt_file = !file_name ;
+ mt_kind = Some kind ;
+ mt_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ; loc_inter = None } ;
+ }
+ in
+ let new_env = Odoc_env.add_module_type env mt.mt_name in
+ let new_env2 =
+ match tt_module_type with
(* A VOIR : cela peut-il être Tmty_ident ? dans ce cas, on n'aurait pas la signature *)
- Types.Tmty_signature s ->
- Odoc_env.add_signature new_env mt.mt_name ~rel: (Name.simple mt.mt_name) s
- | _ ->
- new_env
- in
- (0, new_env2, [ Element_module_type mt ])
+ Types.Tmty_signature s ->
+ Odoc_env.add_signature new_env mt.mt_name ~rel: (Name.simple mt.mt_name) s
+ | _ ->
+ new_env
+ in
+ (0, new_env2, [ Element_module_type mt ])
| Parsetree.Pstr_open longident ->
- (* A VOIR : enrichir l'environnement quand open ? *)
- let ele_comments = match comment_opt with
- None -> []
- | Some i ->
- match i.i_desc with
- None -> []
- | Some t -> [Element_module_comment t]
- in
- (0, env, ele_comments)
+ (* A VOIR : enrichir l'environnement quand open ? *)
+ let ele_comments = match comment_opt with
+ None -> []
+ | Some i ->
+ match i.i_desc with
+ None -> []
+ | Some t -> [Element_module_comment t]
+ in
+ (0, env, ele_comments)
| Parsetree.Pstr_class class_decl_list ->
(* we start by extending the environment *)
- let new_env =
- List.fold_left
- (fun acc_env -> fun class_decl ->
- let complete_name = Name.concat current_module_name class_decl.Parsetree.pci_name in
- Odoc_env.add_class acc_env complete_name
- )
- env
- class_decl_list
- in
- let rec f ?(first=false) last_pos class_decl_list =
- match class_decl_list with
- [] ->
- []
- | class_decl :: q ->
- let (tt_class_exp, tt_type_params) =
- try Typedtree_search.search_class_exp table class_decl.Parsetree.pci_name
- with Not_found ->
- let complete_name = Name.concat current_module_name class_decl.Parsetree.pci_name in
- raise (Failure (Odoc_messages.class_not_found_in_typedtree complete_name))
- in
- let (com_opt, ele_comments) =
- if first then
- (comment_opt, [])
- else
- get_comments_in_module last_pos class_decl.Parsetree.pci_loc.Location.loc_start
- in
- let last_pos2 = class_decl.Parsetree.pci_loc.Location.loc_end in
- let new_class = analyse_class
- new_env
- current_module_name
- com_opt
- class_decl
- tt_type_params
- tt_class_exp
- in
- ele_comments @ ((Element_class new_class) :: (f last_pos2 q))
- in
- (0, new_env, f ~first: true loc.Location.loc_start class_decl_list)
+ let new_env =
+ List.fold_left
+ (fun acc_env -> fun class_decl ->
+ let complete_name = Name.concat current_module_name class_decl.Parsetree.pci_name in
+ Odoc_env.add_class acc_env complete_name
+ )
+ env
+ class_decl_list
+ in
+ let rec f ?(first=false) last_pos class_decl_list =
+ match class_decl_list with
+ [] ->
+ []
+ | class_decl :: q ->
+ let (tt_class_exp, tt_type_params) =
+ try Typedtree_search.search_class_exp table class_decl.Parsetree.pci_name
+ with Not_found ->
+ let complete_name = Name.concat current_module_name class_decl.Parsetree.pci_name in
+ raise (Failure (Odoc_messages.class_not_found_in_typedtree complete_name))
+ in
+ let (com_opt, ele_comments) =
+ if first then
+ (comment_opt, [])
+ else
+ get_comments_in_module last_pos class_decl.Parsetree.pci_loc.Location.loc_start
+ in
+ let last_pos2 = class_decl.Parsetree.pci_loc.Location.loc_end in
+ let new_class = analyse_class
+ new_env
+ current_module_name
+ com_opt
+ class_decl
+ tt_type_params
+ tt_class_exp
+ in
+ ele_comments @ ((Element_class new_class) :: (f last_pos2 q))
+ in
+ (0, new_env, f ~first: true loc.Location.loc_start class_decl_list)
| Parsetree.Pstr_class_type class_type_decl_list ->
- (* we start by extending the environment *)
- let new_env =
- List.fold_left
- (fun acc_env -> fun class_type_decl ->
- let complete_name = Name.concat current_module_name class_type_decl.Parsetree.pci_name in
- Odoc_env.add_class_type acc_env complete_name
- )
- env
- class_type_decl_list
- in
- let rec f ?(first=false) last_pos class_type_decl_list =
- match class_type_decl_list with
- [] ->
- []
- | class_type_decl :: q ->
- let name = class_type_decl.Parsetree.pci_name in
- let complete_name = Name.concat current_module_name name in
- let virt = class_type_decl.Parsetree.pci_virt = Asttypes.Virtual in
- let tt_cltype_declaration =
- try Typedtree_search.search_class_type_declaration table name
- with Not_found ->
- raise (Failure (Odoc_messages.class_type_not_found_in_typedtree complete_name))
- in
- let type_params = tt_cltype_declaration.Types.clty_params in
- let kind = Sig.analyse_class_type_kind
- new_env
- complete_name
- class_type_decl.Parsetree.pci_loc.Location.loc_start
- class_type_decl.Parsetree.pci_expr
- tt_cltype_declaration.Types.clty_type
- in
- let (com_opt, ele_comments) =
- if first then
- (comment_opt, [])
- else
- get_comments_in_module last_pos class_type_decl.Parsetree.pci_loc.Location.loc_start
- in
- let last_pos2 = class_type_decl.Parsetree.pci_loc.Location.loc_end in
- let new_ele =
- Element_class_type
- {
- clt_name = complete_name ;
- clt_info = com_opt ;
- clt_type = Odoc_env.subst_class_type env tt_cltype_declaration.Types.clty_type ;
- clt_type_parameters = List.map (Odoc_env.subst_type new_env) type_params ;
- clt_virtual = virt ;
- clt_kind = kind ;
- clt_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ;
- loc_inter = None } ;
- }
- in
- ele_comments @ (new_ele :: (f last_pos2 q))
- in
- (0, new_env, f ~first: true loc.Location.loc_start class_type_decl_list)
+ (* we start by extending the environment *)
+ let new_env =
+ List.fold_left
+ (fun acc_env -> fun class_type_decl ->
+ let complete_name = Name.concat current_module_name class_type_decl.Parsetree.pci_name in
+ Odoc_env.add_class_type acc_env complete_name
+ )
+ env
+ class_type_decl_list
+ in
+ let rec f ?(first=false) last_pos class_type_decl_list =
+ match class_type_decl_list with
+ [] ->
+ []
+ | class_type_decl :: q ->
+ let name = class_type_decl.Parsetree.pci_name in
+ let complete_name = Name.concat current_module_name name in
+ let virt = class_type_decl.Parsetree.pci_virt = Asttypes.Virtual in
+ let tt_cltype_declaration =
+ try Typedtree_search.search_class_type_declaration table name
+ with Not_found ->
+ raise (Failure (Odoc_messages.class_type_not_found_in_typedtree complete_name))
+ in
+ let type_params = tt_cltype_declaration.Types.clty_params in
+ let kind = Sig.analyse_class_type_kind
+ new_env
+ complete_name
+ class_type_decl.Parsetree.pci_loc.Location.loc_start
+ class_type_decl.Parsetree.pci_expr
+ tt_cltype_declaration.Types.clty_type
+ in
+ let (com_opt, ele_comments) =
+ if first then
+ (comment_opt, [])
+ else
+ get_comments_in_module last_pos class_type_decl.Parsetree.pci_loc.Location.loc_start
+ in
+ let last_pos2 = class_type_decl.Parsetree.pci_loc.Location.loc_end in
+ let new_ele =
+ Element_class_type
+ {
+ clt_name = complete_name ;
+ clt_info = com_opt ;
+ clt_type = Odoc_env.subst_class_type env tt_cltype_declaration.Types.clty_type ;
+ clt_type_parameters = List.map (Odoc_env.subst_type new_env) type_params ;
+ clt_virtual = virt ;
+ clt_kind = kind ;
+ clt_loc = { loc_impl = Some (!file_name, loc.Location.loc_start) ;
+ loc_inter = None } ;
+ }
+ in
+ ele_comments @ (new_ele :: (f last_pos2 q))
+ in
+ (0, new_env, f ~first: true loc.Location.loc_start class_type_decl_list)
| Parsetree.Pstr_include module_expr ->
- (* we add a dummy included module which will be replaced by a correct
- one at the end of the module analysis,
- to use the Path.t of the included modules in the typdtree. *)
- let im =
- {
- im_name = "dummy" ;
- im_module = None ;
- }
- in
- (0, env, [ Element_included_module im ]) (* A VOIR : étendre l'environnement ? avec quoi ? *)
+ (* we add a dummy included module which will be replaced by a correct
+ one at the end of the module analysis,
+ to use the Path.t of the included modules in the typdtree. *)
+ let im =
+ {
+ im_name = "dummy" ;
+ im_module = None ;
+ }
+ in
+ (0, env, [ Element_included_module im ]) (* A VOIR : étendre l'environnement ? avec quoi ? *)
(** Analysis of a [Parsetree.module_expr] and a name to return a [t_module].*)
and analyse_module env current_module_name module_name comment_opt p_module_expr tt_module_expr =
@@ -1256,124 +1256,124 @@ module Analyser =
let pos_end = p_module_expr.Parsetree.pmod_loc.Location.loc_end in
let modtype = tt_module_expr.Typedtree.mod_type in
let m_base =
- {
- m_name = complete_name ;
- m_type = tt_module_expr.Typedtree.mod_type ;
- m_info = comment_opt ;
- m_is_interface = false ;
- m_file = !file_name ;
- m_kind = Module_struct [] ;
- m_loc = { loc_impl = Some (!file_name, pos_start) ; loc_inter = None } ;
- m_top_deps = [] ;
- }
+ {
+ m_name = complete_name ;
+ m_type = tt_module_expr.Typedtree.mod_type ;
+ m_info = comment_opt ;
+ m_is_interface = false ;
+ m_file = !file_name ;
+ m_kind = Module_struct [] ;
+ m_loc = { loc_impl = Some (!file_name, pos_start) ; loc_inter = None } ;
+ m_top_deps = [] ;
+ }
in
match (p_module_expr.Parsetree.pmod_desc, tt_module_expr.Typedtree.mod_desc) with
- (Parsetree.Pmod_ident longident, Typedtree.Tmod_ident path) ->
- let alias_name = Odoc_env.full_module_name env (Name.from_path path) in
- { m_base with m_kind = Module_alias { ma_name = alias_name ;
- ma_module = None ; } }
-
+ (Parsetree.Pmod_ident longident, Typedtree.Tmod_ident path) ->
+ let alias_name = Odoc_env.full_module_name env (Name.from_path path) in
+ { m_base with m_kind = Module_alias { ma_name = alias_name ;
+ ma_module = None ; } }
+
| (Parsetree.Pmod_structure p_structure, Typedtree.Tmod_structure tt_structure) ->
- let elements = analyse_structure env complete_name pos_start pos_end p_structure tt_structure in
- (* we must complete the included modules *)
- let included_modules_from_tt = tt_get_included_module_list tt_structure in
- let elements2 = replace_dummy_included_modules elements included_modules_from_tt in
- { m_base with m_kind = Module_struct elements2 }
+ let elements = analyse_structure env complete_name pos_start pos_end p_structure tt_structure in
+ (* we must complete the included modules *)
+ let included_modules_from_tt = tt_get_included_module_list tt_structure in
+ let elements2 = replace_dummy_included_modules elements included_modules_from_tt in
+ { m_base with m_kind = Module_struct elements2 }
| (Parsetree.Pmod_functor (_, _, p_module_expr2),
- Typedtree.Tmod_functor (ident, mtyp, tt_module_expr2)) ->
- let param =
- {
- mp_name = Name.from_ident ident ;
- mp_type = Odoc_env.subst_module_type env mtyp ;
- }
- in
- let dummy_complete_name = Name.concat "__" param.mp_name in
- let new_env = Odoc_env.add_module env dummy_complete_name in
- let m_base2 = analyse_module
- new_env
- current_module_name
- module_name
- None
- p_module_expr2
- tt_module_expr2
- in
- let kind =
- match m_base2.m_kind with
- Module_functor (params, k) -> Module_functor (param :: params, m_base2.m_kind)
- | k -> Module_functor ([param], k)
- in
- { m_base with m_kind = kind }
+ Typedtree.Tmod_functor (ident, mtyp, tt_module_expr2)) ->
+ let param =
+ {
+ mp_name = Name.from_ident ident ;
+ mp_type = Odoc_env.subst_module_type env mtyp ;
+ }
+ in
+ let dummy_complete_name = Name.concat "__" param.mp_name in
+ let new_env = Odoc_env.add_module env dummy_complete_name in
+ let m_base2 = analyse_module
+ new_env
+ current_module_name
+ module_name
+ None
+ p_module_expr2
+ tt_module_expr2
+ in
+ let kind =
+ match m_base2.m_kind with
+ Module_functor (params, k) -> Module_functor (param :: params, m_base2.m_kind)
+ | k -> Module_functor ([param], k)
+ in
+ { m_base with m_kind = kind }
| (Parsetree.Pmod_apply (p_module_expr1, p_module_expr2),
- Typedtree.Tmod_apply (tt_module_expr1, tt_module_expr2, _)) ->
- let m1 = analyse_module
- env
- current_module_name
- module_name
- None
- p_module_expr1
- tt_module_expr1
- in
- let m2 = analyse_module
- env
- current_module_name
- module_name
- None
- p_module_expr2
- tt_module_expr2
- in
- { m_base with m_kind = Module_apply (m1.m_kind, m2.m_kind) }
+ Typedtree.Tmod_apply (tt_module_expr1, tt_module_expr2, _)) ->
+ let m1 = analyse_module
+ env
+ current_module_name
+ module_name
+ None
+ p_module_expr1
+ tt_module_expr1
+ in
+ let m2 = analyse_module
+ env
+ current_module_name
+ module_name
+ None
+ p_module_expr2
+ tt_module_expr2
+ in
+ { m_base with m_kind = Module_apply (m1.m_kind, m2.m_kind) }
| (Parsetree.Pmod_constraint (p_module_expr2, p_modtype),
- Typedtree.Tmod_constraint (tt_module_expr2, tt_modtype, _)) ->
- (* we create the module with p_module_expr2 and tt_module_expr2
- but we change its type according to the constraint.
- A VOIR : est-ce que c'est bien ?
- *)
- let m_base2 = analyse_module
- env
- current_module_name
- module_name
- None
- p_module_expr2
- tt_module_expr2
- in
- let mtkind = Sig.analyse_module_type_kind
- env
- (Name.concat current_module_name "??")
- p_modtype tt_modtype
- in
- {
- m_base with
- m_type = tt_modtype ;
- m_kind = Module_constraint (m_base2.m_kind,
- mtkind)
-
-(* Module_type_alias { mta_name = "Not analyzed" ;
- mta_module = None })
+ Typedtree.Tmod_constraint (tt_module_expr2, tt_modtype, _)) ->
+ (* we create the module with p_module_expr2 and tt_module_expr2
+ but we change its type according to the constraint.
+ A VOIR : est-ce que c'est bien ?
+ *)
+ let m_base2 = analyse_module
+ env
+ current_module_name
+ module_name
+ None
+ p_module_expr2
+ tt_module_expr2
+ in
+ let mtkind = Sig.analyse_module_type_kind
+ env
+ (Name.concat current_module_name "??")
+ p_modtype tt_modtype
+ in
+ {
+ m_base with
+ m_type = tt_modtype ;
+ m_kind = Module_constraint (m_base2.m_kind,
+ mtkind)
+
+(* Module_type_alias { mta_name = "Not analyzed" ;
+ mta_module = None })
*)
- }
+ }
- | _ ->
- raise (Failure "analyse_module: parsetree and typedtree don't match.")
+ | _ ->
+ raise (Failure "analyse_module: parsetree and typedtree don't match.")
let analyse_typed_tree source_file input_file
- (parsetree : Parsetree.structure) (typedtree : typedtree) =
+ (parsetree : Parsetree.structure) (typedtree : typedtree) =
let (tree_structure, _) = typedtree in
let complete_source_file =
- try
- let curdir = Sys.getcwd () in
- let (dirname, basename) = (Filename.dirname source_file, Filename.basename source_file) in
- Sys.chdir dirname ;
- let complete = Filename.concat (Sys.getcwd ()) basename in
- Sys.chdir curdir ;
- complete
- with
- Sys_error s ->
- prerr_endline s ;
- incr Odoc_global.errors ;
- source_file
+ try
+ let curdir = Sys.getcwd () in
+ let (dirname, basename) = (Filename.dirname source_file, Filename.basename source_file) in
+ Sys.chdir dirname ;
+ let complete = Filename.concat (Sys.getcwd ()) basename in
+ Sys.chdir curdir ;
+ complete
+ with
+ Sys_error s ->
+ prerr_endline s ;
+ incr Odoc_global.errors ;
+ source_file
in
prepare_file complete_source_file input_file;
(* We create the t_module for this file. *)
@@ -1386,16 +1386,16 @@ module Analyser =
let elements2 = replace_dummy_included_modules elements included_modules_from_tt in
let kind = Module_struct elements2 in
let m =
- {
- m_name = mod_name ;
- m_type = Types.Tmty_signature [] ;
- m_info = info_opt ;
- m_is_interface = false ;
- m_file = !file_name ;
- m_kind = kind ;
- m_loc = { loc_impl = Some (!file_name, 0) ; loc_inter = None } ;
- m_top_deps = [] ;
- }
+ {
+ m_name = mod_name ;
+ m_type = Types.Tmty_signature [] ;
+ m_info = info_opt ;
+ m_is_interface = false ;
+ m_file = !file_name ;
+ m_kind = kind ;
+ m_loc = { loc_impl = Some (!file_name, 0) ; loc_inter = None } ;
+ m_top_deps = [] ;
+ }
in
m
end