From 8968f743363a1cceef46f13addf127fda69c69b9 Mon Sep 17 00:00:00 2001 From: Frederic Bour Date: Fri, 12 Dec 2014 11:35:58 +0100 Subject: [PATCH 01/10] Introduce "implicit Path" construction --- bytecomp/translmod.ml | 14 +++++++++--- ocamldoc/odoc_ast.ml | 2 ++ ocamldoc/odoc_env.ml | 1 + ocamldoc/odoc_sig.ml | 5 +++- parsing/ast_helper.ml | 12 ++++++++++ parsing/ast_helper.mli | 8 +++++++ parsing/ast_mapper.ml | 11 +++++++++ parsing/ast_mapper.mli | 1 + parsing/longident.ml | 5 ++++ parsing/longident.mli | 2 ++ parsing/parsetree.mli | 12 ++++++++++ parsing/pprintast.ml | 10 ++++++++ parsing/printast.ml | 8 +++++++ tools/depend.ml | 4 ++++ tools/tast_iter.ml | 2 ++ tools/untypeast.ml | 10 ++++++++ typing/btype.ml | 1 + typing/env.ml | 49 +++++++++++++++++++++++++++++++++++++--- typing/env.mli | 4 ++++ typing/implicitsearch.ml | 30 +++--------------------- typing/includemod.ml | 7 +++++- typing/mtype.ml | 22 +++++++++++++++--- typing/oprint.ml | 5 ++++ typing/outcometree.mli | 1 + typing/path.ml | 2 ++ typing/path.mli | 2 ++ typing/printtyp.ml | 2 ++ typing/printtyped.ml | 8 +++++++ typing/subst.ml | 5 ++++ typing/typecore.ml | 4 +++- typing/typedtree.ml | 11 +++++++++ typing/typedtree.mli | 11 +++++++++ typing/typedtreeIter.ml | 2 ++ typing/typedtreeMap.ml | 2 ++ typing/typemod.ml | 34 +++++++++++++++++++++++++++- typing/types.ml | 1 + typing/types.mli | 1 + 37 files changed, 271 insertions(+), 40 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index d3a04c23a1..fc4214eb90 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -226,6 +226,8 @@ let init_shape modl = :: init_shape_struct env rem | Sig_class_type(id, ctyp, _) :: rem -> init_shape_struct env rem + | Sig_implicit(_,_) :: rem -> + init_shape_struct env rem in try Some(undefined_location modl.mod_loc, @@ -396,8 +398,8 @@ and transl_structure fields cc rootpath = function fatal_error "Translmod.transl_structure" end | item :: rem -> - match item.str_desc with - | Tstr_eval (expr, _) -> + match item.str_desc with + | Tstr_eval (expr, _) -> Lsequence(transl_exp expr, transl_structure fields cc rootpath rem) | Tstr_value(rec_flag, pat_expr_list) -> let ext_fields = rev_let_bound_idents pat_expr_list @ fields in @@ -456,6 +458,7 @@ and transl_structure fields cc rootpath = function | Tstr_modtype _ | Tstr_open _ | Tstr_class_type _ + | Tstr_implicit _ | Tstr_attribute _ -> transl_structure fields cc rootpath rem @@ -506,7 +509,8 @@ let rec defined_idents = function | Tstr_class_type cl_list -> defined_idents rem | Tstr_include incl -> bound_value_identifiers incl.incl_type @ defined_idents rem - | Tstr_attribute _ -> defined_idents rem + | Tstr_attribute _ | Tstr_implicit _ -> + defined_idents rem (* second level idents (module M = struct ... let id = ... end), and all sub-levels idents *) @@ -530,6 +534,7 @@ let rec more_idents = function all_idents str.str_items @ more_idents rem | Tstr_module _ -> more_idents rem | Tstr_attribute _ -> more_idents rem + | Tstr_implicit _ -> more_idents rem and all_idents = function [] -> [] @@ -557,6 +562,7 @@ and all_idents = function mb_id :: all_idents str.str_items @ all_idents rem | Tstr_module mb -> mb.mb_id :: all_idents rem | Tstr_attribute _ -> all_idents rem + | Tstr_implicit _ -> all_idents rem (* A variant of transl_structure used to compile toplevel structure definitions @@ -673,6 +679,7 @@ let transl_store_structure glob map prims str = | Tstr_modtype _ | Tstr_open _ | Tstr_class_type _ + | Tstr_implicit _ | Tstr_attribute _ -> transl_store rootpath subst rem @@ -870,6 +877,7 @@ let transl_toplevel_item item = | Tstr_primitive _ | Tstr_type _ | Tstr_class_type _ + | Tstr_implicit _ | Tstr_attribute _ -> lambda_unit diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index f85f58602b..2b3b3ba501 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -114,6 +114,7 @@ module Typedtree_search = Hashtbl.add table (P (Name.from_ident vd.val_id)) tt | Typedtree.Tstr_open _ -> () | Typedtree.Tstr_include _ -> () + | Typedtree.Tstr_implicit _ -> () | Typedtree.Tstr_eval _ -> () | Typedtree.Tstr_attribute _ -> () @@ -1088,6 +1089,7 @@ module Analyser = (* don't care *) (0, env, []) | Parsetree.Pstr_attribute _ + | Parsetree.Pstr_implicit _ | Parsetree.Pstr_extension _ -> (0, env, []) | Parsetree.Pstr_value (rec_flag, pat_exp_list) -> diff --git a/ocamldoc/odoc_env.ml b/ocamldoc/odoc_env.ml index 83f59677f3..9a39b58694 100644 --- a/ocamldoc/odoc_env.ml +++ b/ocamldoc/odoc_env.ml @@ -74,6 +74,7 @@ let rec add_signature env root ?rel signat = { env2 with env_module_types = (rel_name ident, qualify ident) :: env2.env_module_types } | Types.Sig_class (ident, _, _) -> { env with env_classes = (rel_name ident, qualify ident) :: env.env_classes } | Types.Sig_class_type (ident, _, _) -> { env with env_class_types = (rel_name ident, qualify ident) :: env.env_class_types } + | Types.Sig_implicit (path,arity) -> env in List.fold_left f env signat diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index f03919e670..500e551477 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -60,6 +60,8 @@ module Signature_search = Hashtbl.add table (M (Name.from_ident ident)) signat | Types.Sig_modtype (ident,_) -> Hashtbl.add table (MT (Name.from_ident ident)) signat + | Types.Sig_implicit _ -> + () let table signat = let t = Hashtbl.create 13 in @@ -327,6 +329,7 @@ module Analyser = | Parsetree.Psig_exception _ | Parsetree.Psig_open _ | Parsetree.Psig_include _ + | Parsetree.Psig_implicit _ | Parsetree.Psig_class _ | Parsetree.Psig_class_type _ as tp -> take_item tp | Parsetree.Psig_type types -> @@ -1186,7 +1189,7 @@ module Analyser = f ~first: true 0 pos_start_ele class_type_declaration_list in (maybe_more, new_env, eles) - | Parsetree.Psig_attribute _ + | Parsetree.Psig_attribute _ | Parsetree.Psig_implicit _ | Parsetree.Psig_extension _ -> (0, env, []) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 0cfc4a050b..e34526d207 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -165,6 +165,7 @@ module Sig = struct let rec_module ?loc a = mk ?loc (Psig_recmodule a) let modtype ?loc a = mk ?loc (Psig_modtype a) let open_ ?loc a = mk ?loc (Psig_open a) + let implicit_ ?loc a = mk ?loc (Psig_implicit a) let include_ ?loc a = mk ?loc (Psig_include a) let class_ ?loc a = mk ?loc (Psig_class a) let class_type ?loc a = mk ?loc (Psig_class_type a) @@ -185,6 +186,7 @@ module Str = struct let rec_module ?loc a = mk ?loc (Pstr_recmodule a) let modtype ?loc a = mk ?loc (Pstr_modtype a) let open_ ?loc a = mk ?loc (Pstr_open a) + let implicit_ ?loc a = mk ?loc (Pstr_implicit a) let class_ ?loc a = mk ?loc (Pstr_class a) let class_type ?loc a = mk ?loc (Pstr_class_type a) let include_ ?loc a = mk ?loc (Pstr_include a) @@ -318,6 +320,16 @@ module Opn = struct } end +module Imp = struct + let mk ?(loc = !default_loc) ?(attrs = []) ?(arity = 0) lid = + { + pimp_lid = lid; + pimp_loc = loc; + pimp_attributes = attrs; + pimp_arity = arity; + } +end + module Incl = struct let mk ?(loc = !default_loc) ?(attrs = []) mexpr = { diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 7765f54044..67b6910982 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -217,6 +217,7 @@ module Sig: val rec_module: ?loc:loc -> module_declaration list -> signature_item val modtype: ?loc:loc -> module_type_declaration -> signature_item val open_: ?loc:loc -> open_description -> signature_item + val implicit_: ?loc:loc -> implicit_description -> signature_item val include_: ?loc:loc -> include_description -> signature_item val class_: ?loc:loc -> class_description list -> signature_item val class_type: ?loc:loc -> class_type_declaration list -> signature_item @@ -239,6 +240,7 @@ module Str: val rec_module: ?loc:loc -> module_binding list -> structure_item val modtype: ?loc:loc -> module_type_declaration -> structure_item val open_: ?loc:loc -> open_description -> structure_item + val implicit_: ?loc:loc -> implicit_description -> structure_item val class_: ?loc:loc -> class_declaration list -> structure_item val class_type: ?loc:loc -> class_type_declaration list -> structure_item val include_: ?loc:loc -> include_declaration -> structure_item @@ -270,6 +272,12 @@ module Opn: val mk: ?loc: loc -> ?attrs:attrs -> ?flag:open_flag -> lid -> open_description end +(* Implicit bindings *) +module Imp: + sig + val mk: ?loc: loc -> ?attrs:attrs -> ?arity:int -> lid -> implicit_description + end + (* Includes *) module Incl: sig diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 2ce345d25d..c33943651b 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -47,6 +47,7 @@ type mapper = { -> extension_constructor; include_declaration: mapper -> include_declaration -> include_declaration; include_description: mapper -> include_description -> include_description; + implicit_description: mapper -> implicit_description -> implicit_description; label_declaration: mapper -> label_declaration -> label_declaration; location: mapper -> Location.t -> Location.t; module_binding: mapper -> module_binding -> module_binding; @@ -259,6 +260,8 @@ module MT = struct | Psig_extension (x, attrs) -> extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs) | Psig_attribute x -> attribute ~loc (sub.attribute sub x) + | Psig_implicit x -> implicit_ ~loc (sub.implicit_description sub x) + end @@ -315,6 +318,7 @@ module M = struct | Pstr_extension (x, attrs) -> extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs) | Pstr_attribute x -> attribute ~loc (sub.attribute sub x) + | Pstr_implicit x -> implicit_ ~loc (sub.implicit_description sub x) end module E = struct @@ -578,6 +582,13 @@ let default_mapper = ~attrs:(this.attributes this pincl_attributes) ); + implicit_description = + (fun this {pimp_lid; pimp_arity; pimp_attributes; pimp_loc} -> + Imp.mk (map_loc this pimp_lid) + ~arity:pimp_arity + ~loc:(this.location this pimp_loc) + ~attrs:(this.attributes this pimp_attributes) + ); value_binding = (fun this {pvb_pat; pvb_expr; pvb_attributes; pvb_loc} -> diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 786c37d6be..37e130cb66 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -39,6 +39,7 @@ type mapper = { -> extension_constructor; include_declaration: mapper -> include_declaration -> include_declaration; include_description: mapper -> include_description -> include_description; + implicit_description: mapper -> implicit_description -> implicit_description; label_declaration: mapper -> label_declaration -> label_declaration; location: mapper -> Location.t -> Location.t; module_binding: mapper -> module_binding -> module_binding; diff --git a/parsing/longident.ml b/parsing/longident.ml index 4e755e9bc9..ea3bb87bce 100644 --- a/parsing/longident.ml +++ b/parsing/longident.ml @@ -39,3 +39,8 @@ let parse s = [] -> Lident "" (* should not happen, but don't put assert false so as not to crash the toplevel (see Genprintval) *) | hd :: tl -> List.fold_left (fun p s -> Ldot(p, s)) (Lident hd) tl + +let rec to_string = function + | Lident s -> s + | Ldot (t,s) -> to_string t ^ "." ^ s + | Lapply (t1,t2) -> to_string t1 ^ "(" ^ to_string t2 ^ ")" diff --git a/parsing/longident.mli b/parsing/longident.mli index 50fd5bacc0..968cab4ec7 100644 --- a/parsing/longident.mli +++ b/parsing/longident.mli @@ -20,3 +20,5 @@ type t = val flatten: t -> string list val last: t -> string val parse: string -> t + +val to_string: t -> string diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 7f7cb6bbff..ae1b033b16 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -681,6 +681,8 @@ and signature_item_desc = (* [@@@id] *) | Psig_extension of extension * attributes (* [%%id] *) + | Psig_implicit of implicit_description + (* implicit Path *) and module_declaration = { @@ -715,6 +717,14 @@ and open_description = open X - popen_override = Fresh *) +and implicit_description = + { + pimp_lid: Longident.t loc; + pimp_loc: Location.t; + pimp_attributes: attributes; + pimp_arity: int; + } + and 'a include_infos = { pincl_mod: 'a; @@ -821,6 +831,8 @@ and structure_item_desc = (* [@@@id] *) | Pstr_extension of extension * attributes (* [%%id] *) + | Pstr_implicit of implicit_description + (* implicit Path.t *) and value_binding = { diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 4217e79463..fda4c93030 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1071,6 +1071,12 @@ class printer ()= object(self:'self) | Psig_extension(e, a) -> self#item_extension f e; self#item_attributes f a + | Psig_implicit id -> + (*FIXME Arity*) + pp f "@[implicit@ %a@]%a" + self#longident_loc id.pimp_lid + self#item_attributes id.pimp_attributes + end method module_expr f x = if x.pmod_attributes <> [] then begin @@ -1256,6 +1262,10 @@ class printer ()= object(self:'self) | Pstr_extension(e, a) -> self#item_extension f e; self#item_attributes f a + | Pstr_implicit id -> + pp f "@[implicit@ %a@]%a" + self#longident_loc id.pimp_lid + self#item_attributes id.pimp_attributes end method type_param f (ct, a) = pp f "%s%a" (type_variance a) self#core_type ct diff --git a/parsing/printast.ml b/parsing/printast.ml index 98e337df24..179f669ce8 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -709,6 +709,10 @@ and signature_item i ppf x = | Psig_attribute (s, arg) -> line i ppf "Psig_attribute \"%s\"\n" s.txt; payload i ppf arg + | Psig_implicit id -> + line i ppf "Psig_implicit %a %d\n" + fmt_longident_loc id.pimp_lid id.pimp_arity; + attributes i ppf id.pimp_attributes and modtype_declaration i ppf = function | None -> line i ppf "#abstract" @@ -838,6 +842,10 @@ and structure_item i ppf x = | Pstr_attribute (s, arg) -> line i ppf "Pstr_attribute \"%s\"\n" s.txt; payload i ppf arg + | Pstr_implicit id -> + line i ppf "Pstr_implicit %a %d\n" + fmt_longident_loc id.pimp_lid id.pimp_arity; + attributes i ppf id.pimp_attributes and module_declaration i ppf pmd = string_loc i ppf pmd.pmd_name; diff --git a/tools/depend.ml b/tools/depend.ml index 1521e7574c..cfc0ad5ccf 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -267,6 +267,8 @@ and add_sig_item bv item = List.iter (add_class_description bv) cdl; bv | Psig_class_type cdtl -> List.iter (add_class_type_declaration bv) cdtl; bv + | Psig_implicit id -> + addmodule bv id.pimp_lid; bv | Psig_attribute _ | Psig_extension _ -> bv @@ -342,6 +344,8 @@ and add_struct_item bv item = List.iter (add_class_type_declaration bv) cdtl; bv | Pstr_include incl -> add_module bv incl.pincl_mod; bv + | Pstr_implicit od -> + addmodule bv od.pimp_lid; bv | Pstr_attribute _ | Pstr_extension _ -> bv diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 217af6f93e..84564de32d 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -29,6 +29,7 @@ let structure_item sub x = | Tstr_recmodule list -> List.iter (sub # module_binding) list | Tstr_modtype mtd -> opt (sub # module_type) mtd.mtd_type | Tstr_open _ -> () + | Tstr_implicit _ -> () | Tstr_class list -> List.iter (fun (ci, _, _) -> sub # class_expr ci.ci_expr) list | Tstr_class_type list -> @@ -192,6 +193,7 @@ let signature_item sub item = | Tsig_modtype mtd -> opt (sub # module_type) mtd.mtd_type | Tsig_open _ -> () + | Tsig_implicit _ -> () | Tsig_include incl -> sub # module_type incl.incl_mod | Tsig_class list -> List.iter (sub # class_description) list diff --git a/tools/untypeast.ml b/tools/untypeast.ml index e4f0761e5d..7be5435af6 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -71,6 +71,11 @@ and untype_structure_item item = popen_attributes = od.open_attributes; popen_loc = od.open_loc; } + | Tstr_implicit imp -> + Pstr_implicit {pimp_lid = imp.imp_txt; pimp_arity = imp.imp_arity; + pimp_attributes = imp.imp_attributes; + pimp_loc = imp.imp_loc; + } | Tstr_class list -> Pstr_class (List.map @@ -414,6 +419,11 @@ and untype_signature_item item = popen_attributes = od.open_attributes; popen_loc = od.open_loc; } + | Tsig_implicit imp -> + Psig_implicit {pimp_lid = imp.imp_txt; pimp_arity = imp.imp_arity; + pimp_attributes = imp.imp_attributes; + pimp_loc = imp.imp_loc; + } | Tsig_include incl -> Psig_include {pincl_mod = untype_module_type incl.incl_mod; pincl_attributes = incl.incl_attributes; diff --git a/typing/btype.ml b/typing/btype.ml index e8bac1e9c7..c7ba1f7ff1 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -262,6 +262,7 @@ let type_iterators = | Sig_modtype (_, mtd) -> it.it_modtype_declaration it mtd | Sig_class (_, cd, _) -> it.it_class_declaration it cd | Sig_class_type (_, ctd, _) -> it.it_class_type_declaration it ctd + | Sig_implicit _ -> (*FIXME: do something?*) () and it_value_description it vd = it.it_type_expr it vd.val_type and it_type_declaration it td = diff --git a/typing/env.ml b/typing/env.ml index c317e503f8..dbebc946b4 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -645,6 +645,12 @@ let rec implicit_cannot_occur path env = let implicit_instances env = env.implicit_instances +let register_as_implicit path arity env = + let md = find_module path env in + let md = {md with md_implicit = Implicit arity} in + (* FIXME: Check arity *) + register_if_implicit path md env + (* Lookup by name *) exception Recmodule @@ -1109,6 +1115,32 @@ let rec scrape_alias env ?path mty = let scrape_alias env mty = scrape_alias env mty +(* Follow all aliases in a path *) + +let rec canonical_path env path = + try + let md = Env.find_module path env in + match md.Types.md_type with + | Mty_alias path -> canonical_path env path + | _ -> match path with + | Path.Pident _ -> path + | Path.Pdot (p1,s,pos) -> + let p1' = canonical_path env p1 in + if p1 == p1' then + path + else + Path.Pdot (p1', s, pos) + | Path.Papply (p1, p2, i) -> + let p1' = canonical_path env p1 + and p2' = canonical_path env p2 in + if p1' == p1 && p2 == p2' then + path + else + Path.Papply (p1', p2', i) + with Not_found -> + (*?!*) + path + (* Compute constructor descriptions *) let constructors_of_type ty_path decl = @@ -1143,24 +1175,29 @@ let signature_item_size = function | Sig_type _ -> 0 | Sig_modtype _ -> 0 | Sig_class_type _ -> 0 + | Sig_implicit _ -> 0 let signature_item_subst item p sub = match item with | Sig_type (id, _, _) -> Subst.add_type id p sub | Sig_module (id, _, _) -> Subst.add_module id p sub | Sig_modtype (id, _) -> Subst.add_modtype id (Mty_ident p) sub - | Sig_value _ | Sig_typext _ | Sig_class _ | Sig_class_type _ -> sub + | Sig_value _ | Sig_typext _ | Sig_implicit _ + | Sig_class _ | Sig_class_type _ -> sub let signature_item_ident = function | Sig_value (id, _) | Sig_typext (id, _, _) | Sig_type (id, _, _) | Sig_module (id, _, _) | Sig_modtype (id, _) | Sig_class (id, _, _) | Sig_class_type (id, _, _) -> id + | Sig_implicit _ -> assert false (* Given a signature and a root path, prefix all idents in the signature by the root path and build the corresponding substitution. *) let rec prefix_idents root pos sub = function - [] -> ([], sub) + | [] -> ([], sub) + | Sig_implicit _ :: rem -> + prefix_idents root pos sub rem | item :: rem -> let id = signature_item_ident item in let size = signature_item_size item in @@ -1189,6 +1226,8 @@ let subst_signature sub sg = Sig_class(id, Subst.class_declaration sub decl, x) | Sig_class_type(id, decl, x) -> Sig_class_type(id, Subst.cltype_declaration sub decl, x) + | Sig_implicit(path, arity) -> + Sig_implicit(Subst.module_path sub path, arity) ) sg @@ -1312,7 +1351,8 @@ and components_of_module_maker (env, sub, path, mty) = | Sig_class_type(id, decl, _) -> let decl' = Subst.cltype_declaration sub decl in c.comp_cltypes <- - Tbl.add (Ident.name id) (decl', !pos) c.comp_cltypes) + Tbl.add (Ident.name id) (decl', !pos) c.comp_cltypes + | Sig_implicit _ -> ()) sg pl; Structure_comps c | Mty_functor(param, ty_res) -> @@ -1604,6 +1644,7 @@ let add_item comp env = | Sig_modtype(id, decl) -> add_modtype id decl env | Sig_class(id, decl, _) -> add_class id decl env | Sig_class_type(id, decl, _) -> add_cltype id decl env + | Sig_implicit(path, arity) -> register_as_implicit path arity env let rec add_signature sg env = match sg with @@ -1637,6 +1678,8 @@ let open_signature slot root sg env0 = store_class slot (Ident.hide id) p decl env env0 | Sig_class_type(id, decl, _) -> store_cltype slot (Ident.hide id) p decl env env0 + | Sig_implicit(path, arity) -> + register_as_implicit path arity env ) env0 sg pl in { newenv with summary = Env_open(env0.summary, root) } diff --git a/typing/env.mli b/typing/env.mli index 329f8be7e4..3062f00911 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -134,6 +134,9 @@ val open_pers_signature: string -> t -> t val open_implicit: Path.t -> signature -> t -> t +(* Mark one path as implicit *) +val register_as_implicit: Path.t -> int -> t -> t + (* Insertion by name *) val enter_value: @@ -267,3 +270,4 @@ val fold_cltypes: (** Utilities *) val scrape_alias: t -> module_type -> module_type +val canonical_path: t -> Path.t -> Path.t diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index f794afc33c..2bca177578 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -175,7 +175,7 @@ module Constraints = struct and prepare_sig_item env cstrs field = match field with - | Sig_value _ | Sig_class _ | Sig_modtype _ + | Sig_value _ | Sig_class _ | Sig_modtype _ | Sig_implicit _ | Sig_class_type _ | Sig_typext _ -> [], cstrs, field | Sig_type (id,decl,recst) -> @@ -1030,30 +1030,6 @@ module Solution = struct let get {result} = Search.get result end -let rec canonical_path env path = - try - let md = Env.find_module path env in - match md.Types.md_type with - | Mty_alias path -> canonical_path env path - | _ -> match path with - | Path.Pident _ -> path - | Path.Pdot (p1,s,pos) -> - let p1' = canonical_path env p1 in - if p1 == p1' then - path - else - Path.Pdot (p1', s, pos) - | Path.Papply (p1, p2, i) -> - let p1' = canonical_path env p1 - and p2' = canonical_path env p2 in - if p1' == p1 && p2 == p2' then - path - else - Path.Papply (p1', p2', i) - with Not_found -> - (*?!*) - path - let find_pending_instance inst = let snapshot = Btype.snapshot () in let vars, target = target_of_pending inst in @@ -1081,14 +1057,14 @@ let find_pending_instance inst = try let solution = Solution.search query in let path = Solution.get solution in - let reference = canonical_path env path in + let reference = Env.canonical_path env path in let rec check_alternatives solution = match (try Some (Solution.search_next solution) with _ -> None) with | Some alternative -> let path' = Solution.get alternative in - let reference' = canonical_path env (Solution.get alternative) in + let reference' = Env.canonical_path env (Solution.get alternative) in if reference = reference' then check_alternatives alternative else diff --git a/typing/includemod.ml b/typing/includemod.ml index 1acafd96f0..10e3c364bf 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -165,11 +165,13 @@ let item_ident_name = function | Sig_modtype(id, d) -> (id, d.mtd_loc, Field_modtype(Ident.name id)) | Sig_class(id, d, _) -> (id, d.cty_loc, Field_class(Ident.name id)) | Sig_class_type(id, d, _) -> (id, d.clty_loc, Field_classtype(Ident.name id)) + | Sig_implicit _ -> assert false let is_runtime_component = function | Sig_value(_,{val_kind = Val_prim _}) | Sig_type(_,_,_) | Sig_modtype(_,_) + | Sig_implicit(_,_) | Sig_class_type(_,_,_) -> false | Sig_value(_,_) | Sig_typext(_,_,_) @@ -329,6 +331,7 @@ and signatures env cxt subst sig1 sig2 = The table is indexed by kind and name of component *) let rec build_component_table pos tbl = function [] -> pos, tbl + | Sig_implicit _ :: rem -> build_component_table pos tbl rem | item :: rem -> let (id, _loc, name) = item_ident_name item in let nextpos = if is_runtime_component item then pos + 1 else pos in @@ -360,6 +363,8 @@ and signatures env cxt subst sig1 sig2 = Tcoerce_structure (cc, id_pos_list) | _ -> raise(Error unpaired) end + | Sig_implicit _ :: rem -> + pair_components subst paired unpaired rem | item2 :: rem -> let (id2, loc, name2) = item_ident_name item2 in let name2, report = @@ -382,7 +387,7 @@ and signatures env cxt subst sig1 sig2 = Subst.add_module id2 (Pident id1) subst | Sig_modtype _ -> Subst.add_modtype id2 (Mty_ident (Pident id1)) subst - | Sig_value _ | Sig_typext _ + | Sig_value _ | Sig_typext _ | Sig_implicit _ | Sig_class _ | Sig_class_type _ -> subst in diff --git a/typing/mtype.ml b/typing/mtype.ml index ee9bef23c6..3f73743bf5 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -87,6 +87,8 @@ and strengthen_sig env sg p = sigelt :: strengthen_sig env rem p | (Sig_class_type(id, decl, rs) as sigelt) :: rem -> sigelt :: strengthen_sig env rem p + | (Sig_implicit _ as sigelt) :: rem -> + sigelt :: strengthen_sig env rem p and strengthen_decl env md p = {md with md_type = strengthen env md.md_type p} @@ -101,6 +103,16 @@ type variance = Co | Contra | Strict let nondep_supertype env mid mty = + let nondep_alias env p = + if Path.isfree mid p then + let p = Env.canonical_path env p in + if Path.isfree mid p then + (* FIXME: do better *) + failwith "Path would escape" + else p + else p + in + let rec nondep_mty env va mty = match mty with Mty_ident p -> @@ -168,6 +180,9 @@ let nondep_supertype env mid mty = | Sig_class_type(id, d, rs) -> Sig_class_type(id, Ctype.nondep_cltype_declaration env mid d, rs) :: rem' + | Sig_implicit (path, arity) -> + Sig_implicit (nondep_alias env path, arity) + :: rem' and nondep_modtype_decl env mtd = {mtd with mtd_type = Misc.may_map (nondep_mty env Strict) mtd.mtd_type} @@ -229,7 +244,7 @@ and type_paths_sig env p pos sg = type_paths_sig (Env.add_modtype id decl env) p pos rem | (Sig_typext _ | Sig_class _) :: rem -> type_paths_sig env p (pos+1) rem - | (Sig_class_type _) :: rem -> + | (Sig_class_type _ | Sig_implicit _) :: rem -> type_paths_sig env p pos rem let rec no_code_needed env mty = @@ -250,7 +265,7 @@ and no_code_needed_sig env sg = | Sig_module(id, md, _) :: rem -> no_code_needed env md.md_type && no_code_needed_sig (Env.add_module_declaration id md env) rem - | (Sig_type _ | Sig_modtype _ | Sig_class_type _) :: rem -> + | (Sig_type _ | Sig_modtype _ | Sig_class_type _ | Sig_implicit _) :: rem -> no_code_needed_sig env rem | (Sig_typext _ | Sig_class _) :: rem -> false @@ -285,7 +300,8 @@ and contains_type_item env = function | Sig_type _ | Sig_typext _ | Sig_class _ - | Sig_class_type _ -> + | Sig_class_type _ + | Sig_implicit _-> () let contains_type env mty = diff --git a/typing/oprint.ml b/typing/oprint.ml index 54094593e4..678e219562 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -469,6 +469,11 @@ and print_out_sig_item ppf = in fprintf ppf "@[<2>%s %a :@ %a%a@]" kwd value_ident name !out_type ty pr_prims prims + | Osig_implicit (name, arity) -> + print_ident ppf name; + for _i = 1 to arity do + pp_print_string ppf "(_)" + done and print_out_type_decl kwd ppf td = let print_constraints ppf = diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 77d6128444..00d8ca8d3a 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -97,6 +97,7 @@ and out_sig_item = | Osig_module of string * out_module_type * out_rec_status * Asttypes.implicit_flag | Osig_type of out_type_decl * out_rec_status | Osig_value of string * out_type * string list + | Osig_implicit of out_ident * int and out_type_decl = { otype_name: string; otype_params: (string * (bool * bool)) list; diff --git a/typing/path.ml b/typing/path.ml index 7946ad36e6..2b53babdbc 100644 --- a/typing/path.ml +++ b/typing/path.ml @@ -67,6 +67,8 @@ let rec to_longident = function | Papply (p1, p2, i) -> Longident.Lapply (to_longident p1, to_longident p2, i) +let to_string p = Longident.to_string (to_longident p) + let rec flatten acc = function | Pident id -> id, acc | Pdot (p, s, pos) -> flatten ((s,pos) :: acc) p diff --git a/typing/path.mli b/typing/path.mli index a0afe386a4..a534ec4acf 100644 --- a/typing/path.mli +++ b/typing/path.mli @@ -33,6 +33,8 @@ val head: t -> Ident.t val last: t -> string val to_longident: t -> Longident.t +val to_string: t -> string val flatten: t -> Ident.t * (string * int) list val unflatten: Ident.t -> (string * int) list -> t + diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 8f12e09096..b782488b1e 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1254,6 +1254,8 @@ and tree_of_signature_rec env' = function [tree_of_class_declaration id decl rs] | Sig_class_type(id, decl, rs) -> [tree_of_cltype_declaration id decl rs] + | Sig_implicit(path, arity) -> + [Osig_implicit (tree_of_path path, arity)] in let env' = Env.add_signature (item :: sg) env' in trees @ tree_of_signature_rec env' rem diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 6d7506f735..5da4bab654 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -671,6 +671,10 @@ and signature_item i ppf x = line i ppf "Psig_include\n"; attributes i ppf incl.incl_attributes; module_type i ppf incl.incl_mod + | Tsig_implicit imp -> + line i ppf "Psig_implicit %a %d\n" + fmt_path imp.imp_path imp.imp_arity; + attributes i ppf imp.imp_attributes | Tsig_class (l) -> line i ppf "Psig_class\n"; list i class_description ppf l; @@ -806,6 +810,10 @@ and structure_item i ppf x = line i ppf "Pstr_include"; attributes i ppf incl.incl_attributes; module_expr i ppf incl.incl_mod; + | Tstr_implicit imp -> + line i ppf "Pstr_implicit %a %d\n" + fmt_path imp.imp_path imp.imp_arity; + attributes i ppf imp.imp_attributes | Tstr_attribute (s, arg) -> line i ppf "Pstr_attribute \"%s\"\n" s.txt; Printast.payload i ppf arg diff --git a/typing/subst.ml b/typing/subst.ml index 125c4b56a6..fe410fa976 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -332,6 +332,10 @@ let rec rename_bound_idents s idents = function Sig_class(id, _, _) | Sig_class_type(id, _, _)) :: sg -> let id' = Ident.rename id in rename_bound_idents s (id' :: idents) sg + | Sig_implicit (path,_) :: sg -> + (* Ugly: Put a fake identifier *) + let id' = Path.head path in + rename_bound_idents s (id' :: idents) sg let rec modtype s = function Mty_ident p as mty -> @@ -385,6 +389,7 @@ and signature_component s comp newid = Sig_class(newid, class_declaration s d, rs) | Sig_class_type(id, d, rs) -> Sig_class_type(newid, cltype_declaration s d, rs) + | Sig_implicit _ as sgi -> sgi and module_declaration s decl = { diff --git a/typing/typecore.ml b/typing/typecore.ml index 98daa6227b..cc5b08ad17 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -195,6 +195,7 @@ let iter_expression f e = | Pstr_exception _ | Pstr_modtype _ | Pstr_open _ + | Pstr_implicit _ | Pstr_class_type _ | Pstr_attribute _ | Pstr_extension _ -> () @@ -1454,7 +1455,8 @@ and is_nonexpansive_mod mexp = List.for_all (fun item -> match item.str_desc with | Tstr_eval _ | Tstr_primitive _ | Tstr_type _ - | Tstr_modtype _ | Tstr_open _ | Tstr_class_type _ -> true + | Tstr_modtype _ | Tstr_open _ + | Tstr_implicit _ | Tstr_class_type _ -> true | Tstr_value (_, pat_exp_list) -> List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list | Tstr_module {mb_expr=m;_} diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 3402adfd71..c1463aac2f 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -235,6 +235,7 @@ and structure_item_desc = | Tstr_class of (class_declaration * string list * virtual_flag) list | Tstr_class_type of (Ident.t * string loc * class_type_declaration) list | Tstr_include of include_declaration + | Tstr_implicit of implicit_description | Tstr_attribute of attribute and module_binding = @@ -300,6 +301,7 @@ and signature_item_desc = | Tsig_modtype of module_type_declaration | Tsig_open of open_description | Tsig_include of include_description + | Tsig_implicit of implicit_description | Tsig_class of class_description list | Tsig_class_type of class_type_declaration list | Tsig_attribute of attribute @@ -332,6 +334,15 @@ and open_description = open_attributes: attribute list; } +and implicit_description = + { + imp_path: Path.t; + imp_txt: Longident.t loc; + imp_arity: int; + imp_loc: Location.t; + imp_attributes: attribute list; + } + and 'a include_infos = { incl_mod: 'a; diff --git a/typing/typedtree.mli b/typing/typedtree.mli index b1f95adf52..e7696d1dd0 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -234,6 +234,7 @@ and structure_item_desc = | Tstr_class of (class_declaration * string list * virtual_flag) list | Tstr_class_type of (Ident.t * string loc * class_type_declaration) list | Tstr_include of include_declaration + | Tstr_implicit of implicit_description | Tstr_attribute of attribute and module_binding = @@ -299,6 +300,7 @@ and signature_item_desc = | Tsig_modtype of module_type_declaration | Tsig_open of open_description | Tsig_include of include_description + | Tsig_implicit of implicit_description | Tsig_class of class_description list | Tsig_class_type of class_type_declaration list | Tsig_attribute of attribute @@ -331,6 +333,15 @@ and open_description = open_attributes: attribute list; } +and implicit_description = + { + imp_path: Path.t; + imp_txt: Longident.t loc; + imp_arity: int; + imp_loc: Location.t; + imp_attributes: attribute list; + } + and 'a include_infos = { incl_mod: 'a; diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 50f43d411a..da649aeba0 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -140,6 +140,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tstr_recmodule list -> List.iter iter_module_binding list | Tstr_modtype mtd -> iter_module_type_declaration mtd | Tstr_open _ -> () + | Tstr_implicit _ -> () | Tstr_class list -> List.iter (fun (ci, _, _) -> iter_class_declaration ci) list | Tstr_class_type list -> @@ -366,6 +367,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tsig_modtype mtd -> iter_module_type_declaration mtd | Tsig_open _ -> () + | Tsig_implicit _ -> () | Tsig_include incl -> iter_module_type incl.incl_mod | Tsig_class list -> List.iter iter_class_description list diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 5cd6471f71..45c72c4480 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -131,6 +131,7 @@ module MakeMap(Map : MapArgument) = struct | Tstr_modtype mtd -> Tstr_modtype (map_module_type_declaration mtd) | Tstr_open od -> Tstr_open od + | Tstr_implicit id -> Tstr_implicit id | Tstr_class list -> let list = List.map @@ -418,6 +419,7 @@ module MakeMap(Map : MapArgument) = struct | Tsig_modtype mtd -> Tsig_modtype (map_module_type_declaration mtd) | Tsig_open _ -> item.sig_desc + | Tsig_implicit _ -> item.sig_desc | Tsig_include incl -> Tsig_include {incl with incl_mod = map_module_type incl.incl_mod} | Tsig_class list -> Tsig_class (List.map map_class_description list) diff --git a/typing/typemod.ml b/typing/typemod.ml index 4da99028dc..7e249fdc28 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -90,6 +90,30 @@ let type_open ?toplevel env sod = in (path, newenv, od) +let type_implicit env id = + let arity = id.pimp_arity in + let lid = id.pimp_lid.Location.txt in + let path = Env.lookup_module ~load:true lid env in + (* FIXME: Check that arity match *) + let newenv = Env.register_as_implicit path arity env in + let imp = {Typedtree. imp_path = path; + imp_txt = id.pimp_lid; + imp_loc = id.pimp_loc; + imp_attributes = id.pimp_attributes; + imp_arity = arity} + in + path, arity, newenv, imp + +(* Bind a module as implicit in current environment *) + +let type_open_ ?toplevel opf env loc lid = + let path, md = Typetexp.find_module env lid.loc lid.txt in + let sg = extract_sig_open env lid.loc md.md_type in + let env = match opf with + | Open_all ovf -> Env.open_signature ~loc ?toplevel ovf path sg env + | Open_implicit -> Env.open_implicit path sg env in + path, env + (* Record a module type *) let rm node = Stypes.record (Stypes.Ti_mod node); @@ -688,6 +712,11 @@ and transl_signature env sg = let (trem, rem, final_env) = transl_sig newenv srem in mksig (Tsig_open od) env loc :: trem, rem, final_env + | Psig_implicit id -> + let (path, arity, newenv, imp) = type_implicit env id in + let (trem, rem, final_env) = transl_sig newenv srem in + mksig (Tsig_implicit imp) env loc :: trem, + Sig_implicit (path, arity) :: rem, final_env | Psig_include sincl -> let smty = sincl.pincl_mod in let tmty = transl_modtype env smty in @@ -1472,6 +1501,9 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Pstr_open sod -> let (path, newenv, od) = type_open ~toplevel env sod in Tstr_open od, [], newenv + | Pstr_implicit id -> + let (path, arity, newenv, imp) = type_implicit env id in + Tstr_implicit imp, [], newenv | Pstr_class cl -> List.iter (fun {pci_name = name} -> check_name "type" type_names name) @@ -1541,7 +1573,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Sig_value (_, {val_kind=Val_reg}) | Sig_typext _ | Sig_class _ as it -> incr pos; it - | Sig_value _ | Sig_type _ | Sig_modtype _ + | Sig_value _ | Sig_type _ | Sig_modtype _ | Sig_implicit _ | Sig_class_type _ as it -> it) sg diff --git a/typing/types.ml b/typing/types.ml index 333d2b125e..82db905263 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -298,6 +298,7 @@ and signature_item = | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status + | Sig_implicit of Path.t * int and module_declaration = { diff --git a/typing/types.mli b/typing/types.mli index f3ff943e20..244d1a3f25 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -288,6 +288,7 @@ and signature_item = | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status + | Sig_implicit of Path.t * int and module_declaration = { From 24e07d4adf50779b2df5d8710c139622f3989910 Mon Sep 17 00:00:00 2001 From: Frederic Bour Date: Fri, 12 Dec 2014 11:53:18 +0100 Subject: [PATCH 02/10] Add implicit statements in surface language --- parsing/parser.mly | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/parsing/parser.mly b/parsing/parser.mly index 9df56c2e34..9558f4bfc5 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -670,6 +670,7 @@ structure_item: { mkstr(Pstr_modtype (Mtd.mk (mkrhs $3 3) ~typ:$5 ~attrs:$6 ~loc:(symbol_rloc()))) } | open_statement { mkstr(Pstr_open $1) } + | implicit_statement { mkstr(Pstr_implicit $1) } | CLASS class_declarations { mkstr(Pstr_class (List.rev $2)) } | CLASS TYPE class_type_declarations @@ -704,6 +705,14 @@ module_binding: | IMPLICIT MODULE UIDENT module_binding_body post_item_attributes { Mb.mk (mkrhs $3 3) $4 ~implicit_:Implicit ~attrs:$5 ~loc:(symbol_rloc ()) } + +implicit_statement: + | IMPLICIT mod_longident implicit_statement_arity post_item_attributes + { Imp.mk (mkrhs $2 2) ~arity:$3 ~attrs:$4 ~loc:(symbol_rloc()) } +; +implicit_statement_arity: + | /* empty */ { 0 } + | implicit_statement_arity LPAREN UNDERSCORE RPAREN { 1 + $1 } ; /* Module types */ @@ -783,6 +792,8 @@ signature_item: ~attrs:$6)) } | open_statement { mksig(Psig_open $1) } + | implicit_statement + { mksig(Psig_implicit $1) } | INCLUDE module_type post_item_attributes %prec below_WITH { mksig(Psig_include (Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()))) } | CLASS class_descriptions From af087e8f7c109fa6e8c2f6cc29cfd91c7821a33b Mon Sep 17 00:00:00 2001 From: Leo White Date: Sat, 2 Jan 2016 13:41:25 +0000 Subject: [PATCH 03/10] Add explicit --- bytecomp/translmod.ml | 2 +- parsing/ast_helper.ml | 4 +-- parsing/ast_helper.mli | 2 +- parsing/ast_mapper.ml | 5 ++-- parsing/lexer.mll | 3 +- parsing/longident.ml | 5 +++- parsing/parser.mly | 13 ++++----- parsing/parsetree.mli | 6 +++- parsing/pprintast.ml | 29 ++++++++++++++------ parsing/printast.ml | 23 ++++++++++------ tools/untypeast.ml | 22 +++++++++------ typing/env.ml | 62 ++++++++++++++++++++++++++---------------- typing/env.mli | 4 +-- typing/ident.ml | 2 ++ typing/ident.mli | 1 + typing/includemod.ml | 2 +- typing/mtype.ml | 23 ++++++++-------- typing/oprint.ml | 12 ++++---- typing/outcometree.mli | 5 +++- typing/printtyp.ml | 9 ++++-- typing/printtyped.ml | 15 +++++++--- typing/subst.ml | 16 +++++++---- typing/subst.mli | 1 + typing/typedtree.ml | 6 +++- typing/typedtree.mli | 6 +++- typing/typemod.ml | 52 +++++++++++++++++++++-------------- typing/types.ml | 13 ++++++++- typing/types.mli | 13 ++++++++- 28 files changed, 232 insertions(+), 124 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index fc4214eb90..f3387362fa 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -226,7 +226,7 @@ let init_shape modl = :: init_shape_struct env rem | Sig_class_type(id, ctyp, _) :: rem -> init_shape_struct env rem - | Sig_implicit(_,_) :: rem -> + | Sig_implicit _ :: rem -> init_shape_struct env rem in try diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index e34526d207..0eab05c863 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -321,12 +321,12 @@ module Opn = struct end module Imp = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(arity = 0) lid = + let mk ?(loc = !default_loc) ?(attrs = []) kind lid = { pimp_lid = lid; + pimp_kind = kind; pimp_loc = loc; pimp_attributes = attrs; - pimp_arity = arity; } end diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 67b6910982..2af224cb9e 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -275,7 +275,7 @@ module Opn: (* Implicit bindings *) module Imp: sig - val mk: ?loc: loc -> ?attrs:attrs -> ?arity:int -> lid -> implicit_description + val mk: ?loc: loc -> ?attrs:attrs -> implicit_kind -> lid -> implicit_description end (* Includes *) diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index c33943651b..ad4ddd4fa5 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -583,9 +583,8 @@ let default_mapper = ); implicit_description = - (fun this {pimp_lid; pimp_arity; pimp_attributes; pimp_loc} -> - Imp.mk (map_loc this pimp_lid) - ~arity:pimp_arity + (fun this {pimp_lid; pimp_kind; pimp_attributes; pimp_loc} -> + Imp.mk pimp_kind (map_loc this pimp_lid) ~loc:(this.location this pimp_loc) ~attrs:(this.attributes this pimp_attributes) ); diff --git a/parsing/lexer.mll b/parsing/lexer.mll index b108113fa4..b93a661531 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -45,6 +45,7 @@ let keyword_table = "else", ELSE; "end", END; "exception", EXCEPTION; + "explicit", EXPLICIT; "external", EXTERNAL; "false", FALSE; "for", FOR; @@ -52,6 +53,7 @@ let keyword_table = "function", FUNCTION; "functor", FUNCTOR; "if", IF; + "implicit", IMPLICIT; "in", IN; "include", INCLUDE; "inherit", INHERIT; @@ -61,7 +63,6 @@ let keyword_table = "match", MATCH; "method", METHOD; "module", MODULE; - "implicit", IMPLICIT; "mutable", MUTABLE; "new", NEW; "object", OBJECT; diff --git a/parsing/longident.ml b/parsing/longident.ml index ea3bb87bce..9b7b87c87b 100644 --- a/parsing/longident.ml +++ b/parsing/longident.ml @@ -43,4 +43,7 @@ let parse s = let rec to_string = function | Lident s -> s | Ldot (t,s) -> to_string t ^ "." ^ s - | Lapply (t1,t2) -> to_string t1 ^ "(" ^ to_string t2 ^ ")" + | Lapply (t1,t2, Asttypes.Nonimplicit) -> + to_string t1 ^ "(" ^ to_string t2 ^ ")" + | Lapply (t1,t2, Asttypes.Implicit) -> + to_string t1 ^ "{" ^ to_string t2 ^ "}" diff --git a/parsing/parser.mly b/parsing/parser.mly index 9558f4bfc5..06c5a9fabb 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -326,6 +326,7 @@ let mkctf_attrs d attrs = %token EOF %token EQUAL %token EXCEPTION +%token EXPLICIT %token EXTERNAL %token FALSE %token FLOAT @@ -705,14 +706,12 @@ module_binding: | IMPLICIT MODULE UIDENT module_binding_body post_item_attributes { Mb.mk (mkrhs $3 3) $4 ~implicit_:Implicit ~attrs:$5 ~loc:(symbol_rloc ()) } - -implicit_statement: - | IMPLICIT mod_longident implicit_statement_arity post_item_attributes - { Imp.mk (mkrhs $2 2) ~arity:$3 ~attrs:$4 ~loc:(symbol_rloc()) } ; -implicit_statement_arity: - | /* empty */ { 0 } - | implicit_statement_arity LPAREN UNDERSCORE RPAREN { 1 + $1 } +implicit_statement: + | IMPLICIT mod_longident post_item_attributes + { Imp.mk Pimp_implicit (mkrhs $2 2) ~attrs:$3 ~loc:(symbol_rloc()) } + | EXPLICIT mod_longident post_item_attributes + { Imp.mk Pimp_explicit (mkrhs $2 2) ~attrs:$3 ~loc:(symbol_rloc()) } ; /* Module types */ diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index ae1b033b16..2d93ea505e 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -720,11 +720,15 @@ and open_description = and implicit_description = { pimp_lid: Longident.t loc; + pimp_kind: implicit_kind; pimp_loc: Location.t; pimp_attributes: attributes; - pimp_arity: int; } +and implicit_kind = + | Pimp_implicit + | Pimp_explicit + and 'a include_infos = { pincl_mod: 'a; diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index fda4c93030..cea63549f9 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1071,11 +1071,16 @@ class printer ()= object(self:'self) | Psig_extension(e, a) -> self#item_extension f e; self#item_attributes f a - | Psig_implicit id -> - (*FIXME Arity*) - pp f "@[implicit@ %a@]%a" - self#longident_loc id.pimp_lid - self#item_attributes id.pimp_attributes + | Psig_implicit imp -> + let kind = + match imp.pimp_kind with + | Pimp_implicit -> "implicit" + | Pimp_explicit -> "explicit" + in + pp f "@[%s@ %a@]%a" + kind + self#longident_loc imp.pimp_lid + self#item_attributes imp.pimp_attributes end method module_expr f x = @@ -1262,10 +1267,16 @@ class printer ()= object(self:'self) | Pstr_extension(e, a) -> self#item_extension f e; self#item_attributes f a - | Pstr_implicit id -> - pp f "@[implicit@ %a@]%a" - self#longident_loc id.pimp_lid - self#item_attributes id.pimp_attributes + | Pstr_implicit imp -> + let kind = + match imp.pimp_kind with + | Pimp_implicit -> "implicit" + | Pimp_explicit -> "explicit" + in + pp f "@[%s@ %a@]%a" + kind + self#longident_loc imp.pimp_lid + self#item_attributes imp.pimp_attributes end method type_param f (ct, a) = pp f "%s%a" (type_variance a) self#core_type ct diff --git a/parsing/printast.ml b/parsing/printast.ml index 179f669ce8..5eabf860f2 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -709,10 +709,11 @@ and signature_item i ppf x = | Psig_attribute (s, arg) -> line i ppf "Psig_attribute \"%s\"\n" s.txt; payload i ppf arg - | Psig_implicit id -> - line i ppf "Psig_implicit %a %d\n" - fmt_longident_loc id.pimp_lid id.pimp_arity; - attributes i ppf id.pimp_attributes + | Psig_implicit imp -> + line i ppf "Psig_implicit %a\n" + fmt_longident_loc imp.pimp_lid; + implicit_kind i ppf imp.pimp_kind; + attributes i ppf imp.pimp_attributes and modtype_declaration i ppf = function | None -> line i ppf "#abstract" @@ -842,10 +843,11 @@ and structure_item i ppf x = | Pstr_attribute (s, arg) -> line i ppf "Pstr_attribute \"%s\"\n" s.txt; payload i ppf arg - | Pstr_implicit id -> - line i ppf "Pstr_implicit %a %d\n" - fmt_longident_loc id.pimp_lid id.pimp_arity; - attributes i ppf id.pimp_attributes + | Pstr_implicit imp -> + line i ppf "Pstr_implicit %a\n" + fmt_longident_loc imp.pimp_lid; + implicit_kind i ppf imp.pimp_kind; + attributes i ppf imp.pimp_attributes and module_declaration i ppf pmd = string_loc i ppf pmd.pmd_name; @@ -859,6 +861,11 @@ and module_binding i ppf pmb = attributes i ppf pmb.pmb_attributes; module_expr (i+1) ppf pmb.pmb_expr +and implicit_kind i ppf kind = + match kind with + | Pimp_implicit -> line i ppf "Pimp_implicit" + | Pimp_explicit -> line i ppf "Pimp_explicit" + and core_type_x_core_type_x_location i ppf (ct1, ct2, l) = line i ppf " %a\n" fmt_location l; core_type (i+1) ppf ct1; diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 7be5435af6..264dd43f83 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -72,10 +72,7 @@ and untype_structure_item item = popen_loc = od.open_loc; } | Tstr_implicit imp -> - Pstr_implicit {pimp_lid = imp.imp_txt; pimp_arity = imp.imp_arity; - pimp_attributes = imp.imp_attributes; - pimp_loc = imp.imp_loc; - } + Pstr_implicit (untype_implicit_description imp) | Tstr_class list -> Pstr_class (List.map @@ -196,6 +193,18 @@ and untype_extension_constructor ext = pext_attributes = ext.ext_attributes; } +and untype_implicit_description imp = + { + pimp_lid = imp.imp_txt; + pimp_kind = untype_implicit_kind imp.imp_kind; + pimp_attributes = imp.imp_attributes; + pimp_loc = imp.imp_loc; + } + +and untype_implicit_kind = function + | Timp_implicit -> Pimp_implicit + | Timp_explicit -> Pimp_explicit + and untype_pattern pat = let desc = match pat with @@ -420,10 +429,7 @@ and untype_signature_item item = popen_loc = od.open_loc; } | Tsig_implicit imp -> - Psig_implicit {pimp_lid = imp.imp_txt; pimp_arity = imp.imp_arity; - pimp_attributes = imp.imp_attributes; - pimp_loc = imp.imp_loc; - } + Psig_implicit (untype_implicit_description imp) | Tsig_include incl -> Psig_include {pincl_mod = untype_module_type incl.incl_mod; pincl_attributes = incl.incl_attributes; diff --git a/typing/env.ml b/typing/env.ml index dbebc946b4..dde0970d16 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -645,12 +645,6 @@ let rec implicit_cannot_occur path env = let implicit_instances env = env.implicit_instances -let register_as_implicit path arity env = - let md = find_module path env in - let md = {md with md_implicit = Implicit arity} in - (* FIXME: Check arity *) - register_if_implicit path md env - (* Lookup by name *) exception Recmodule @@ -1119,7 +1113,7 @@ let scrape_alias env mty = scrape_alias env mty let rec canonical_path env path = try - let md = Env.find_module path env in + let md = find_module path env in match md.Types.md_type with | Mty_alias path -> canonical_path env path | _ -> match path with @@ -1226,8 +1220,8 @@ let subst_signature sub sg = Sig_class(id, Subst.class_declaration sub decl, x) | Sig_class_type(id, decl, x) -> Sig_class_type(id, Subst.cltype_declaration sub decl, x) - | Sig_implicit(path, arity) -> - Sig_implicit(Subst.module_path sub path, arity) + | Sig_implicit imp -> + Sig_implicit (Subst.implicit_description sub imp) ) sg @@ -1255,21 +1249,41 @@ let prefix_idents_and_subst root sub sg = else prefix_idents_and_subst root sub sg +let register_as_implicit path md env = + let path = canonical_path env path in + let mty = !strengthen env md.md_type path in + let rec add acc params mty = + let acc = ((path, List.rev params, mty) :: acc) in + match scrape_alias env mty with + | Mty_functor (Mpar_implicit(id, param), res) -> + let params = (id, param) :: params in + add acc params res + | _ -> acc + in + let implicit_instances = add env.implicit_instances [] mty in + {env with implicit_instances} + +let unregister_as_implicit path env = + let path = canonical_path env path in + let implicit_instances = + List.filter + (fun (p, _, _) -> not (Path.same path p)) + env.implicit_instances + in + {env with implicit_instances} + let register_if_implicit path md env = match md.md_implicit with | Asttypes.Nonimplicit -> env - | Asttypes.Implicit -> - let mty = !strengthen env md.md_type path in - let rec add acc params mty = - let acc = ((path, List.rev params, mty) :: acc) in - match scrape_alias env mty with - | Mty_functor (Mpar_implicit(id, param), res) -> - let params = (id, param) :: params in - add acc params res - | _ -> acc - in - let implicit_instances = add env.implicit_instances [] mty in - {env with implicit_instances} + | Asttypes.Implicit -> register_as_implicit path md env + +let add_implicit imp env = + match imp.imp_kind with + | Imp_implicit -> + let md = find_module imp.imp_path env in + register_as_implicit imp.imp_path md env + | Imp_explicit -> + unregister_as_implicit imp.imp_path env (* Compute structure descriptions *) @@ -1644,7 +1658,7 @@ let add_item comp env = | Sig_modtype(id, decl) -> add_modtype id decl env | Sig_class(id, decl, _) -> add_class id decl env | Sig_class_type(id, decl, _) -> add_cltype id decl env - | Sig_implicit(path, arity) -> register_as_implicit path arity env + | Sig_implicit imp -> add_implicit imp env let rec add_signature sg env = match sg with @@ -1678,8 +1692,8 @@ let open_signature slot root sg env0 = store_class slot (Ident.hide id) p decl env env0 | Sig_class_type(id, decl, _) -> store_cltype slot (Ident.hide id) p decl env env0 - | Sig_implicit(path, arity) -> - register_as_implicit path arity env + | Sig_implicit imp -> + add_implicit imp env ) env0 sg pl in { newenv with summary = Env_open(env0.summary, root) } diff --git a/typing/env.mli b/typing/env.mli index 3062f00911..d1b69fcacc 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -118,6 +118,7 @@ val add_modtype: Ident.t -> modtype_declaration -> t -> t val add_class: Ident.t -> class_declaration -> t -> t val add_cltype: Ident.t -> class_type_declaration -> t -> t val add_local_constraint: Ident.t -> type_declaration -> int -> t -> t +val add_implicit: implicit_description -> t -> t (* Insertion of all fields of a signature. *) @@ -134,9 +135,6 @@ val open_pers_signature: string -> t -> t val open_implicit: Path.t -> signature -> t -> t -(* Mark one path as implicit *) -val register_as_implicit: Path.t -> int -> t -> t - (* Insertion by name *) val enter_value: diff --git a/typing/ident.ml b/typing/ident.ml index 5302a61284..b2fc903439 100644 --- a/typing/ident.ml +++ b/typing/ident.ml @@ -25,6 +25,8 @@ let create s = incr currentstamp; { name = s; stamp = !currentstamp; flags = 0 } +let dummy = create "*dummy*" + let create_predef_exn s = incr currentstamp; { name = s; stamp = !currentstamp; flags = predef_exn_flag } diff --git a/typing/ident.mli b/typing/ident.mli index 601898b47b..c8a48a8c4d 100644 --- a/typing/ident.mli +++ b/typing/ident.mli @@ -15,6 +15,7 @@ type t = { stamp: int; name: string; mutable flags: int } val create: string -> t +val dummy: t val create_persistent: string -> t val create_predef_exn: string -> t val rename: t -> t diff --git a/typing/includemod.ml b/typing/includemod.ml index 10e3c364bf..e994e867e1 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -171,7 +171,7 @@ let is_runtime_component = function | Sig_value(_,{val_kind = Val_prim _}) | Sig_type(_,_,_) | Sig_modtype(_,_) - | Sig_implicit(_,_) + | Sig_implicit _ | Sig_class_type(_,_,_) -> false | Sig_value(_,_) | Sig_typext(_,_,_) diff --git a/typing/mtype.ml b/typing/mtype.ml index 3f73743bf5..cd78f8b1af 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -103,16 +103,6 @@ type variance = Co | Contra | Strict let nondep_supertype env mid mty = - let nondep_alias env p = - if Path.isfree mid p then - let p = Env.canonical_path env p in - if Path.isfree mid p then - (* FIXME: do better *) - failwith "Path would escape" - else p - else p - in - let rec nondep_mty env va mty = match mty with Mty_ident p -> @@ -180,16 +170,25 @@ let nondep_supertype env mid mty = | Sig_class_type(id, d, rs) -> Sig_class_type(id, Ctype.nondep_cltype_declaration env mid d, rs) :: rem' - | Sig_implicit (path, arity) -> - Sig_implicit (nondep_alias env path, arity) + | Sig_implicit imp -> + Sig_implicit (nondep_implicit env imp) :: rem' and nondep_modtype_decl env mtd = {mtd with mtd_type = Misc.may_map (nondep_mty env Strict) mtd.mtd_type} + and nondep_implicit env imp = + let path = imp.imp_path in + if Path.isfree mid path then + let path = Env.normalize_path None env path in + if Path.isfree mid path then raise Not_found + else { imp with imp_path = path } + else imp + in nondep_mty env Co mty + let enrich_typedecl env p decl = match decl.type_manifest with Some ty -> decl diff --git a/typing/oprint.ml b/typing/oprint.ml index 678e219562..dada6997ec 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -469,11 +469,13 @@ and print_out_sig_item ppf = in fprintf ppf "@[<2>%s %a :@ %a%a@]" kwd value_ident name !out_type ty pr_prims prims - | Osig_implicit (name, arity) -> - print_ident ppf name; - for _i = 1 to arity do - pp_print_string ppf "(_)" - done + | Osig_implicit (kind, name) -> + let kwd = + match kind with + | Oimp_implicit -> "implicit" + | Oimp_explicit -> "explicit" + in + fprintf ppf "@[<2>%s %a@]" kwd print_ident name and print_out_type_decl kwd ppf td = let print_constraints ppf = diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 00d8ca8d3a..47d93958f9 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -97,7 +97,7 @@ and out_sig_item = | Osig_module of string * out_module_type * out_rec_status * Asttypes.implicit_flag | Osig_type of out_type_decl * out_rec_status | Osig_value of string * out_type * string list - | Osig_implicit of out_ident * int + | Osig_implicit of out_implicit_kind * out_ident and out_type_decl = { otype_name: string; otype_params: (string * (bool * bool)) list; @@ -116,6 +116,9 @@ and out_type_extension = otyext_params: string list; otyext_constructors: (string * out_type list * out_type option) list; otyext_private: Asttypes.private_flag } +and out_implicit_kind = + | Oimp_implicit + | Oimp_explicit and out_rec_status = | Orec_not | Orec_first diff --git a/typing/printtyp.ml b/typing/printtyp.ml index b782488b1e..0f5b69cd63 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1158,6 +1158,10 @@ let tree_of_cltype_declaration id cl rs = let cltype_declaration id ppf cl = !Oprint.out_sig_item ppf (tree_of_cltype_declaration id cl Trec_first) +let tree_of_implicit_kind = function + | Imp_implicit -> Oimp_implicit + | Imp_explicit -> Oimp_explicit + (* Print a module type *) let wrap_env fenv ftree arg = @@ -1254,8 +1258,9 @@ and tree_of_signature_rec env' = function [tree_of_class_declaration id decl rs] | Sig_class_type(id, decl, rs) -> [tree_of_cltype_declaration id decl rs] - | Sig_implicit(path, arity) -> - [Osig_implicit (tree_of_path path, arity)] + | Sig_implicit imp -> + [Osig_implicit (tree_of_implicit_kind imp.imp_kind, + tree_of_path imp.imp_path)] in let env' = Env.add_signature (item :: sg) env' in trees @ tree_of_signature_rec env' rem diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 5da4bab654..4678c3d26f 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -611,6 +611,11 @@ and class_declaration i ppf x = line i ppf "pci_expr =\n"; class_expr (i+1) ppf x.ci_expr; +and implicit_kind i ppf kind = + match kind with + | Timp_implicit -> line i ppf "Pimp_implicit" + | Timp_explicit -> line i ppf "Pimp_explicit" + and module_type i ppf x = line i ppf "module_type %a\n" fmt_location x.mty_loc; attributes i ppf x.mty_attributes; @@ -672,8 +677,9 @@ and signature_item i ppf x = attributes i ppf incl.incl_attributes; module_type i ppf incl.incl_mod | Tsig_implicit imp -> - line i ppf "Psig_implicit %a %d\n" - fmt_path imp.imp_path imp.imp_arity; + line i ppf "Psig_implicit %a\n" + fmt_path imp.imp_path; + implicit_kind i ppf imp.imp_kind; attributes i ppf imp.imp_attributes | Tsig_class (l) -> line i ppf "Psig_class\n"; @@ -811,8 +817,9 @@ and structure_item i ppf x = attributes i ppf incl.incl_attributes; module_expr i ppf incl.incl_mod; | Tstr_implicit imp -> - line i ppf "Pstr_implicit %a %d\n" - fmt_path imp.imp_path imp.imp_arity; + line i ppf "Pstr_implicit %a\n" + fmt_path imp.imp_path; + implicit_kind i ppf imp.imp_kind; attributes i ppf imp.imp_attributes | Tstr_attribute (s, arg) -> line i ppf "Pstr_attribute \"%s\"\n" s.txt; diff --git a/typing/subst.ml b/typing/subst.ml index fe410fa976..3fec5737f2 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -316,6 +316,13 @@ let extension_constructor s ext = cleanup_types (); ext +let implicit_description s imp = + { imp_kind = imp.imp_kind; + imp_path = module_path s imp.imp_path; + imp_loc = loc s imp.imp_loc; + imp_attributes = attrs s imp.imp_attributes; + } + let rec rename_bound_idents s idents = function [] -> (List.rev idents, s) | Sig_type(id, d, _) :: sg -> @@ -332,10 +339,8 @@ let rec rename_bound_idents s idents = function Sig_class(id, _, _) | Sig_class_type(id, _, _)) :: sg -> let id' = Ident.rename id in rename_bound_idents s (id' :: idents) sg - | Sig_implicit (path,_) :: sg -> - (* Ugly: Put a fake identifier *) - let id' = Path.head path in - rename_bound_idents s (id' :: idents) sg + | Sig_implicit __ :: sg -> + rename_bound_idents s (Ident.dummy :: idents) sg let rec modtype s = function Mty_ident p as mty -> @@ -389,7 +394,8 @@ and signature_component s comp newid = Sig_class(newid, class_declaration s d, rs) | Sig_class_type(id, d, rs) -> Sig_class_type(newid, cltype_declaration s d, rs) - | Sig_implicit _ as sgi -> sgi + | Sig_implicit imp -> + Sig_implicit (implicit_description s imp) and module_declaration s decl = { diff --git a/typing/subst.mli b/typing/subst.mli index a197f82f48..3a7612af01 100644 --- a/typing/subst.mli +++ b/typing/subst.mli @@ -51,6 +51,7 @@ val modtype: t -> module_type -> module_type val signature: t -> signature -> signature val modtype_declaration: t -> modtype_declaration -> modtype_declaration val module_declaration: t -> module_declaration -> module_declaration +val implicit_description: t -> implicit_description -> implicit_description (* Composition of substitutions: apply (compose s1 s2) x = apply s2 (apply s1 x) *) diff --git a/typing/typedtree.ml b/typing/typedtree.ml index c1463aac2f..20efed0172 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -338,11 +338,15 @@ and implicit_description = { imp_path: Path.t; imp_txt: Longident.t loc; - imp_arity: int; + imp_kind: implicit_kind; imp_loc: Location.t; imp_attributes: attribute list; } +and implicit_kind = + | Timp_implicit + | Timp_explicit + and 'a include_infos = { incl_mod: 'a; diff --git a/typing/typedtree.mli b/typing/typedtree.mli index e7696d1dd0..2a85a44355 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -337,11 +337,15 @@ and implicit_description = { imp_path: Path.t; imp_txt: Longident.t loc; - imp_arity: int; + imp_kind: implicit_kind; imp_loc: Location.t; imp_attributes: attribute list; } +and implicit_kind = + | Timp_implicit + | Timp_explicit + and 'a include_infos = { incl_mod: 'a; diff --git a/typing/typemod.ml b/typing/typemod.ml index 7e249fdc28..8fa7cfc777 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -90,19 +90,29 @@ let type_open ?toplevel env sod = in (path, newenv, od) -let type_implicit env id = - let arity = id.pimp_arity in - let lid = id.pimp_lid.Location.txt in - let path = Env.lookup_module ~load:true lid env in - (* FIXME: Check that arity match *) - let newenv = Env.register_as_implicit path arity env in - let imp = {Typedtree. imp_path = path; - imp_txt = id.pimp_lid; - imp_loc = id.pimp_loc; - imp_attributes = id.pimp_attributes; - imp_arity = arity} +let type_implicit env simp = + let tkind, kind = + match simp.pimp_kind with + | Pimp_implicit -> Timp_implicit, Imp_implicit + | Pimp_explicit -> Timp_explicit, Imp_explicit in - path, arity, newenv, imp + let lid = simp.pimp_lid.Location.txt in + let path = Typetexp.lookup_module ~load:true env simp.pimp_loc lid in + let timp = + {Typedtree. imp_path = path; + imp_txt = simp.pimp_lid; + imp_kind = tkind; + imp_loc = simp.pimp_loc; + imp_attributes = simp.pimp_attributes;} + in + let imp = + {Types. imp_path = path; + imp_kind = kind; + imp_loc = simp.pimp_loc; + imp_attributes = simp.pimp_attributes;} + in + let newenv = Env.add_implicit imp env in + timp, imp, newenv (* Bind a module as implicit in current environment *) @@ -712,11 +722,11 @@ and transl_signature env sg = let (trem, rem, final_env) = transl_sig newenv srem in mksig (Tsig_open od) env loc :: trem, rem, final_env - | Psig_implicit id -> - let (path, arity, newenv, imp) = type_implicit env id in + | Psig_implicit simp -> + let (timp, imp, newenv) = type_implicit env simp in let (trem, rem, final_env) = transl_sig newenv srem in - mksig (Tsig_implicit imp) env loc :: trem, - Sig_implicit (path, arity) :: rem, final_env + mksig (Tsig_implicit timp) env loc :: trem, + Sig_implicit imp :: rem, final_env | Psig_include sincl -> let smty = sincl.pincl_mod in let tmty = transl_modtype env smty in @@ -1137,13 +1147,13 @@ let package_subtype env p1 nl1 tl1 p2 nl2 tl2 = let () = Ctype.modtype_of_package := modtype_of_package let () = Ctype.package_subtype := package_subtype -let wrap_constraint env arg mty explicit = +let wrap_constraint env arg mty expl = let coercion = try Includemod.modtypes env arg.mod_type mty with Includemod.Error msg -> raise(Error(arg.mod_loc, env, Not_included msg)) in - { mod_desc = Tmod_constraint(arg, mty, explicit, coercion); + { mod_desc = Tmod_constraint(arg, mty, expl, coercion); mod_type = mty; mod_env = env; mod_attributes = []; @@ -1501,9 +1511,9 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Pstr_open sod -> let (path, newenv, od) = type_open ~toplevel env sod in Tstr_open od, [], newenv - | Pstr_implicit id -> - let (path, arity, newenv, imp) = type_implicit env id in - Tstr_implicit imp, [], newenv + | Pstr_implicit simp -> + let (timp, imp, newenv) = type_implicit env simp in + Tstr_implicit timp, [Sig_implicit imp], newenv | Pstr_class cl -> List.iter (fun {pci_name = name} -> check_name "type" type_names name) diff --git a/typing/types.ml b/typing/types.ml index 82db905263..f6fce684e2 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -275,6 +275,17 @@ type class_type_declaration = clty_attributes: Parsetree.attributes; } +type implicit_kind = + | Imp_implicit + | Imp_explicit + +type implicit_description = + { imp_kind : implicit_kind; + imp_path : Path.t; + imp_loc: Location.t; + imp_attributes: Parsetree.attributes; + } + (* Type expressions for the module language *) type module_type = @@ -298,7 +309,7 @@ and signature_item = | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status - | Sig_implicit of Path.t * int + | Sig_implicit of implicit_description and module_declaration = { diff --git a/typing/types.mli b/typing/types.mli index 244d1a3f25..c9c4761701 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -265,6 +265,17 @@ type class_type_declaration = clty_attributes: Parsetree.attributes; } +type implicit_kind = + | Imp_implicit + | Imp_explicit + +type implicit_description = + { imp_kind : implicit_kind; + imp_path : Path.t; + imp_loc: Location.t; + imp_attributes: Parsetree.attributes; + } + (* Type expressions for the module language *) type module_type = @@ -288,7 +299,7 @@ and signature_item = | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status - | Sig_implicit of Path.t * int + | Sig_implicit of implicit_description and module_declaration = { From 3c609e72265ff032d3c447a05316df02692b78e5 Mon Sep 17 00:00:00 2001 From: Leo White Date: Sun, 3 Jan 2016 12:34:58 +0000 Subject: [PATCH 04/10] Separate implicit flag from module declarations --- bytecomp/translmod.ml | 4 +- ocamldoc/odoc_ast.ml | 2 +- ocamldoc/odoc_env.ml | 2 +- ocamldoc/odoc_sig.ml | 4 +- toplevel/topdirs.ml | 6 +- toplevel/toploop.ml | 9 +- typing/btype.ml | 10 ++- typing/btype.mli | 1 + typing/env.ml | 139 +++++++++++++++++++----------- typing/env.mli | 4 +- typing/envaux.ml | 14 +++ typing/implicitsearch.ml | 15 ++-- typing/includemod.ml | 20 +---- typing/mtype.ml | 35 ++++---- typing/oprint.ml | 42 +++++---- typing/outcometree.mli | 8 +- typing/printtyp.ml | 24 ++++-- typing/printtyp.mli | 4 + typing/subst.ml | 13 ++- typing/typemod.ml | 181 ++++++++++++++++++++++----------------- typing/types.ml | 9 +- typing/types.mli | 9 +- 22 files changed, 330 insertions(+), 225 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index f3387362fa..66fed87092 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -216,7 +216,7 @@ let init_shape modl = init_shape_struct (Env.add_type ~check:false id tdecl env) rem | Sig_typext(id, ext, _) :: rem -> raise Not_found - | Sig_module(id, md, _) :: rem -> + | Sig_module(id, md, _, _) :: rem -> init_shape_mod env md.md_type :: init_shape_struct (Env.add_module_declaration id md env) rem | Sig_modtype(id, minfo) :: rem -> @@ -318,7 +318,7 @@ let rec bound_value_identifiers = function | Sig_value(id, {val_kind = Val_reg}) :: rem -> id :: bound_value_identifiers rem | Sig_typext(id, ext, _) :: rem -> id :: bound_value_identifiers rem - | Sig_module(id, mty, _) :: rem -> id :: bound_value_identifiers rem + | Sig_module(id, mty, _, _) :: rem -> id :: bound_value_identifiers rem | Sig_class(id, decl, _) :: rem -> id :: bound_value_identifiers rem | _ :: rem -> bound_value_identifiers rem diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 2b3b3ba501..ab3276ae40 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -952,7 +952,7 @@ module Analyser = let f = match ele with Element_module m -> (function - Types.Sig_module (ident,md,_) -> + Types.Sig_module (ident,md,_,_) -> let n1 = Name.simple m.m_name and n2 = Ident.name ident in ( diff --git a/ocamldoc/odoc_env.ml b/ocamldoc/odoc_env.ml index 9a39b58694..985682773d 100644 --- a/ocamldoc/odoc_env.ml +++ b/ocamldoc/odoc_env.ml @@ -53,7 +53,7 @@ let rec add_signature env root ?rel signat = Types.Sig_value (ident, _) -> { env with env_values = (rel_name ident, qualify ident) :: env.env_values } | Types.Sig_type (ident,_,_) -> { env with env_types = (rel_name ident, qualify ident) :: env.env_types } | Types.Sig_typext (ident, _, _) -> { env with env_extensions = (rel_name ident, qualify ident) :: env.env_extensions } - | Types.Sig_module (ident, md, _) -> + | Types.Sig_module (ident, md, _, _) -> let env2 = match md.Types.md_type with (* A VOIR : le cas ou c'est un identificateur, dans ce cas on n'a pas de signature *) Types.Mty_signature s -> add_signature env (qualify ident) ~rel: (rel_name ident) s diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index 500e551477..9a0332fb7f 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -56,7 +56,7 @@ module Signature_search = Hashtbl.add table (C (Name.from_ident ident)) signat | Types.Sig_class_type (ident, _, _) -> Hashtbl.add table (CT (Name.from_ident ident)) signat - | Types.Sig_module (ident, _, _) -> + | Types.Sig_module (ident, _, _, _) -> Hashtbl.add table (M (Name.from_ident ident)) signat | Types.Sig_modtype (ident,_) -> Hashtbl.add table (MT (Name.from_ident ident)) signat @@ -95,7 +95,7 @@ module Signature_search = let search_module table name = match Hashtbl.find table (M name) with - | (Types.Sig_module (ident, md, _)) -> md.Types.md_type + | (Types.Sig_module (ident, md, _, _)) -> md.Types.md_type | _ -> assert false let search_module_type table name = diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 0ca19a814b..986deff47e 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -336,9 +336,9 @@ let trim_signature = function Mty_signature (List.map (function - Sig_module (id, md, rs) -> + Sig_module (id, md, is, rs) -> Sig_module (id, {md with md_type = trim_modtype md.md_type}, - rs) + is, rs) (*| Sig_modtype (id, Modtype_manifest mty) -> Sig_modtype (id, Modtype_manifest (trim_modtype mty))*) | item -> item) @@ -412,7 +412,7 @@ let () = (fun env loc id lid -> let path, md = Typetexp.find_module env loc lid in [ Sig_module (id, {md with md_type = trim_signature md.md_type}, - Trec_not) ] + Asttypes.Nonimplicit, Trec_not) ] ) let () = diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 62518ba073..ab74098f2b 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -197,8 +197,8 @@ let rec pr_item env items = | Sig_typext(id, ext, es) :: rem -> let tree = Printtyp.tree_of_extension_constructor id ext es in Some (tree, None, rem) - | Sig_module(id, md, rs) :: rem -> - let tree = Printtyp.tree_of_module id ~implicit_:md.md_implicit md.md_type rs in + | Sig_module(id, md, is, rs) :: rem -> + let tree = Printtyp.tree_of_module id ~implicit_:is md.md_type rs in Some (tree, None, rem) | Sig_modtype(id, decl) :: rem -> let tree = Printtyp.tree_of_modtype_declaration id decl in @@ -209,6 +209,11 @@ let rec pr_item env items = | Sig_class_type(id, decl, rs) :: tydecl1 :: tydecl2 :: rem -> let tree = Printtyp.tree_of_cltype_declaration id decl rs in Some (tree, None, rem) + | Sig_implicit(imp, Timps_standalone) :: rem -> + let tree = Printtyp.tree_of_implicit_description imp Timps_standalone in + Some (tree, None, rem) + | Sig_implicit(imp, Timps_attached) :: rem -> + pr_item env rem | _ -> None let rec item_list env = function diff --git a/typing/btype.ml b/typing/btype.ml index c7ba1f7ff1..7eaa3f45cb 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -243,6 +243,7 @@ type type_iterators = it_modtype_declaration: type_iterators -> modtype_declaration -> unit; it_class_declaration: type_iterators -> class_declaration -> unit; it_class_type_declaration: type_iterators -> class_type_declaration -> unit; + it_implicit_description: type_iterators -> implicit_description -> unit; it_module_type: type_iterators -> module_type -> unit; it_module_parameter: type_iterators -> module_parameter -> unit; it_class_type: type_iterators -> class_type -> unit; @@ -258,7 +259,7 @@ let type_iterators = Sig_value (_, vd) -> it.it_value_description it vd | Sig_type (_, td, _) -> it.it_type_declaration it td | Sig_typext (_, td, _) -> it.it_extension_constructor it td - | Sig_module (_, md, _) -> it.it_module_declaration it md + | Sig_module (_, md, _, _) -> it.it_module_declaration it md | Sig_modtype (_, mtd) -> it.it_modtype_declaration it mtd | Sig_class (_, cd, _) -> it.it_class_declaration it cd | Sig_class_type (_, ctd, _) -> it.it_class_type_declaration it ctd @@ -287,6 +288,8 @@ let type_iterators = List.iter (it.it_type_expr it) ctd.clty_params; it.it_class_type it ctd.clty_type; it.it_path ctd.clty_path + and it_implicit_description it imp = + it.it_path imp.imp_path and it_module_type it = function Mty_ident p | Mty_alias p -> it.it_path p @@ -337,8 +340,9 @@ let type_iterators = { it_path; it_type_expr = it_do_type_expr; it_do_type_expr; it_type_kind; it_class_type; it_module_type; it_module_parameter; it_signature; it_class_type_declaration; it_class_declaration; - it_modtype_declaration; it_module_declaration; it_extension_constructor; - it_type_declaration; it_value_description; it_signature_item; } + it_implicit_description; it_modtype_declaration; it_module_declaration; + it_extension_constructor; it_type_declaration; it_value_description; + it_signature_item; } let copy_row f fixed row keep more = let fields = List.map diff --git a/typing/btype.mli b/typing/btype.mli index fc4a37b619..3581ea0e62 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -99,6 +99,7 @@ type type_iterators = it_modtype_declaration: type_iterators -> modtype_declaration -> unit; it_class_declaration: type_iterators -> class_declaration -> unit; it_class_type_declaration: type_iterators -> class_type_declaration -> unit; + it_implicit_description: type_iterators -> implicit_description -> unit; it_module_type: type_iterators -> module_type -> unit; it_module_parameter : type_iterators -> Types.module_parameter -> unit; it_class_type: type_iterators -> class_type -> unit; diff --git a/typing/env.ml b/typing/env.ml index dde0970d16..4f580e6390 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -53,6 +53,8 @@ let used_constructors : let prefixed_sg = Hashtbl.create 113 +let prefixed_imps = Hashtbl.create 113 + type error = | Illegal_renaming of string * string * string | Inconsistent_import of string * string * string @@ -112,6 +114,8 @@ type summary = | Env_class of summary * Ident.t * class_declaration | Env_cltype of summary * Ident.t * class_type_declaration | Env_open of summary * Path.t + | Env_open_implicit of summary * Path.t + | Env_implicit of summary * implicit_description | Env_functor_arg of summary * Ident.t module EnvTbl = @@ -291,8 +295,8 @@ let strengthen = ref ((fun env mty path -> assert false) : t -> module_type -> Path.t -> module_type) -let md ?(implicit_ = Asttypes.Nonimplicit) md_type = - {md_type; md_attributes=[]; md_loc=Location.none; md_implicit = implicit_} +let md md_type = + {md_type; md_attributes=[]; md_loc=Location.none;} (* The name of the compilation unit currently compiled. "" if outside a compilation unit. *) @@ -393,7 +397,8 @@ let reset_cache () = Hashtbl.clear value_declarations; Hashtbl.clear type_declarations; Hashtbl.clear used_constructors; - Hashtbl.clear prefixed_sg + Hashtbl.clear prefixed_sg; + Hashtbl.clear prefixed_imps let reset_cache_toplevel () = (* Delete 'missing cmi' entries from the cache. *) @@ -406,7 +411,8 @@ let reset_cache_toplevel () = Hashtbl.clear value_declarations; Hashtbl.clear type_declarations; Hashtbl.clear used_constructors; - Hashtbl.clear prefixed_sg + Hashtbl.clear prefixed_sg; + Hashtbl.clear prefixed_imps let set_unit_name name = @@ -1173,14 +1179,14 @@ let signature_item_size = function let signature_item_subst item p sub = match item with | Sig_type (id, _, _) -> Subst.add_type id p sub - | Sig_module (id, _, _) -> Subst.add_module id p sub + | Sig_module (id, _, _, _) -> Subst.add_module id p sub | Sig_modtype (id, _) -> Subst.add_modtype id (Mty_ident p) sub | Sig_value _ | Sig_typext _ | Sig_implicit _ | Sig_class _ | Sig_class_type _ -> sub let signature_item_ident = function | Sig_value (id, _) | Sig_typext (id, _, _) | Sig_type (id, _, _) - | Sig_module (id, _, _) | Sig_modtype (id, _) + | Sig_module (id, _, _, _) | Sig_modtype (id, _) | Sig_class (id, _, _) | Sig_class_type (id, _, _) -> id | Sig_implicit _ -> assert false @@ -1212,16 +1218,16 @@ let subst_signature sub sg = Sig_type(id, Subst.type_declaration sub decl, x) | Sig_typext(id, ext, es) -> Sig_typext (id, Subst.extension_constructor sub ext, es) - | Sig_module(id, mty, x) -> - Sig_module(id, Subst.module_declaration sub mty,x) + | Sig_module(id, mty, x, y) -> + Sig_module(id, Subst.module_declaration sub mty, x, y) | Sig_modtype(id, decl) -> Sig_modtype(id, Subst.modtype_declaration sub decl) | Sig_class(id, decl, x) -> Sig_class(id, Subst.class_declaration sub decl, x) | Sig_class_type(id, decl, x) -> Sig_class_type(id, Subst.cltype_declaration sub decl, x) - | Sig_implicit imp -> - Sig_implicit (Subst.implicit_description sub imp) + | Sig_implicit(imp, x) -> + Sig_implicit (Subst.implicit_description sub imp, x) ) sg @@ -1249,8 +1255,40 @@ let prefix_idents_and_subst root sub sg = else prefix_idents_and_subst root sub sg -let register_as_implicit path md env = +let prefixed_implicits root sg = + let (_, sub) = prefix_idents root 0 Subst.identity sg in + let rev_imps = + List.fold_left + (fun acc item -> + match item with + | Sig_implicit(imp, _) -> + let imp = Subst.implicit_description sub imp in + imp :: acc + | _ -> acc) + [] sg + in + let imps = List.rev rev_imps in + imps + +let prefixed_implicits root sg = + let sgs = + try + Hashtbl.find prefixed_imps root + with Not_found -> + let sgs = ref [] in + Hashtbl.add prefixed_imps root sgs; + sgs + in + try + List.assq sg !sgs + with Not_found -> + let r = prefixed_implicits root sg in + sgs := (sg, r) :: !sgs; + r + +let register_as_implicit path env = let path = canonical_path env path in + let md = find_module path env in let mty = !strengthen env md.md_type path in let rec add acc params mty = let acc = ((path, List.rev params, mty) :: acc) in @@ -1272,18 +1310,13 @@ let unregister_as_implicit path env = in {env with implicit_instances} -let register_if_implicit path md env = - match md.md_implicit with - | Asttypes.Nonimplicit -> env - | Asttypes.Implicit -> register_as_implicit path md env - let add_implicit imp env = - match imp.imp_kind with - | Imp_implicit -> - let md = find_module imp.imp_path env in - register_as_implicit imp.imp_path md env - | Imp_explicit -> - unregister_as_implicit imp.imp_path env + let env = + match imp.imp_kind with + | Imp_implicit -> register_as_implicit imp.imp_path env + | Imp_explicit -> unregister_as_implicit imp.imp_path env + in + { env with summary = Env_implicit(env.summary, imp) } (* Compute structure descriptions *) @@ -1342,7 +1375,7 @@ and components_of_module_maker (env, sub, path, mty) = c.comp_constrs <- add_to_tbl (Ident.name id) (descr, !pos) c.comp_constrs; incr pos - | Sig_module(id, md, _) -> + | Sig_module(id, md, _, _) -> let mty = md.md_type in let mty' = EnvLazy.create (sub, mty) in c.comp_modules <- @@ -1505,17 +1538,14 @@ and store_extension ~check slot id path ext env renv = summary = Env_extension(env.summary, id, ext) } and store_module slot id path md env renv = - let env = - { env with - modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; - components = - EnvTbl.add "module" slot id - (path, components_of_module env Subst.identity path md.md_type) - env.components renv.components; - summary = Env_module(env.summary, id, md); - } - in - register_if_implicit path md env + { env with + modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; + components = + EnvTbl.add "module" slot id + (path, components_of_module env Subst.identity path md.md_type) + env.components renv.components; + summary = Env_module(env.summary, id, md); + } and store_modtype slot id path info env renv = { env with @@ -1614,8 +1644,8 @@ and add_class id ty env = and add_cltype id ty env = store_cltype None id (Pident id) ty env env -let add_module ?arg ?implicit_ id mty env = - add_module_declaration ?arg id (md ?implicit_ mty) env +let add_module ?arg id mty env = + add_module_declaration ?arg id (md mty) env let add_local_constraint id info elv env = match info with @@ -1645,7 +1675,17 @@ and enter_class = enter store_class and enter_cltype = enter store_cltype let enter_module ?arg ~implicit_ s mty env = - enter_module_declaration ?arg s (md ~implicit_ mty) env + let id, env = enter_module_declaration ?arg s (md mty) env in + match implicit_ with + | Nonimplicit -> id, env + | Implicit -> + let path = Pident id in + let imp = + {imp_path = path; imp_kind = Imp_implicit; + imp_attributes=[]; imp_loc=Location.none;} + in + let env = add_implicit imp env in + id, env (* Insertion of all components of a signature *) @@ -1654,11 +1694,11 @@ let add_item comp env = Sig_value(id, decl) -> add_value id decl env | Sig_type(id, decl, _) -> add_type ~check:false id decl env | Sig_typext(id, ext, _) -> add_extension ~check:false id ext env - | Sig_module(id, md, _) -> add_module_declaration id md env + | Sig_module(id, md, _, _) -> add_module_declaration id md env | Sig_modtype(id, decl) -> add_modtype id decl env | Sig_class(id, decl, _) -> add_class id decl env | Sig_class_type(id, decl, _) -> add_cltype id decl env - | Sig_implicit imp -> add_implicit imp env + | Sig_implicit(imp, _) -> add_implicit imp env let rec add_signature sg env = match sg with @@ -1684,7 +1724,7 @@ let open_signature slot root sg env0 = store_type ~check:false slot (Ident.hide id) p decl env env0 | Sig_typext(id, ext, _) -> store_extension ~check:false slot (Ident.hide id) p ext env env0 - | Sig_module(id, mty, _) -> + | Sig_module(id, mty, _, _) -> store_module slot (Ident.hide id) p mty env env0 | Sig_modtype(id, decl) -> store_modtype slot (Ident.hide id) p decl env env0 @@ -1692,7 +1732,7 @@ let open_signature slot root sg env0 = store_class slot (Ident.hide id) p decl env env0 | Sig_class_type(id, decl, _) -> store_cltype slot (Ident.hide id) p decl env env0 - | Sig_implicit imp -> + | Sig_implicit(imp, _) -> add_implicit imp env ) env0 sg pl in @@ -1735,18 +1775,13 @@ let open_signature ?(loc = Location.none) ?(toplevel = false) ovf root sg env = else open_signature None root sg env let open_implicit root sg env = - let env, _pos = List.fold_left - (fun (env,pos) item -> - let env = match item with - | Sig_module(id, md, _) -> - register_if_implicit (Pdot (root, Ident.name id, pos)) md env - | _ -> env - in - let next = pos + signature_item_size item in - env, next) - (env,0) sg + let imps = prefixed_implicits root sg in + let newenv = + List.fold_left + (fun env imp -> add_implicit imp env) + env imps in - env + { newenv with summary = Env_open_implicit(env.summary, root) } (* Read a signature from a file *) diff --git a/typing/env.mli b/typing/env.mli index d1b69fcacc..f819f814bc 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -24,6 +24,8 @@ type summary = | Env_class of summary * Ident.t * class_declaration | Env_cltype of summary * Ident.t * class_type_declaration | Env_open of summary * Path.t + | Env_open_implicit of summary * Path.t + | Env_implicit of summary * Types.implicit_description | Env_functor_arg of summary * Ident.t type t @@ -112,7 +114,7 @@ val add_value: ?check:(string -> Warnings.t) -> Ident.t -> value_description -> t -> t val add_type: check:bool -> Ident.t -> type_declaration -> t -> t val add_extension: check:bool -> Ident.t -> extension_constructor -> t -> t -val add_module: ?arg:bool -> ?implicit_:Asttypes.implicit_flag -> Ident.t -> module_type -> t -> t +val add_module: ?arg:bool -> Ident.t -> module_type -> t -> t val add_module_declaration: ?arg:bool -> Ident.t -> module_declaration -> t -> t val add_modtype: Ident.t -> modtype_declaration -> t -> t val add_class: Ident.t -> class_declaration -> t -> t diff --git a/typing/envaux.ml b/typing/envaux.ml index 708da443d2..d7ccdd6f4f 100644 --- a/typing/envaux.ml +++ b/typing/envaux.ml @@ -75,6 +75,20 @@ let rec env_from_summary sum subst = in Env.open_signature Asttypes.Override path' (extract_sig env md.md_type) env + | Env_open_implicit(s, path) -> + let env = env_from_summary s subst in + let path' = Subst.module_path subst path in + let md = + try + Env.find_module path' env + with Not_found -> + raise (Error (Module_not_found path')) + in + Env.open_implicit path' (extract_sig env md.md_type) env + | Env_implicit(s, imp) -> + let env = env_from_summary s subst in + let imp' = Subst.implicit_description subst imp in + Env.add_implicit imp' env | Env_functor_arg(Env_module(s, id, desc), id') when Ident.same id id' -> Env.add_module_declaration id (Subst.module_declaration subst desc) ~arg:true (env_from_summary s subst) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 2bca177578..4d832ea104 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -142,11 +142,11 @@ module Constraints = struct | _ -> env in aux env id ty items - | Sig_module (id, decl, (Trec_not | Trec_first)) :: items -> + | Sig_module (id, decl, _, (Trec_not | Trec_first)) :: items -> let rec aux env id decl items = let env = Env.add_module_declaration id decl env in match items with - | Sig_module (id, decl, Trec_next) :: items -> + | Sig_module (id, decl, _, Trec_next) :: items -> aux env id decl items | _ -> env in @@ -193,7 +193,7 @@ module Constraints = struct with Not_found -> [], cstrs, field end - | Sig_module (id,decl,recst) -> + | Sig_module (id,decl,impf,recst) -> let name = Ident.name id in begin try let (_, subs), cstrs = list_extract (name_match name) cstrs in @@ -204,7 +204,7 @@ module Constraints = struct | subs -> [(id, Sub subs)] in to_unify, cstrs, - Sig_module (id,{decl with md_type = mty}, recst) + Sig_module (id, {decl with md_type = mty}, impf, recst) with Not_found -> [], cstrs, field end @@ -250,12 +250,12 @@ module Constraints = struct unify env ty ty'; cstrs - | Sig_module (id,decl,recst), + | Sig_module (id,decl,_,_), ((id', Sub subs) :: cstrs) when Ident.same id id' -> constraint_mty env subs decl.md_type; cstrs - | _ -> cstrs + | _ -> cstrs and constraint_sig env cstrs items = let env = register_items env items in @@ -968,9 +968,6 @@ end = struct | target :: sub_targets -> let partial = {partial with payload = (path, sub_targets) } in let md = Env.find_module path arg.env in - (* The original module declaration might be implicit, we want to avoid - rebinding implicit *) - let md = {md with md_implicit = Asttypes.Nonimplicit} in let target = Constraints.target arg.env target eq_initial in let termination = Termination.check_target arg.env target eq_initial partial.termination in let env = Env.add_module_declaration target.target_id md arg.env in diff --git a/typing/includemod.ml b/typing/includemod.ml index e994e867e1..886b74a0a9 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -58,15 +58,6 @@ exception Error of error list i.e. that x1 is the type of an implementation that fulfills the specification x2. If not, Error is raised with a backtrace of the error. *) -(* Inclusion between implicit flags *) - -let implicit_flags env cxt id f1 l1 f2 l2 = - match f1, f2 with - | Asttypes.Implicit, Asttypes.Implicit -> () - | Asttypes.Implicit, Asttypes.Nonimplicit -> () - | Asttypes.Nonimplicit, Asttypes.Nonimplicit -> () - | _ -> raise(Error[cxt, env, Implicit_flags(id, l1, l2)]) - (* Inclusion between value descriptions *) let value_descriptions env cxt subst id vd1 vd2 = @@ -161,7 +152,7 @@ let item_ident_name = function Sig_value(id, d) -> (id, d.val_loc, Field_value(Ident.name id)) | Sig_type(id, d, _) -> (id, d.type_loc, Field_type(Ident.name id)) | Sig_typext(id, d, _) -> (id, d.ext_loc, Field_typext(Ident.name id)) - | Sig_module(id, d, _) -> (id, d.md_loc, Field_module(Ident.name id)) + | Sig_module(id, d, _, _) -> (id, d.md_loc, Field_module(Ident.name id)) | Sig_modtype(id, d) -> (id, d.mtd_loc, Field_modtype(Ident.name id)) | Sig_class(id, d, _) -> (id, d.cty_loc, Field_class(Ident.name id)) | Sig_class_type(id, d, _) -> (id, d.clty_loc, Field_classtype(Ident.name id)) @@ -175,7 +166,7 @@ let is_runtime_component = function | Sig_class_type(_,_,_) -> false | Sig_value(_,_) | Sig_typext(_,_,_) - | Sig_module(_,_,_) + | Sig_module(_,_,_,_) | Sig_class(_, _,_) -> true (* Print a coercion *) @@ -323,7 +314,7 @@ and signatures env cxt subst sig1 sig2 = let (id_pos_list,_) = List.fold_left (fun (l,pos) -> function - Sig_module (id, _, _) -> + Sig_module (id, _, _, _) -> ((id,pos,Tcoerce_none)::l , pos+1) | item -> (l, if is_runtime_component item then pos+1 else pos)) ([], 0) sig1 in @@ -421,13 +412,10 @@ and signature_components env cxt subst = function :: rem -> extension_constructors env cxt subst id1 ext1 ext2; (pos, Tcoerce_none) :: signature_components env cxt subst rem - | (Sig_module(id1, mty1, _), Sig_module(id2, mty2, _), pos) :: rem -> + | (Sig_module(id1, mty1, _, _), Sig_module(id2, mty2, _, _), pos) :: rem -> let cc = modtypes env (Module id1::cxt) subst (Mtype.strengthen env mty1.md_type (Pident id1)) mty2.md_type in - implicit_flags env cxt id1 - mty1.md_implicit mty1.md_loc - mty2.md_implicit mty2.md_loc; (pos, cc) :: signature_components env cxt subst rem | (Sig_modtype(id1, info1), Sig_modtype(id2, info2), pos) :: rem -> modtype_infos env cxt subst id1 info1 info2; diff --git a/typing/mtype.ml b/typing/mtype.ml index cd78f8b1af..89498f681a 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -67,9 +67,9 @@ and strengthen_sig env sg p = Sig_type(id, newdecl, rs) :: strengthen_sig env rem p | (Sig_typext(id, ext, es) as sigelt) :: rem -> sigelt :: strengthen_sig env rem p - | Sig_module(id, md, rs) :: rem -> + | Sig_module(id, md, is, rs) :: rem -> let str = strengthen_decl env md (Pdot(p, Ident.name id, nopos)) in - Sig_module(id, str, rs) + Sig_module(id, str, is, rs) :: strengthen_sig (Env.add_module_declaration id md env) rem p (* Need to add the module in case it defines manifest module types *) | Sig_modtype(id, decl) :: rem -> @@ -152,8 +152,8 @@ let nondep_supertype env mid mty = | Sig_typext(id, ext, es) -> Sig_typext(id, Ctype.nondep_extension_constructor env mid ext, es) :: rem' - | Sig_module(id, md, rs) -> - Sig_module(id, {md with md_type=nondep_mty env va md.md_type}, rs) + | Sig_module(id, md, is, rs) -> + Sig_module(id, {md with md_type=nondep_mty env va md.md_type}, is, rs) :: rem' | Sig_modtype(id, d) -> begin try @@ -170,8 +170,8 @@ let nondep_supertype env mid mty = | Sig_class_type(id, d, rs) -> Sig_class_type(id, Ctype.nondep_cltype_declaration env mid d, rs) :: rem' - | Sig_implicit imp -> - Sig_implicit (nondep_implicit env imp) + | Sig_implicit(imp, is) -> + Sig_implicit(nondep_implicit env imp, is) :: rem' and nondep_modtype_decl env mtd = @@ -213,12 +213,12 @@ and enrich_item env p = function Sig_type(id, decl, rs) -> Sig_type(id, enrich_typedecl env (Pdot(p, Ident.name id, nopos)) decl, rs) - | Sig_module(id, md, rs) -> + | Sig_module(id, md, is, rs) -> Sig_module(id, {md with md_type = enrich_modtype env (Pdot(p, Ident.name id, nopos)) md.md_type}, - rs) + is, rs) | item -> item let rec type_paths env p mty = @@ -236,7 +236,7 @@ and type_paths_sig env p pos sg = type_paths_sig env p pos' rem | Sig_type(id, decl, _) :: rem -> Pdot(p, Ident.name id, nopos) :: type_paths_sig env p pos rem - | Sig_module(id, md, _) :: rem -> + | Sig_module(id, md, _, _) :: rem -> type_paths env (Pdot(p, Ident.name id, pos)) md.md_type @ type_paths_sig (Env.add_module_declaration id md env) p (pos+1) rem | Sig_modtype(id, decl) :: rem -> @@ -261,7 +261,7 @@ and no_code_needed_sig env sg = | Val_prim _ -> no_code_needed_sig env rem | _ -> false end - | Sig_module(id, md, _) :: rem -> + | Sig_module(id, md, _, _) :: rem -> no_code_needed env md.md_type && no_code_needed_sig (Env.add_module_declaration id md env) rem | (Sig_type _ | Sig_modtype _ | Sig_class_type _ | Sig_implicit _) :: rem -> @@ -293,7 +293,7 @@ and contains_type_item env = function {type_kind = Type_abstract; type_private = Private}),_) | Sig_modtype _ -> raise Exit - | Sig_module (_, {md_type = mty}, _) -> + | Sig_module (_, {md_type = mty}, _, _) -> contains_type env mty | Sig_value _ | Sig_type _ @@ -362,12 +362,12 @@ let collect_arg_paths mty = and it_signature_item it si = type_iterators.it_signature_item it si; match si with - Sig_module (id, {md_type=Mty_alias p}, _) -> + Sig_module (id, {md_type=Mty_alias p}, _, _) -> bindings := Ident.add id p !bindings - | Sig_module (id, {md_type=Mty_signature sg}, _) -> + | Sig_module (id, {md_type=Mty_signature sg}, _, _) -> List.iter (function - | Sig_module (id', _, _) -> + | Sig_module (id', _, _, _) -> subst := PathMap.add (Pdot (Pident id, Ident.name id', -1)) id' !subst | _ -> ()) @@ -392,7 +392,7 @@ let rec remove_aliases env excl mty = and remove_aliases_sig env excl sg = match sg with [] -> [] - | Sig_module(id, md, rs) :: rem -> + | Sig_module(id, md, is, rs) :: rem -> let mty = match md.md_type with Mty_alias _ when IdentSet.mem id excl -> @@ -400,9 +400,8 @@ and remove_aliases_sig env excl sg = | mty -> remove_aliases env excl mty in - let implicit_ = md.md_implicit in - Sig_module(id, {md with md_type = mty} , rs) :: - remove_aliases_sig (Env.add_module ~implicit_ id mty env) excl rem + Sig_module(id, {md with md_type = mty} , is, rs) :: + remove_aliases_sig (Env.add_module id mty env) excl rem | Sig_modtype(id, mtd) :: rem -> Sig_modtype(id, mtd) :: remove_aliases_sig (Env.add_modtype id mtd env) excl rem diff --git a/typing/oprint.ml b/typing/oprint.ml index dada6997ec..22494c97da 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -370,6 +370,19 @@ let out_sig_item = ref (fun _ -> failwith "Oprint.out_sig_item") let out_signature = ref (fun _ -> failwith "Oprint.out_signature") let out_type_extension = ref (fun _ -> failwith "Oprint.out_type_extension") +let print_implicit_flag ppf = function + | Asttypes.Nonimplicit -> () + | Asttypes.Implicit -> fprintf ppf "implicit " + +let print_out_implicit_kind ppf = function + | Oimp_implicit -> fprintf ppf "implicit" + | Oimp_explicit -> fprintf ppf "explicit" + +let print_out_rec_status_module ppf = function + | Orec_not -> fprintf ppf "module" + | Orec_first -> fprintf ppf "module rec" + | Orec_next -> fprintf ppf "and" + let rec print_out_functor ppf = function | Omty_functor (mparam, mty_res) -> @@ -444,15 +457,14 @@ and print_out_sig_item ppf = fprintf ppf "@[<2>module type %s@]" name | Osig_modtype (name, mty) -> fprintf ppf "@[<2>module type %s =@ %a@]" name !out_module_type mty - | Osig_module (name, Omty_alias id, _, _) -> - fprintf ppf "@[<2>module %s =@ %a@]" name print_ident id - | Osig_module (name, mty, rs, i) -> - fprintf ppf "@[<2>%s%s %s :@ %a@]" - (match i with Asttypes.Nonimplicit -> "" - | Asttypes.Implicit -> "implicit ") - (match rs with Orec_not -> "module" - | Orec_first -> "module rec" - | Orec_next -> "and") + | Osig_module (name, Omty_alias id, i, _) -> + fprintf ppf "@[<2>%amodule %s =@ %a@]" + print_implicit_flag i + name print_ident id + | Osig_module (name, mty, i, rs) -> + fprintf ppf "@[<2>%a%a %s :@ %a@]" + print_implicit_flag i + print_out_rec_status_module rs name !out_module_type mty | Osig_type(td, rs) -> print_out_type_decl @@ -469,13 +481,11 @@ and print_out_sig_item ppf = in fprintf ppf "@[<2>%s %a :@ %a%a@]" kwd value_ident name !out_type ty pr_prims prims - | Osig_implicit (kind, name) -> - let kwd = - match kind with - | Oimp_implicit -> "implicit" - | Oimp_explicit -> "explicit" - in - fprintf ppf "@[<2>%s %a@]" kwd print_ident name + | Osig_implicit (kind, name, Oimps_standalone) -> + fprintf ppf "@[<2>%a %a@]" + print_out_implicit_kind kind + print_ident name + | Osig_implicit (kind, name, Oimps_attached) -> () and print_out_type_decl kwd ppf td = let print_constraints ppf = diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 47d93958f9..93f1760132 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -94,10 +94,11 @@ and out_sig_item = out_rec_status | Osig_typext of out_extension_constructor * out_ext_status | Osig_modtype of string * out_module_type - | Osig_module of string * out_module_type * out_rec_status * Asttypes.implicit_flag + | Osig_module of + string * out_module_type * Asttypes.implicit_flag * out_rec_status | Osig_type of out_type_decl * out_rec_status | Osig_value of string * out_type * string list - | Osig_implicit of out_implicit_kind * out_ident + | Osig_implicit of out_implicit_kind * out_ident * out_imp_status and out_type_decl = { otype_name: string; otype_params: (string * (bool * bool)) list; @@ -127,6 +128,9 @@ and out_ext_status = | Oext_first | Oext_next | Oext_exception +and out_imp_status = + | Oimps_standalone + | Oimps_attached type out_phrase = | Ophr_eval of out_value * out_type diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 0f5b69cd63..8da5b677a7 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1162,6 +1162,10 @@ let tree_of_implicit_kind = function | Imp_implicit -> Oimp_implicit | Imp_explicit -> Oimp_explicit +let tree_of_implicit_status = function + | Timps_standalone -> Oimps_standalone + | Timps_attached -> Oimps_attached + (* Print a module type *) let wrap_env fenv ftree arg = @@ -1202,6 +1206,15 @@ let hide_rec_items = function ids !printing_env) | _ -> () +let tree_of_implicit_description imp is = + let kind = tree_of_implicit_kind imp.imp_kind in + let path = tree_of_path imp.imp_path in + let is = tree_of_implicit_status is in + Osig_implicit (kind, path, is) + +let implicit_description ppf imp = + !Oprint.out_sig_item ppf (tree_of_implicit_description imp Timps_standalone) + let rec tree_of_modtype = function | Mty_ident p -> Omty_ident (tree_of_path p) @@ -1249,18 +1262,17 @@ and tree_of_signature_rec env' = function [Osig_type(tree_of_type_decl id decl, tree_of_rec rs)] | Sig_typext(id, ext, es) -> [tree_of_extension_constructor id ext es] - | Sig_module(id, md, rs) -> + | Sig_module(id, md, is, rs) -> [Osig_module (Ident.name id, tree_of_modtype md.md_type, - tree_of_rec rs, md.md_implicit)] + is, tree_of_rec rs)] | Sig_modtype(id, decl) -> [tree_of_modtype_declaration id decl] | Sig_class(id, decl, rs) -> [tree_of_class_declaration id decl rs] | Sig_class_type(id, decl, rs) -> [tree_of_cltype_declaration id decl rs] - | Sig_implicit imp -> - [Osig_implicit (tree_of_implicit_kind imp.imp_kind, - tree_of_path imp.imp_path)] + | Sig_implicit(imp, is) -> + [tree_of_implicit_description imp is] in let env' = Env.add_signature (item :: sg) env' in trees @ tree_of_signature_rec env' rem @@ -1274,7 +1286,7 @@ and tree_of_modtype_declaration id decl = Osig_modtype (Ident.name id, mty) let tree_of_module id ?(implicit_ = Nonimplicit) mty rs = - Osig_module (Ident.name id, tree_of_modtype mty, tree_of_rec rs, implicit_) + Osig_module (Ident.name id, tree_of_modtype mty, implicit_, tree_of_rec rs) let modtype ppf mty = !Oprint.out_module_type ppf (tree_of_modtype mty) let modtype_declaration id ppf decl = diff --git a/typing/printtyp.mli b/typing/printtyp.mli index a25bf241e8..17a9bef05c 100644 --- a/typing/printtyp.mli +++ b/typing/printtyp.mli @@ -50,6 +50,10 @@ val tree_of_extension_constructor: Ident.t -> extension_constructor -> ext_status -> out_sig_item val extension_constructor: Ident.t -> formatter -> extension_constructor -> unit +val tree_of_implicit_description: + implicit_description -> imp_status -> out_sig_item +val implicit_description: + formatter -> implicit_description -> unit val tree_of_module: Ident.t -> ?implicit_:Asttypes.implicit_flag -> module_type -> rec_status -> out_sig_item val modtype: formatter -> module_type -> unit val signature: formatter -> signature -> unit diff --git a/typing/subst.ml b/typing/subst.ml index 3fec5737f2..f8f3cc440e 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -328,7 +328,7 @@ let rec rename_bound_idents s idents = function | Sig_type(id, d, _) :: sg -> let id' = Ident.rename id in rename_bound_idents (add_type id (Pident id') s) (id' :: idents) sg - | Sig_module(id, mty, _) :: sg -> + | Sig_module(id, mty, _, _) :: sg -> let id' = Ident.rename id in rename_bound_idents (add_module id (Pident id') s) (id' :: idents) sg | Sig_modtype(id, d) :: sg -> @@ -339,7 +339,7 @@ let rec rename_bound_idents s idents = function Sig_class(id, _, _) | Sig_class_type(id, _, _)) :: sg -> let id' = Ident.rename id in rename_bound_idents s (id' :: idents) sg - | Sig_implicit __ :: sg -> + | Sig_implicit _ :: sg -> rename_bound_idents s (Ident.dummy :: idents) sg let rec modtype s = function @@ -386,23 +386,22 @@ and signature_component s comp newid = Sig_type(newid, type_declaration s d, rs) | Sig_typext(id, ext, es) -> Sig_typext(newid, extension_constructor s ext, es) - | Sig_module(id, d, rs) -> - Sig_module(newid, module_declaration s d, rs) + | Sig_module(id, d, is, rs) -> + Sig_module(newid, module_declaration s d, is, rs) | Sig_modtype(id, d) -> Sig_modtype(newid, modtype_declaration s d) | Sig_class(id, d, rs) -> Sig_class(newid, class_declaration s d, rs) | Sig_class_type(id, d, rs) -> Sig_class_type(newid, cltype_declaration s d, rs) - | Sig_implicit imp -> - Sig_implicit (implicit_description s imp) + | Sig_implicit(imp, is) -> + Sig_implicit(implicit_description s imp, is) and module_declaration s decl = { md_type = modtype s decl.md_type; md_attributes = attrs s decl.md_attributes; md_loc = loc s decl.md_loc; - md_implicit = decl.md_implicit; } and modtype_declaration s decl = diff --git a/typing/typemod.ml b/typing/typemod.ml index 8fa7cfc777..c0bcbc11ec 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -90,6 +90,49 @@ let type_open ?toplevel env sod = in (path, newenv, od) +let type_open_ ?toplevel opf env loc lid = + let path, md = Typetexp.find_module env lid.loc lid.txt in + let sg = extract_sig_open env lid.loc md.md_type in + let env = match opf with + | Open_all ovf -> Env.open_signature ~loc ?toplevel ovf path sg env + | Open_implicit -> Env.open_implicit path sg env in + path, env + +(* Check that all core type schemes in a structure are closed *) + +let rec closed_modtype = function + Mty_ident p -> true + | Mty_alias p -> true + | Mty_signature sg -> List.for_all closed_signature_item sg + | Mty_functor(param, body) -> closed_modtype body + +and closed_signature_item = function + Sig_value(id, desc) -> Ctype.closed_schema desc.val_type + | Sig_module(id, md, _, _) -> closed_modtype md.md_type + | _ -> true + +let check_nongen_scheme env str = + match str.str_desc with + Tstr_value(rec_flag, pat_exp_list) -> + List.iter + (fun {vb_expr=exp} -> + if not (Ctype.closed_schema exp.exp_type) then + raise(Error(exp.exp_loc, env, Non_generalizable exp.exp_type))) + pat_exp_list + | Tstr_module {mb_expr=md;_} -> + if not (closed_modtype md.mod_type) then + raise(Error(md.mod_loc, env, Non_generalizable_module md.mod_type)) + | _ -> () + +let check_nongen_schemes env str = + List.iter (check_nongen_scheme env) str + +let check_nongen_canonical_path env loc path = + let path = Env.canonical_path env path in + let md = Env.find_module path env in + if not (closed_modtype md.md_type) then + raise(Error(loc, env, Non_generalizable_module md.md_type)) + let type_implicit env simp = let tkind, kind = match simp.pimp_kind with @@ -98,6 +141,7 @@ let type_implicit env simp = in let lid = simp.pimp_lid.Location.txt in let path = Typetexp.lookup_module ~load:true env simp.pimp_loc lid in + check_nongen_canonical_path env simp.pimp_loc path; let timp = {Typedtree. imp_path = path; imp_txt = simp.pimp_lid; @@ -114,16 +158,6 @@ let type_implicit env simp = let newenv = Env.add_implicit imp env in timp, imp, newenv -(* Bind a module as implicit in current environment *) - -let type_open_ ?toplevel opf env loc lid = - let path, md = Typetexp.find_module env lid.loc lid.txt in - let sg = extract_sig_open env lid.loc md.md_type in - let env = match opf with - | Open_all ovf -> Env.open_signature ~loc ?toplevel ovf path sg env - | Open_implicit -> Env.open_implicit path sg env in - path, env - (* Record a module type *) let rm node = Stypes.record (Stypes.Ti_mod node); @@ -162,8 +196,8 @@ let make_next_first rs rem = match rem with Sig_type (id, decl, Trec_next) :: rem -> Sig_type (id, decl, Trec_first) :: rem - | Sig_module (id, mty, Trec_next) :: rem -> - Sig_module (id, mty, Trec_first) :: rem + | Sig_module (id, mty, is, Trec_next) :: rem -> + Sig_module (id, mty, is, Trec_first) :: rem | _ -> rem else rem @@ -245,15 +279,15 @@ let merge_constraint initial_env loc sg constr = real_id := Some id; (Pident id, lid, Twith_typesubst tdecl), make_next_first rs rem - | (Sig_module(id, md, rs) :: rem, [s], Pwith_module (_, lid')) + | (Sig_module(id, md, is, rs) :: rem, [s], Pwith_module (_, lid')) when Ident.name id = s -> let path, md' = Typetexp.find_module initial_env loc lid'.txt in let md'' = {md' with md_type = Mtype.remove_aliases env md'.md_type} in let newmd = Mtype.strengthen_decl env md'' path in ignore(Includemod.modtypes env newmd.md_type md.md_type); (Pident id, lid, Twith_module (path, lid')), - Sig_module(id, newmd, rs) :: rem - | (Sig_module(id, md, rs) :: rem, [s], Pwith_modsubst (_, lid')) + Sig_module(id, newmd, is, rs) :: rem + | (Sig_module(id, md, is, rs) :: rem, [s], Pwith_modsubst (_, lid')) when Ident.name id = s -> let path, md' = Typetexp.find_module initial_env loc lid'.txt in let newmd = Mtype.strengthen_decl env md' path in @@ -261,12 +295,12 @@ let merge_constraint initial_env loc sg constr = real_id := Some id; (Pident id, lid, Twith_modsubst (path, lid')), make_next_first rs rem - | (Sig_module(id, md, rs) :: rem, s :: namelist, _) + | (Sig_module(id, md, is, rs) :: rem, s :: namelist, _) when Ident.name id = s -> let ((path, path_loc, tcstr), newsg) = merge env (extract_sig env loc md.md_type) namelist None in (path_concat id path, lid, tcstr), - Sig_module(id, {md with md_type=Mty_signature newsg}, rs) :: rem + Sig_module(id, {md with md_type=Mty_signature newsg}, is, rs) :: rem | (item :: rem, _, _) -> let (cstr, items) = merge (Env.add_item item env) rem namelist row_id in @@ -392,7 +426,6 @@ and approx_module_declaration env pmd = Types.md_type = approx_modtype env pmd.pmd_type; md_attributes = pmd.pmd_attributes; md_loc = pmd.pmd_loc; - md_implicit = pmd.pmd_implicit; } and approx_sig env ssg = @@ -409,21 +442,23 @@ and approx_sig env ssg = let (id, newenv) = Env.enter_module_declaration pmd.pmd_name.txt md env in - Sig_module(id, md, Trec_not) :: approx_sig newenv srem + Sig_module(id, md, pmd.pmd_implicit, Trec_not) + :: approx_sig newenv srem | Psig_recmodule sdecls -> let decls = List.map (fun pmd -> (Ident.create pmd.pmd_name.txt, + pmd.pmd_implicit, approx_module_declaration env pmd) ) sdecls in let newenv = List.fold_left - (fun env (id, md) -> Env.add_module_declaration id md env) + (fun env (id, _, md) -> Env.add_module_declaration id md env) env decls in - map_rec (fun rs (id, md) -> Sig_module(id, md, rs)) decls + map_rec (fun rs (id, is, md) -> Sig_module(id, md, is, rs)) decls (approx_sig newenv srem) | Psig_modtype d -> let info = approx_modtype_info env d in @@ -490,7 +525,7 @@ let check_name cl set_ref name = let check_sig_item type_names module_names modtype_names loc = function Sig_type(id, _, _) -> check "type" loc type_names (Ident.name id) - | Sig_module(id, _, _) -> + | Sig_module(id, _, _, _) -> check "module" loc module_names (Ident.name id) | Sig_modtype(id, _) -> check "module type" loc modtype_names (Ident.name id) @@ -679,18 +714,32 @@ and transl_signature env sg = md_type = tmty.mty_type; md_attributes = pmd.pmd_attributes; md_loc = pmd.pmd_loc; - md_implicit = pmd.pmd_implicit; } in let (id, newenv) = Env.enter_module_declaration pmd.pmd_name.txt md env in + let imp, newenv = + match pmd.pmd_implicit with + | Nonimplicit -> [], newenv + | Implicit -> + let path = Pident id in + let imp = + { Types. imp_path = path; + imp_kind = Imp_implicit; + imp_loc = pmd.pmd_loc; + imp_attributes = []; + } + in + let newenv = Env.add_implicit imp newenv in + [Sig_implicit(imp, Timps_attached)], newenv + in let (trem, rem, final_env) = transl_sig newenv srem in mksig (Tsig_module {md_id = id; md_name = pmd.pmd_name; md_type = tmty; md_loc = pmd.pmd_loc; md_implicit = pmd.pmd_implicit; md_attributes = pmd.pmd_attributes}) env loc :: trem, - Sig_module(id, md, Trec_not) :: rem, + Sig_module(id, md, pmd.pmd_implicit, Trec_not) :: (imp @ rem), final_env | Psig_recmodule sdecls -> List.iter @@ -704,9 +753,8 @@ and transl_signature env sg = let d = {Types.md_type = md.md_type.mty_type; md_attributes = md.md_attributes; md_loc = md.md_loc; - md_implicit = md.md_implicit; } in - Sig_module(md.md_id, d, rs)) + Sig_module(md.md_id, d, md.md_implicit, rs)) decls rem, final_env | Psig_modtype pmtd -> @@ -726,7 +774,7 @@ and transl_signature env sg = let (timp, imp, newenv) = type_implicit env simp in let (trem, rem, final_env) = transl_sig newenv srem in mksig (Tsig_implicit timp) env loc :: trem, - Sig_implicit imp :: rem, final_env + Sig_implicit(imp, Timps_standalone) :: rem, final_env | Psig_include sincl -> let smty = sincl.pincl_mod in let tmty = transl_modtype env smty in @@ -949,35 +997,6 @@ let rec path_of_module mexp = path_of_module mexp | _ -> assert false -(* Check that all core type schemes in a structure are closed *) - -let rec closed_modtype = function - Mty_ident p -> true - | Mty_alias p -> true - | Mty_signature sg -> List.for_all closed_signature_item sg - | Mty_functor(param, body) -> closed_modtype body - -and closed_signature_item = function - Sig_value(id, desc) -> Ctype.closed_schema desc.val_type - | Sig_module(id, md, _) -> closed_modtype md.md_type - | _ -> true - -let check_nongen_scheme env str = - match str.str_desc with - Tstr_value(rec_flag, pat_exp_list) -> - List.iter - (fun {vb_expr=exp} -> - if not (Ctype.closed_schema exp.exp_type) then - raise(Error(exp.exp_loc, env, Non_generalizable exp.exp_type))) - pat_exp_list - | Tstr_module {mb_expr=md;_} -> - if not (closed_modtype md.mod_type) then - raise(Error(md.mod_loc, env, Non_generalizable_module md.mod_type)) - | _ -> () - -let check_nongen_schemes env str = - List.iter (check_nongen_scheme env) str - (* Helpers for typing recursive modules *) let anchor_submodule name anchor = @@ -1100,7 +1119,7 @@ let rec package_constraints env loc mty constrs = when List.mem_assoc [Ident.name id] constrs -> let ty = List.assoc [Ident.name id] constrs in Sig_type (id, {td with type_manifest = Some ty}, rs) - | Sig_module (id, md, rs) -> + | Sig_module (id, md, is, rs) -> let rec aux = function | (m :: ((_ :: _) as l), t) :: rest when m = Ident.name id -> (l, t) :: aux rest @@ -1112,7 +1131,7 @@ let rec package_constraints env loc mty constrs = md_type = package_constraints env loc md.md_type (aux constrs) } in - Sig_module (id, md, rs) + Sig_module (id, md, is, rs) | item -> item ) sg @@ -1415,27 +1434,36 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = { md_type = enrich_module_type anchor name.txt modl.mod_type env; md_attributes = attrs; md_loc = pmb_loc; - md_implicit = pmb_implicit; } in let (id, newenv) = Env.enter_module_declaration name.txt md env in - begin match pmb_implicit with - | Nonimplicit -> () - | Implicit -> - if not (closed_modtype modl.mod_type) then - raise(Error(modl.mod_loc, env, - Non_generalizable_module modl.mod_type)) - end; + let imp, newenv = + match pmb_implicit with + | Nonimplicit -> [], newenv + | Implicit -> + if not (closed_modtype modl.mod_type) then + raise(Error(modl.mod_loc, newenv, + Non_generalizable_module modl.mod_type)); + let path = Pident id in + let imp = + { Types. imp_path = path; + imp_kind = Imp_implicit; + imp_loc = pmb_loc; + imp_attributes = []; + } + in + let newenv = Env.add_implicit imp newenv in + [Sig_implicit(imp, Timps_attached)], newenv + in Tstr_module {mb_id = id; mb_name = name; mb_expr = modl; mb_attributes = attrs; mb_loc = pmb_loc; mb_implicit = pmb_implicit; }, - [Sig_module(id, + (Sig_module(id, {md_type = modl.mod_type; md_attributes = attrs; md_loc = pmb_loc; - md_implicit = pmb_implicit; - }, Trec_not)], + }, pmb_implicit, Trec_not)) :: imp, newenv | Pstr_recmodule sbind -> let sbind = @@ -1483,7 +1511,6 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = md_type = md.md_type.mty_type; md_attributes = md.md_attributes; md_loc = md.md_loc; - md_implicit = md.md_implicit; } in Env.add_module_declaration md.md_id mdecl env @@ -1498,8 +1525,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = md_type = mb.mb_expr.mod_type; md_attributes = mb.mb_attributes; md_loc = mb.mb_loc; - md_implicit = mb.mb_implicit; - }, rs)) + }, mb.mb_implicit, rs)) bindings2 [], newenv | Pstr_modtype pmtd -> @@ -1513,7 +1539,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = Tstr_open od, [], newenv | Pstr_implicit simp -> let (timp, imp, newenv) = type_implicit env simp in - Tstr_implicit timp, [Sig_implicit imp], newenv + Tstr_implicit timp, [Sig_implicit(imp, Timps_standalone)], newenv | Pstr_class cl -> List.iter (fun {pci_name = name} -> check_name "type" type_names name) @@ -1575,11 +1601,11 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = let pos = ref 0 in List.map (function - | Sig_module (id, md, rs) -> + | Sig_module (id, md, is, rs) -> let n = !pos in incr pos; Sig_module (id, {md with md_type = Mty_alias (Pdot(p,Ident.name id,n))}, - rs) + is, rs) | Sig_value (_, {val_kind=Val_reg}) | Sig_typext _ | Sig_class _ as it -> incr pos; it @@ -1650,7 +1676,7 @@ and normalize_signature env = List.iter (normalize_signature_item env) and normalize_signature_item env = function Sig_value(id, desc) -> Ctype.normalize_type env desc.val_type - | Sig_module(id, md, _) -> normalize_modtype env md.md_type + | Sig_module(id, md, _, _) -> normalize_modtype env md.md_type | _ -> () (* Extract the module type of a module expression *) @@ -1861,9 +1887,8 @@ let rec package_signatures subst = function Sig_module(newid, {md_type = Mty_signature sg'; md_attributes = []; md_loc = Location.none; - md_implicit = Nonimplicit; }, - Trec_not) :: + Nonimplicit, Trec_not) :: package_signatures (Subst.add_module oldid (Pident newid) subst) rem let package_units initial_env objfiles cmifile modulename = diff --git a/typing/types.ml b/typing/types.ml index f6fce684e2..603a1ad6dc 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -305,18 +305,17 @@ and signature_item = Sig_value of Ident.t * value_description | Sig_type of Ident.t * type_declaration * rec_status | Sig_typext of Ident.t * extension_constructor * ext_status - | Sig_module of Ident.t * module_declaration * rec_status + | Sig_module of Ident.t * module_declaration * implicit_flag * rec_status | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status - | Sig_implicit of implicit_description + | Sig_implicit of implicit_description * imp_status and module_declaration = { md_type: module_type; md_attributes: Parsetree.attributes; md_loc: Location.t; - md_implicit: implicit_flag; } and modtype_declaration = @@ -335,3 +334,7 @@ and ext_status = Text_first (* first constructor of an extension *) | Text_next (* not first constructor of an extension *) | Text_exception (* an exception *) + +and imp_status = + | Timps_standalone (* A stand-alone implicit statement *) + | Timps_attached (* Part of an implicit module declaration *) diff --git a/typing/types.mli b/typing/types.mli index c9c4761701..59ea4b6bcf 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -295,18 +295,17 @@ and signature_item = Sig_value of Ident.t * value_description | Sig_type of Ident.t * type_declaration * rec_status | Sig_typext of Ident.t * extension_constructor * ext_status - | Sig_module of Ident.t * module_declaration * rec_status + | Sig_module of Ident.t * module_declaration * implicit_flag * rec_status | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status - | Sig_implicit of implicit_description + | Sig_implicit of implicit_description * imp_status and module_declaration = { md_type: module_type; md_attributes: Parsetree.attributes; md_loc: Location.t; - md_implicit: implicit_flag; } and modtype_declaration = @@ -325,3 +324,7 @@ and ext_status = Text_first (* first constructor in an extension *) | Text_next (* not first constructor in an extension *) | Text_exception + +and imp_status = + | Timps_standalone (* A stand-alone implicit statement *) + | Timps_attached (* Part of an implicit module declaration *) From 7c3929fbab628bfae08b65c81aa3b3f44a4ac57e Mon Sep 17 00:00:00 2001 From: Leo White Date: Sun, 3 Jan 2016 19:12:30 +0000 Subject: [PATCH 05/10] Check inclusion for implicit descriptions --- typing/includemod.ml | 104 ++++++++++++++++++++++++++++++++++-------- typing/includemod.mli | 3 +- typing/printtyp.ml | 4 ++ typing/printtyp.mli | 1 + utils/misc.ml | 4 ++ utils/misc.mli | 1 + 6 files changed, 98 insertions(+), 19 deletions(-) diff --git a/typing/includemod.ml b/typing/includemod.ml index 886b74a0a9..c60feba7aa 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -19,7 +19,6 @@ open Types type symptom = Missing_field of Ident.t * Location.t * string (* kind *) - | Implicit_flags of Ident.t * Location.t * Location.t | Value_descriptions of Ident.t * value_description * value_description | Type_declarations of Ident.t * type_declaration * type_declaration * Includecore.type_mismatch list @@ -38,6 +37,8 @@ type symptom = | Unbound_modtype_path of Path.t | Unbound_module_path of Path.t | Invalid_module_alias of Path.t + | Missing_implicit of implicit_description + | Reordered_implicits of implicit_description * implicit_description type pos = | Module of Ident.t @@ -214,6 +215,63 @@ let simplify_structure_coercion cc id_pos_list = then Tcoerce_none else Tcoerce_structure (cc, id_pos_list) +(* Check inclusion between a signature's implicits *) + +let check_implicits env cxt subst imps1 imps2 = + let mem_implicit imps imp = + let kind = imp.imp_kind in + let path = Env.canonical_path env imp.imp_path in + List.exists + (fun imp' -> + if imp'.imp_kind = kind then begin + let path' = Env.canonical_path env imp'.imp_path in + Path.same path path' + end else false) + imps + in + let find_implicit imps imp = + let kind = imp.imp_kind in + let path = Env.canonical_path env imp.imp_path in + let rec loop acc = function + | [] -> raise Not_found + | imp' :: rem -> + if imp'.imp_kind = kind then begin + let path' = Env.canonical_path env imp'.imp_path in + if Path.same path path' then List.rev acc, rem + else loop (imp' :: acc) rem + end else loop (imp' :: acc) rem + in + loop [] imps + in + let rec loop passed prev imps exps rem = function + | [] -> () + | next :: rest -> + let next = Subst.implicit_description subst next in + try + match next.imp_kind with + | Imp_implicit -> + if mem_implicit imps next then + loop passed prev imps exps rem rest + else + let before, after = find_implicit rem next in + loop (passed @ exps) (Some next) (imps @ before) [] after rest + | Imp_explicit -> + if mem_implicit exps next then + loop passed prev imps exps rem rest + else + let before, after = find_implicit rem next in + loop (passed @ imps) (Some next) [] (exps @ before) after rest + with Not_found -> + if mem_implicit passed next + || mem_implicit imps next + || mem_implicit exps next then + let prev = Misc.opt_value prev in + raise(Error[cxt, env, Reordered_implicits(prev, next)]) + else + raise(Error[cxt, env, Missing_implicit next]) + in + loop [] None [] [] imps1 imps2 + (* Inclusion between module types. Return the restriction that transforms a value of the smaller type into a value of the bigger type. *) @@ -318,44 +376,46 @@ and signatures env cxt subst sig1 sig2 = ((id,pos,Tcoerce_none)::l , pos+1) | item -> (l, if is_runtime_component item then pos+1 else pos)) ([], 0) sig1 in - (* Build a table of the components of sig1, along with their positions. + (* Build a table of the named components of sig1, along with their positions. The table is indexed by kind and name of component *) - let rec build_component_table pos tbl = function - [] -> pos, tbl - | Sig_implicit _ :: rem -> build_component_table pos tbl rem + let rec build_component_table pos tbl imps = function + [] -> pos, tbl, List.rev imps + | Sig_implicit(imp, _) :: rem -> + build_component_table pos tbl (imp :: imps) rem | item :: rem -> let (id, _loc, name) = item_ident_name item in let nextpos = if is_runtime_component item then pos + 1 else pos in build_component_table nextpos - (Tbl.add name (id, item, pos) tbl) rem in - let len1, comps1 = - build_component_table 0 Tbl.empty sig1 in + (Tbl.add name (id, item, pos) tbl) imps rem in + let len1, comps1, imps1 = + build_component_table 0 Tbl.empty [] sig1 in let len2 = List.fold_left (fun n i -> if is_runtime_component i then n + 1 else n) 0 sig2 in - (* Pair each component of sig2 with a component of sig1, + (* Pair each named component of sig2 with a component of sig1, identifying the names along the way. Return a coercion list indicating, for all run-time components of sig2, the position of the matching run-time components of sig1 and the coercion to be applied to it. *) - let rec pair_components subst paired unpaired = function + let rec pair_components subst paired unpaired imps = function [] -> begin match unpaired with [] -> let cc = signature_components new_env cxt subst (List.rev paired) in + check_implicits new_env cxt subst imps1 (List.rev imps); if len1 = len2 then (* see PR#5098 *) simplify_structure_coercion cc id_pos_list else Tcoerce_structure (cc, id_pos_list) | _ -> raise(Error unpaired) end - | Sig_implicit _ :: rem -> - pair_components subst paired unpaired rem + | Sig_implicit(imp, _) :: rem -> + pair_components subst paired unpaired (imp :: imps) rem | item2 :: rem -> let (id2, loc, name2) = item_ident_name item2 in let name2, report = @@ -383,17 +443,17 @@ and signatures env cxt subst sig1 sig2 = subst in pair_components new_subst - ((item1, item2, pos1) :: paired) unpaired rem + ((item1, item2, pos1) :: paired) unpaired imps rem with Not_found -> let unpaired = if report then (cxt, env, Missing_field (id2, loc, kind_of_field_desc name2)) :: unpaired else unpaired in - pair_components subst paired unpaired rem + pair_components subst paired unpaired imps rem end in (* Do the pairing and checking, and return the final coercion *) - pair_components subst [] [] sig2 + pair_components subst [] [] [] sig2 (* Inclusion between signature components *) @@ -508,9 +568,6 @@ let include_err ppf = function | Missing_field (id, loc, kind) -> fprintf ppf "The %s `%a' is required but not provided" kind ident id; show_loc "Expected declaration" ppf loc - | Implicit_flags (id, l1, l2) -> - fprintf ppf "Implicit annotations of %a do not match" ident id; - show_locs ppf (l1, l2) | Value_descriptions(id, d1, d2) -> fprintf ppf "@[Values do not match:@ %a@;<1 -2>is not included in@ %a@]" @@ -569,6 +626,17 @@ let include_err ppf = function fprintf ppf "Unbound module %a" Printtyp.path path | Invalid_module_alias path -> fprintf ppf "Module %a cannot be aliased" Printtyp.path path + | Missing_implicit imp -> + fprintf ppf "`%a %a' is required but not provided" + Printtyp.implicit_kind imp.imp_kind + Printtyp.path imp.imp_path; + show_loc "Expected declaration" ppf imp.imp_loc + | Reordered_implicits(imp1, imp2) -> + fprintf ppf "`%a %a' and `%a %a' have been reordered" + Printtyp.implicit_kind imp1.imp_kind + Printtyp.path imp1.imp_path + Printtyp.implicit_kind imp2.imp_kind + Printtyp.path imp2.imp_path let rec context ppf = function Module id :: rem -> diff --git a/typing/includemod.mli b/typing/includemod.mli index 61e599b1d5..370e31379b 100644 --- a/typing/includemod.mli +++ b/typing/includemod.mli @@ -26,7 +26,6 @@ val print_coercion: formatter -> module_coercion -> unit type symptom = Missing_field of Ident.t * Location.t * string (* kind *) - | Implicit_flags of Ident.t * Location.t * Location.t | Value_descriptions of Ident.t * value_description * value_description | Type_declarations of Ident.t * type_declaration * type_declaration * Includecore.type_mismatch list @@ -45,6 +44,8 @@ type symptom = | Unbound_modtype_path of Path.t | Unbound_module_path of Path.t | Invalid_module_alias of Path.t + | Missing_implicit of implicit_description + | Reordered_implicits of implicit_description * implicit_description type pos = | Module of Ident.t diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 8da5b677a7..869d908c53 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1162,6 +1162,10 @@ let tree_of_implicit_kind = function | Imp_implicit -> Oimp_implicit | Imp_explicit -> Oimp_explicit +let implicit_kind ppf = function + | Imp_implicit -> fprintf ppf "implicit" + | Imp_explicit -> fprintf ppf "explicit" + let tree_of_implicit_status = function | Timps_standalone -> Oimps_standalone | Timps_attached -> Oimps_attached diff --git a/typing/printtyp.mli b/typing/printtyp.mli index 17a9bef05c..8f6982d6ea 100644 --- a/typing/printtyp.mli +++ b/typing/printtyp.mli @@ -69,6 +69,7 @@ val class_declaration: Ident.t -> formatter -> class_declaration -> unit val tree_of_cltype_declaration: Ident.t -> class_type_declaration -> rec_status -> out_sig_item val cltype_declaration: Ident.t -> formatter -> class_type_declaration -> unit +val implicit_kind : formatter -> implicit_kind -> unit val type_expansion: type_expr -> Format.formatter -> type_expr -> unit val prepare_expansion: type_expr * type_expr -> type_expr * type_expr val trace: diff --git a/utils/misc.ml b/utils/misc.ml index 898880cb07..71f9c66de8 100644 --- a/utils/misc.ml +++ b/utils/misc.ml @@ -73,6 +73,10 @@ let may_map f = function Some x -> Some (f x) | None -> None +let opt_value = function + | Some x -> x + | None -> assert false + (* File functions *) let find_in_path path name = diff --git a/utils/misc.mli b/utils/misc.mli index 4a3c84b2d9..c9c8abec1a 100644 --- a/utils/misc.mli +++ b/utils/misc.mli @@ -39,6 +39,7 @@ val samelist: ('a -> 'a -> bool) -> 'a list -> 'a list -> bool val may: ('a -> unit) -> 'a option -> unit val may_map: ('a -> 'b) -> 'a option -> 'b option +val opt_value: 'a option -> 'a val find_in_path: string list -> string -> string (* Search a file in a list of directories. *) From 317c436bf6ef244f2196721d075a8b131106a8c3 Mon Sep 17 00:00:00 2001 From: Leo White Date: Sun, 3 Jan 2016 20:31:47 +0000 Subject: [PATCH 06/10] Add local implicit expression --- parsing/ast_helper.ml | 1 + parsing/ast_helper.mli | 2 ++ parsing/ast_mapper.ml | 1 + parsing/parser.mly | 6 ++++++ parsing/parsetree.mli | 1 + parsing/pprintast.ml | 11 ++++++++++- parsing/printast.ml | 4 ++++ tools/depend.ml | 5 +++-- tools/ocamlprof.ml | 1 + tools/tast_iter.ml | 1 + tools/untypeast.ml | 1 + typing/cmt_format.ml | 2 ++ typing/printtyped.ml | 7 +++++-- typing/typecore.ml | 14 ++++++++++++++ typing/typecore.mli | 5 +++++ typing/typedtree.ml | 1 + typing/typedtree.mli | 1 + typing/typedtreeIter.ml | 1 + typing/typedtreeMap.ml | 1 + typing/typemod.ml | 1 + 20 files changed, 62 insertions(+), 5 deletions(-) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 0eab05c863..bc7f6fa946 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -114,6 +114,7 @@ module Exp = struct let newtype ?loc ?attrs a b = mk ?loc ?attrs (Pexp_newtype (a, b)) let pack ?loc ?attrs a = mk ?loc ?attrs (Pexp_pack a) let open_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_open (a, b, c)) + let implicit_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_implicit (a, b)) let extension ?loc ?attrs a = mk ?loc ?attrs (Pexp_extension a) let case lhs ?guard rhs = diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 2af224cb9e..a325257908 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -138,6 +138,8 @@ module Exp: val newtype: ?loc:loc -> ?attrs:attrs -> string -> expression -> expression val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> expression val open_: ?loc:loc -> ?attrs:attrs -> open_flag -> lid -> expression -> expression + val implicit_: + ?loc:loc -> ?attrs:attrs -> implicit_description -> expression -> expression val extension: ?loc:loc -> ?attrs:attrs -> extension -> expression val case: pattern -> ?guard:expression -> expression -> case diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index ad4ddd4fa5..06466580e2 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -390,6 +390,7 @@ module E = struct | Pexp_pack me -> pack ~loc ~attrs (sub.module_expr sub me) | Pexp_open (ovf, lid, e) -> open_ ~loc ~attrs ovf (map_loc sub lid) (sub.expr sub e) + | Pexp_implicit (imp, e) -> implicit_ ~loc ~attrs imp e | Pexp_extension x -> extension ~loc ~attrs (sub.extension sub x) end diff --git a/parsing/parser.mly b/parsing/parser.mly index 06c5a9fabb..1041f3d946 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1130,6 +1130,12 @@ expr: { mkexp (Pexp_letmodule($2, $4)) (* FIXME: no attributes *) } | LET OPEN open_flag ext_attributes mod_longident IN seq_expr { mkexp_attrs (Pexp_open($3, mkrhs $5 5, $7)) $4 } + | LET IMPLICIT ext_attributes mod_longident IN seq_expr + { mkexp_attrs + (Pexp_implicit (Imp.mk Pimp_implicit (mkrhs $4 4), $6)) $3 } + | LET EXPLICIT ext_attributes mod_longident IN seq_expr + { mkexp_attrs + (Pexp_implicit (Imp.mk Pimp_explicit (mkrhs $4 4), $6)) $3 } | FUNCTION ext_attributes opt_bar match_cases { mkexp_attrs (Pexp_function(List.rev $4)) $2 } | FUN ext_attributes labeled_simple_pattern fun_def diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 2d93ea505e..d3c3782dfa 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -331,6 +331,7 @@ and expression_desc = let! open M in E let open implicit M in E *) + | Pexp_implicit of implicit_description * expression | Pexp_extension of extension (* [%id] *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index cea63549f9..82915923f2 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -640,7 +640,16 @@ class printer ()= object(self:'self) pp f "@[(!poly!@ %a@ : %a)@]" self#simple_expr e self#core_type ct | Pexp_open (ovf, lid, e) -> pp f "@[<2>let open%s %a in@;%a@]" (open_flag ovf) self#longident_loc lid - self#expression e + self#expression e + | Pexp_implicit(imp, e) -> + let kind = + match imp.pimp_kind with + | Pimp_implicit -> "implicit" + | Pimp_explicit -> "explicit" + in + pp f "@[<2>let %s %a in@;%a@]" + kind self#longident_loc imp.pimp_lid + self#expression e | Pexp_variant (l,Some eo) -> pp f "@[<2>`%s@;%a@]" l self#simple_expr eo | Pexp_extension e -> self#extension f e diff --git a/parsing/printast.ml b/parsing/printast.ml index 5eabf860f2..2052885e66 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -383,6 +383,10 @@ and expression i ppf x = line i ppf "Pexp_open %a \"%a\"\n" fmt_open_flag ovf fmt_longident_loc m; expression i ppf e + | Pexp_implicit (imp, e) -> + line i ppf "Pexp_implicit \"%a\"\n" fmt_longident_loc imp.pimp_lid; + implicit_kind i ppf imp.pimp_kind; + expression i ppf e | Pexp_extension (s, arg) -> line i ppf "Pexp_extension \"%s\"\n" s.txt; payload i ppf arg diff --git a/tools/depend.ml b/tools/depend.ml index cfc0ad5ccf..528858eb2b 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -193,6 +193,7 @@ let rec add_expr bv exp = | Pexp_newtype (_, e) -> add_expr bv e | Pexp_pack m -> add_module bv m | Pexp_open (_ovf, m, e) -> addmodule bv m; add_expr bv e + | Pexp_implicit (imp, e) -> addmodule bv imp.pimp_lid; add_expr bv e | Pexp_extension _ -> () and add_cases bv cases = @@ -267,8 +268,8 @@ and add_sig_item bv item = List.iter (add_class_description bv) cdl; bv | Psig_class_type cdtl -> List.iter (add_class_type_declaration bv) cdtl; bv - | Psig_implicit id -> - addmodule bv id.pimp_lid; bv + | Psig_implicit imp -> + addmodule bv imp.pimp_lid; bv | Psig_attribute _ | Psig_extension _ -> bv diff --git a/tools/ocamlprof.ml b/tools/ocamlprof.ml index ea44e3dbbe..6ab75f57f4 100644 --- a/tools/ocamlprof.ml +++ b/tools/ocamlprof.ml @@ -292,6 +292,7 @@ and rw_exp iflag sexp = | Pexp_newtype (_, sexp) -> rewrite_exp iflag sexp | Pexp_open (_ovf, _, e) -> rewrite_exp iflag e + | Pexp_implicit (_, e) -> rewrite_exp iflag e | Pexp_pack (smod) -> rewrite_mod iflag smod | Pexp_extension _ -> () diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 84564de32d..2fc09bb07a 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -98,6 +98,7 @@ let expression sub exp = | Texp_coerce (cty1, cty2) -> opt (sub # core_type) cty1; sub # core_type cty2 | Texp_open _ + | Texp_implicit _ | Texp_newtype _ -> () | Texp_poly cto -> opt (sub # core_type) cto in diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 264dd43f83..ac7230debe 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -263,6 +263,7 @@ and untype_extra (extra, loc, attrs) sexp = | Texp_constraint cty -> Pexp_constraint (sexp, untype_core_type cty) | Texp_open (ovf, _path, lid, _) -> Pexp_open (ovf, lid, sexp) + | Texp_implicit (imp, _) -> Pexp_implicit (untype_implicit_description imp, sexp) | Texp_poly cto -> Pexp_poly (sexp, option untype_core_type cto) | Texp_newtype s -> Pexp_newtype (s, sexp) in diff --git a/typing/cmt_format.ml b/typing/cmt_format.ml index 6cecb1b691..1f945a9018 100644 --- a/typing/cmt_format.ml +++ b/typing/cmt_format.ml @@ -77,6 +77,8 @@ module ClearEnv = TypedtreeMap.MakeMap (struct let exp_extra = List.map (function (Texp_open (ovf, path, lloc, env), loc, attrs) -> (Texp_open (ovf, path, lloc, keep_only_summary env), loc, attrs) + | (Texp_implicit (imp, env), loc, attrs) -> + (Texp_implicit (imp, keep_only_summary env), loc, attrs) | exp_extra -> exp_extra) e.exp_extra in { e with exp_env = keep_only_summary e.exp_env; diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 4678c3d26f..f845df753d 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -288,6 +288,10 @@ and expression_extra i ppf x attrs = | Texp_open (ovf, m, _, _) -> line i ppf "Pexp_open %a \"%a\"\n" fmt_open_flag ovf fmt_path m; attributes i ppf attrs; + | Texp_implicit (imp, _) -> + line i ppf "Pexp_implicit \"%a\"\n" fmt_path imp.imp_path; + implicit_kind i ppf imp.imp_kind; + attributes i ppf attrs; | Texp_poly cto -> line i ppf "Pexp_poly\n"; attributes i ppf attrs; @@ -677,8 +681,7 @@ and signature_item i ppf x = attributes i ppf incl.incl_attributes; module_type i ppf incl.incl_mod | Tsig_implicit imp -> - line i ppf "Psig_implicit %a\n" - fmt_path imp.imp_path; + line i ppf "Psig_implicit %a\n" fmt_path imp.imp_path; implicit_kind i ppf imp.imp_kind; attributes i ppf imp.imp_attributes | Tsig_class (l) -> diff --git a/typing/typecore.ml b/typing/typecore.ml index cc5b08ad17..4222ee52fb 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -86,6 +86,11 @@ let type_module = let type_open = ref (fun _ -> assert false) +(* Forward declaration, to be filled in by Typemod.type_implicit *) + +let type_implicit = + ref (fun _ -> assert false) + (* Forward declaration, to be filled in by Typemod.type_package *) let type_package = @@ -144,6 +149,7 @@ let iter_expression f e = | Pexp_record (iel, eo) -> may expr eo; List.iter (fun (_, e) -> expr e) iel | Pexp_open (_, _, e) + | Pexp_implicit (_, e) | Pexp_newtype (_, e) | Pexp_poly (e, _) | Pexp_lazy e @@ -2770,6 +2776,14 @@ and type_expect_ ?in_function env sexp ty_expected = sexp.pexp_attributes) :: exp.exp_extra; } + | Pexp_implicit (imp, e) -> + let (imp, _, newenv) = !type_implicit env imp in + let exp = type_expect newenv e ty_expected in + { exp with + exp_extra = (Texp_implicit (imp, newenv), loc, + sexp.pexp_attributes) :: + exp.exp_extra; + } | Pexp_extension ext -> raise (Error_forward (Typetexp.error_of_extension ext)) diff --git a/typing/typecore.mli b/typing/typecore.mli index d701e679e9..04c437c16f 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -129,6 +129,11 @@ val type_module: val type_open: (open_flag -> Env.t -> Location.t -> Longident.t loc -> Path.t * Env.t) ref +(* Forward declaration, to be filled in by Typemod.type_implicit *) +val type_implicit: + (Env.t -> Parsetree.implicit_description -> + Typedtree.implicit_description * Types.implicit_description * Env.t) + ref (* Forward declaration, to be filled in by Typeclass.class_structure *) val type_object: (Env.t -> Location.t -> Parsetree.class_structure -> diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 20efed0172..e4232e4471 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -66,6 +66,7 @@ and exp_extra = | Texp_constraint of core_type | Texp_coerce of core_type option * core_type | Texp_open of open_flag * Path.t * Longident.t loc * Env.t + | Texp_implicit of implicit_description * Env.t | Texp_poly of core_type option | Texp_newtype of string diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 2a85a44355..7b8dc39e44 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -65,6 +65,7 @@ and exp_extra = | Texp_constraint of core_type | Texp_coerce of core_type option * core_type | Texp_open of open_flag * Path.t * Longident.t loc * Env.t + | Texp_implicit of implicit_description * Env.t | Texp_poly of core_type option | Texp_newtype of string diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index da649aeba0..22e434f7dd 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -245,6 +245,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Texp_coerce (cty1, cty2) -> option iter_core_type cty1; iter_core_type cty2 | Texp_open (_, path, _, _) -> () + | Texp_implicit _ -> () | Texp_poly cto -> option iter_core_type cto | Texp_newtype s -> ()) exp.exp_extra; diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 45c72c4480..15b2836e9d 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -383,6 +383,7 @@ module MakeMap(Map : MapArgument) = struct Texp_poly (Some ( map_core_type ct )), loc, attrs | Texp_newtype _ | Texp_open _ + | Texp_implicit _ | Texp_poly None -> exp_extra diff --git a/typing/typemod.ml b/typing/typemod.ml index c0bcbc11ec..f40071ceb8 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1791,6 +1791,7 @@ let () = Typetexp.transl_modtype_longident := transl_modtype_longident; Typetexp.transl_modtype := transl_modtype; Typecore.type_open := type_open_ ?toplevel:None; + Typecore.type_implicit := type_implicit; Typecore.type_package := type_package; Typeimplicit.type_implicit_instance := type_implicit_instance; type_module_type_of_fwd := type_module_type_of From fbdf1329833381e6374588bad76f32570a1858ae Mon Sep 17 00:00:00 2001 From: Leo White Date: Sun, 3 Jan 2016 21:38:17 +0000 Subject: [PATCH 07/10] Bootstrap --- boot/ocamlc | Bin 9694069 -> 9769356 bytes boot/ocamldep | Bin 536683 -> 541673 bytes boot/ocamllex | Bin 251598 -> 251598 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/boot/ocamlc b/boot/ocamlc index 529f035f3dcecdab3cfe125302dc34ad9deedaec..c652ff793a2f8760ae1856e10ecd0440a76b2c02 100755 GIT binary patch delta 3876144 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