531 lines
21 KiB
Diff
531 lines
21 KiB
Diff
Index: typing/typemod.ml
|
|
===================================================================
|
|
--- typing/typemod.ml (revision 13947)
|
|
+++ typing/typemod.ml (working copy)
|
|
@@ -80,6 +80,9 @@
|
|
Typedtree.module_expr * Types.module_type) ref
|
|
= ref (fun env m -> assert false)
|
|
|
|
+let transl_modtype_fwd =
|
|
+ ref (fun env m -> (assert false : Typedtree.module_type))
|
|
+
|
|
(* Merge one "with" constraint in a signature *)
|
|
|
|
let rec add_rec_types env = function
|
|
@@ -191,6 +194,21 @@
|
|
merge env (extract_sig env loc mty) namelist None in
|
|
(path_concat id path, lid, tcstr),
|
|
Sig_module(id, Mty_signature newsg, rs) :: rem
|
|
+ | (Sig_modtype(id, mtd) :: rem, [s], Pwith_modtype pmty)
|
|
+ when Ident.name id = s ->
|
|
+ let mty = !transl_modtype_fwd initial_env pmty in
|
|
+ let mtd' = Modtype_manifest mty.mty_type in
|
|
+ Includemod.modtype_declarations env id mtd' mtd;
|
|
+ (Pident id, lid, Twith_modtype (Tmodtype_manifest mty)),
|
|
+ Sig_modtype(id, mtd') :: rem
|
|
+ | (Sig_modtype(id, mtd) :: rem, [s], Pwith_modtypesubst pmty)
|
|
+ when Ident.name id = s ->
|
|
+ let mty = !transl_modtype_fwd initial_env pmty in
|
|
+ let mtd' = Modtype_manifest mty.mty_type in
|
|
+ Includemod.modtype_declarations env id mtd' mtd;
|
|
+ real_id := Some id;
|
|
+ (Pident id, lid, Twith_modtypesubst (Tmodtype_manifest mty)),
|
|
+ rem
|
|
| (item :: rem, _, _) ->
|
|
let (cstr, items) = merge (Env.add_item item env) rem namelist row_id
|
|
in
|
|
@@ -233,6 +251,12 @@
|
|
let (path, _) = Typetexp.find_module initial_env loc lid.txt in
|
|
let sub = Subst.add_module id path Subst.identity in
|
|
Subst.signature sub sg
|
|
+ | [s], Pwith_modtypesubst pmty ->
|
|
+ let id =
|
|
+ match !real_id with None -> assert false | Some id -> id in
|
|
+ let mty = !transl_modtype_fwd initial_env pmty in
|
|
+ let sub = Subst.add_modtype id mty.mty_type Subst.identity in
|
|
+ Subst.signature sub sg
|
|
| _ ->
|
|
sg
|
|
in
|
|
@@ -649,6 +673,8 @@
|
|
check_recmod_typedecls env2 sdecls dcl2;
|
|
(dcl2, env2)
|
|
|
|
+let () = transl_modtype_fwd := transl_modtype
|
|
+
|
|
(* Try to convert a module expression to a module path. *)
|
|
|
|
exception Not_a_path
|
|
Index: typing/typedtreeMap.ml
|
|
===================================================================
|
|
--- typing/typedtreeMap.ml (revision 13947)
|
|
+++ typing/typedtreeMap.ml (working copy)
|
|
@@ -457,6 +457,9 @@
|
|
| Twith_typesubst decl -> Twith_typesubst (map_type_declaration decl)
|
|
| Twith_module (path, lid) -> cstr
|
|
| Twith_modsubst (path, lid) -> cstr
|
|
+ | Twith_modtype decl -> Twith_modtype (map_modtype_declaration decl)
|
|
+ | Twith_modtypesubst decl ->
|
|
+ Twith_modtypesubst (map_modtype_declaration decl)
|
|
in
|
|
Map.leave_with_constraint cstr
|
|
|
|
Index: typing/typedtree.ml
|
|
===================================================================
|
|
--- typing/typedtree.ml (revision 13947)
|
|
+++ typing/typedtree.ml (working copy)
|
|
@@ -255,6 +255,8 @@
|
|
| Twith_module of Path.t * Longident.t loc
|
|
| Twith_typesubst of type_declaration
|
|
| Twith_modsubst of Path.t * Longident.t loc
|
|
+ | Twith_modtype of modtype_declaration
|
|
+ | Twith_modtypesubst of modtype_declaration
|
|
|
|
and core_type =
|
|
(* mutable because of [Typeclass.declare_method] *)
|
|
Index: typing/typedtree.mli
|
|
===================================================================
|
|
--- typing/typedtree.mli (revision 13947)
|
|
+++ typing/typedtree.mli (working copy)
|
|
@@ -254,6 +254,8 @@
|
|
| Twith_module of Path.t * Longident.t loc
|
|
| Twith_typesubst of type_declaration
|
|
| Twith_modsubst of Path.t * Longident.t loc
|
|
+ | Twith_modtype of modtype_declaration
|
|
+ | Twith_modtypesubst of modtype_declaration
|
|
|
|
and core_type =
|
|
(* mutable because of [Typeclass.declare_method] *)
|
|
Index: typing/includemod.ml
|
|
===================================================================
|
|
--- typing/includemod.ml (revision 13947)
|
|
+++ typing/includemod.ml (working copy)
|
|
@@ -346,10 +346,10 @@
|
|
|
|
(* Hide the context and substitution parameters to the outside world *)
|
|
|
|
-let modtypes env mty1 mty2 = modtypes env [] Subst.identity mty1 mty2
|
|
-let signatures env sig1 sig2 = signatures env [] Subst.identity sig1 sig2
|
|
-let type_declarations env id decl1 decl2 =
|
|
- type_declarations env [] Subst.identity id decl1 decl2
|
|
+let modtypes env = modtypes env [] Subst.identity
|
|
+let signatures env = signatures env [] Subst.identity
|
|
+let type_declarations env = type_declarations env [] Subst.identity
|
|
+let modtype_declarations env = modtype_infos env [] Subst.identity
|
|
|
|
(* Error report *)
|
|
|
|
Index: typing/typedtreeIter.ml
|
|
===================================================================
|
|
--- typing/typedtreeIter.ml (revision 13947)
|
|
+++ typing/typedtreeIter.ml (working copy)
|
|
@@ -408,6 +408,8 @@
|
|
| Twith_module _ -> ()
|
|
| Twith_typesubst decl -> iter_type_declaration decl
|
|
| Twith_modsubst _ -> ()
|
|
+ | Twith_modtype decl -> iter_modtype_declaration decl
|
|
+ | Twith_modtypesubst decl -> iter_modtype_declaration decl
|
|
end;
|
|
Iter.leave_with_constraint cstr;
|
|
|
|
Index: typing/includemod.mli
|
|
===================================================================
|
|
--- typing/includemod.mli (revision 13947)
|
|
+++ typing/includemod.mli (working copy)
|
|
@@ -21,6 +21,8 @@
|
|
val compunit: string -> signature -> string -> signature -> module_coercion
|
|
val type_declarations:
|
|
Env.t -> Ident.t -> type_declaration -> type_declaration -> unit
|
|
+val modtype_declarations:
|
|
+ Env.t -> Ident.t -> modtype_declaration -> modtype_declaration -> unit
|
|
|
|
type symptom =
|
|
Missing_field of Ident.t
|
|
Index: typing/printtyped.ml
|
|
===================================================================
|
|
--- typing/printtyped.ml (revision 13947)
|
|
+++ typing/printtyped.ml (working copy)
|
|
@@ -608,6 +608,12 @@
|
|
type_declaration (i+1) ppf td;
|
|
| Twith_module (li,_) -> line i ppf "Pwith_module %a\n" fmt_path li;
|
|
| Twith_modsubst (li,_) -> line i ppf "Pwith_modsubst %a\n" fmt_path li;
|
|
+ | Twith_modtype (td) ->
|
|
+ line i ppf "Pwith_modtype\n";
|
|
+ modtype_declaration (i+1) ppf td;
|
|
+ | Twith_modtypesubst (td) ->
|
|
+ line i ppf "Pwith_modtypesubst\n";
|
|
+ modtype_declaration (i+1) ppf td;
|
|
|
|
and module_expr i ppf x =
|
|
line i ppf "module_expr %a\n" fmt_location x.mod_loc;
|
|
Index: experimental/garrigue/with-module-type.diffs
|
|
===================================================================
|
|
--- experimental/garrigue/with-module-type.diffs (revision 13947)
|
|
+++ experimental/garrigue/with-module-type.diffs (working copy)
|
|
@@ -1,95 +1,53 @@
|
|
-Index: parsing/parser.mly
|
|
-===================================================================
|
|
---- parsing/parser.mly (revision 12005)
|
|
-+++ parsing/parser.mly (working copy)
|
|
-@@ -1504,6 +1504,10 @@
|
|
- { ($2, Pwith_module $4) }
|
|
- | MODULE mod_longident COLONEQUAL mod_ext_longident
|
|
- { ($2, Pwith_modsubst $4) }
|
|
-+ | MODULE TYPE mod_longident EQUAL module_type
|
|
-+ { ($3, Pwith_modtype $5) }
|
|
-+ | MODULE TYPE mod_longident COLONEQUAL module_type
|
|
-+ { ($3, Pwith_modtypesubst $5) }
|
|
- ;
|
|
- with_type_binder:
|
|
- EQUAL { Public }
|
|
-Index: parsing/parsetree.mli
|
|
-===================================================================
|
|
---- parsing/parsetree.mli (revision 12005)
|
|
-+++ parsing/parsetree.mli (working copy)
|
|
-@@ -239,6 +239,8 @@
|
|
- | Pwith_module of Longident.t
|
|
- | Pwith_typesubst of type_declaration
|
|
- | Pwith_modsubst of Longident.t
|
|
-+ | Pwith_modtype of module_type
|
|
-+ | Pwith_modtypesubst of module_type
|
|
-
|
|
- (* Value expressions for the module language *)
|
|
-
|
|
-Index: parsing/printast.ml
|
|
-===================================================================
|
|
---- parsing/printast.ml (revision 12005)
|
|
-+++ parsing/printast.ml (working copy)
|
|
-@@ -575,6 +575,12 @@
|
|
- type_declaration (i+1) ppf td;
|
|
- | Pwith_module (li) -> line i ppf "Pwith_module %a\n" fmt_longident li;
|
|
- | Pwith_modsubst (li) -> line i ppf "Pwith_modsubst %a\n" fmt_longident li;
|
|
-+ | Pwith_modtype (mty) ->
|
|
-+ line i ppf "Pwith_modtype\n";
|
|
-+ module_type (i+1) ppf mty;
|
|
-+ | Pwith_modtypesubst (mty) ->
|
|
-+ line i ppf "Pwith_modtype\n";
|
|
-+ module_type (i+1) ppf mty;
|
|
-
|
|
- and module_expr i ppf x =
|
|
- line i ppf "module_expr %a\n" fmt_location x.pmod_loc;
|
|
Index: typing/typemod.ml
|
|
===================================================================
|
|
---- typing/typemod.ml (revision 12005)
|
|
+--- typing/typemod.ml (revision 13947)
|
|
+++ typing/typemod.ml (working copy)
|
|
-@@ -74,6 +74,8 @@
|
|
- : (Env.t -> Parsetree.module_expr -> module_type) ref
|
|
+@@ -80,6 +80,9 @@
|
|
+ Typedtree.module_expr * Types.module_type) ref
|
|
= ref (fun env m -> assert false)
|
|
|
|
-+let transl_modtype_fwd = ref (fun env m -> assert false)
|
|
++let transl_modtype_fwd =
|
|
++ ref (fun env m -> (assert false : Typedtree.module_type))
|
|
+
|
|
(* Merge one "with" constraint in a signature *)
|
|
|
|
let rec add_rec_types env = function
|
|
-@@ -163,6 +165,19 @@
|
|
- ignore(Includemod.modtypes env newmty mty);
|
|
- real_id := Some id;
|
|
- make_next_first rs rem
|
|
-+ | (Tsig_modtype(id, mtd) :: rem, [s], Pwith_modtype pmty)
|
|
+@@ -191,6 +194,21 @@
|
|
+ merge env (extract_sig env loc mty) namelist None in
|
|
+ (path_concat id path, lid, tcstr),
|
|
+ Sig_module(id, Mty_signature newsg, rs) :: rem
|
|
++ | (Sig_modtype(id, mtd) :: rem, [s], Pwith_modtype pmty)
|
|
+ when Ident.name id = s ->
|
|
+ let mty = !transl_modtype_fwd initial_env pmty in
|
|
-+ let mtd' = Tmodtype_manifest mty in
|
|
++ let mtd' = Modtype_manifest mty.mty_type in
|
|
+ Includemod.modtype_declarations env id mtd' mtd;
|
|
-+ Tsig_modtype(id, mtd') :: rem
|
|
-+ | (Tsig_modtype(id, mtd) :: rem, [s], Pwith_modtypesubst pmty)
|
|
++ (Pident id, lid, Twith_modtype (Tmodtype_manifest mty)),
|
|
++ Sig_modtype(id, mtd') :: rem
|
|
++ | (Sig_modtype(id, mtd) :: rem, [s], Pwith_modtypesubst pmty)
|
|
+ when Ident.name id = s ->
|
|
+ let mty = !transl_modtype_fwd initial_env pmty in
|
|
-+ let mtd' = Tmodtype_manifest mty in
|
|
++ let mtd' = Modtype_manifest mty.mty_type in
|
|
+ Includemod.modtype_declarations env id mtd' mtd;
|
|
+ real_id := Some id;
|
|
++ (Pident id, lid, Twith_modtypesubst (Tmodtype_manifest mty)),
|
|
+ rem
|
|
- | (Tsig_module(id, mty, rs) :: rem, s :: namelist, _)
|
|
- when Ident.name id = s ->
|
|
- let newsg = merge env (extract_sig env loc mty) namelist None in
|
|
-@@ -200,6 +215,12 @@
|
|
- let (path, _) = Typetexp.find_module initial_env loc lid in
|
|
+ | (item :: rem, _, _) ->
|
|
+ let (cstr, items) = merge (Env.add_item item env) rem namelist row_id
|
|
+ in
|
|
+@@ -233,6 +251,12 @@
|
|
+ let (path, _) = Typetexp.find_module initial_env loc lid.txt in
|
|
let sub = Subst.add_module id path Subst.identity in
|
|
Subst.signature sub sg
|
|
+ | [s], Pwith_modtypesubst pmty ->
|
|
+ let id =
|
|
+ match !real_id with None -> assert false | Some id -> id in
|
|
+ let mty = !transl_modtype_fwd initial_env pmty in
|
|
-+ let sub = Subst.add_modtype id mty Subst.identity in
|
|
++ let sub = Subst.add_modtype id mty.mty_type Subst.identity in
|
|
+ Subst.signature sub sg
|
|
| _ ->
|
|
- sg
|
|
- with Includemod.Error explanation ->
|
|
-@@ -499,6 +520,8 @@
|
|
+ sg
|
|
+ in
|
|
+@@ -649,6 +673,8 @@
|
|
check_recmod_typedecls env2 sdecls dcl2;
|
|
(dcl2, env2)
|
|
|
|
@@ -98,11 +56,51 @@
|
|
(* Try to convert a module expression to a module path. *)
|
|
|
|
exception Not_a_path
|
|
+Index: typing/typedtreeMap.ml
|
|
+===================================================================
|
|
+--- typing/typedtreeMap.ml (revision 13947)
|
|
++++ typing/typedtreeMap.ml (working copy)
|
|
+@@ -457,6 +457,9 @@
|
|
+ | Twith_typesubst decl -> Twith_typesubst (map_type_declaration decl)
|
|
+ | Twith_module (path, lid) -> cstr
|
|
+ | Twith_modsubst (path, lid) -> cstr
|
|
++ | Twith_modtype decl -> Twith_modtype (map_modtype_declaration decl)
|
|
++ | Twith_modtypesubst decl ->
|
|
++ Twith_modtypesubst (map_modtype_declaration decl)
|
|
+ in
|
|
+ Map.leave_with_constraint cstr
|
|
+
|
|
+Index: typing/typedtree.ml
|
|
+===================================================================
|
|
+--- typing/typedtree.ml (revision 13947)
|
|
++++ typing/typedtree.ml (working copy)
|
|
+@@ -255,6 +255,8 @@
|
|
+ | Twith_module of Path.t * Longident.t loc
|
|
+ | Twith_typesubst of type_declaration
|
|
+ | Twith_modsubst of Path.t * Longident.t loc
|
|
++ | Twith_modtype of modtype_declaration
|
|
++ | Twith_modtypesubst of modtype_declaration
|
|
+
|
|
+ and core_type =
|
|
+ (* mutable because of [Typeclass.declare_method] *)
|
|
+Index: typing/typedtree.mli
|
|
+===================================================================
|
|
+--- typing/typedtree.mli (revision 13947)
|
|
++++ typing/typedtree.mli (working copy)
|
|
+@@ -254,6 +254,8 @@
|
|
+ | Twith_module of Path.t * Longident.t loc
|
|
+ | Twith_typesubst of type_declaration
|
|
+ | Twith_modsubst of Path.t * Longident.t loc
|
|
++ | Twith_modtype of modtype_declaration
|
|
++ | Twith_modtypesubst of modtype_declaration
|
|
+
|
|
+ and core_type =
|
|
+ (* mutable because of [Typeclass.declare_method] *)
|
|
Index: typing/includemod.ml
|
|
===================================================================
|
|
---- typing/includemod.ml (revision 12005)
|
|
+--- typing/includemod.ml (revision 13947)
|
|
+++ typing/includemod.ml (working copy)
|
|
-@@ -326,10 +326,10 @@
|
|
+@@ -346,10 +346,10 @@
|
|
|
|
(* Hide the context and substitution parameters to the outside world *)
|
|
|
|
@@ -117,11 +115,24 @@
|
|
|
|
(* Error report *)
|
|
|
|
+Index: typing/typedtreeIter.ml
|
|
+===================================================================
|
|
+--- typing/typedtreeIter.ml (revision 13947)
|
|
++++ typing/typedtreeIter.ml (working copy)
|
|
+@@ -408,6 +408,8 @@
|
|
+ | Twith_module _ -> ()
|
|
+ | Twith_typesubst decl -> iter_type_declaration decl
|
|
+ | Twith_modsubst _ -> ()
|
|
++ | Twith_modtype decl -> iter_modtype_declaration decl
|
|
++ | Twith_modtypesubst decl -> iter_modtype_declaration decl
|
|
+ end;
|
|
+ Iter.leave_with_constraint cstr;
|
|
+
|
|
Index: typing/includemod.mli
|
|
===================================================================
|
|
---- typing/includemod.mli (revision 12005)
|
|
+--- typing/includemod.mli (revision 13947)
|
|
+++ typing/includemod.mli (working copy)
|
|
-@@ -23,6 +23,8 @@
|
|
+@@ -21,6 +21,8 @@
|
|
val compunit: string -> signature -> string -> signature -> module_coercion
|
|
val type_declarations:
|
|
Env.t -> Ident.t -> type_declaration -> type_declaration -> unit
|
|
@@ -130,53 +141,20 @@
|
|
|
|
type symptom =
|
|
Missing_field of Ident.t
|
|
-Index: testsuite/tests/typing-modules/Test.ml.reference
|
|
+Index: typing/printtyped.ml
|
|
===================================================================
|
|
---- testsuite/tests/typing-modules/Test.ml.reference (revision 12005)
|
|
-+++ testsuite/tests/typing-modules/Test.ml.reference (working copy)
|
|
-@@ -6,4 +6,12 @@
|
|
- # type -'a t
|
|
- class type c = object method m : [ `A ] t end
|
|
- # module M : sig val v : (#c as 'a) -> 'a end
|
|
-+# module type S = sig module type T module F : functor (X : T) -> T end
|
|
-+# module type T0 = sig type t end
|
|
-+# module type S1 = sig module type T = T0 module F : functor (X : T) -> T end
|
|
-+# module type S2 = sig module F : functor (X : T0) -> T0 end
|
|
-+# module type S3 =
|
|
-+ sig
|
|
-+ module F : functor (X : sig type t = int end) -> sig type t = int end
|
|
-+ end
|
|
- #
|
|
-Index: testsuite/tests/typing-modules/Test.ml.principal.reference
|
|
-===================================================================
|
|
---- testsuite/tests/typing-modules/Test.ml.principal.reference (revision 12005)
|
|
-+++ testsuite/tests/typing-modules/Test.ml.principal.reference (working copy)
|
|
-@@ -6,4 +6,12 @@
|
|
- # type -'a t
|
|
- class type c = object method m : [ `A ] t end
|
|
- # module M : sig val v : (#c as 'a) -> 'a end
|
|
-+# module type S = sig module type T module F : functor (X : T) -> T end
|
|
-+# module type T0 = sig type t end
|
|
-+# module type S1 = sig module type T = T0 module F : functor (X : T) -> T end
|
|
-+# module type S2 = sig module F : functor (X : T0) -> T0 end
|
|
-+# module type S3 =
|
|
-+ sig
|
|
-+ module F : functor (X : sig type t = int end) -> sig type t = int end
|
|
-+ end
|
|
- #
|
|
-Index: testsuite/tests/typing-modules/Test.ml
|
|
-===================================================================
|
|
---- testsuite/tests/typing-modules/Test.ml (revision 12005)
|
|
-+++ testsuite/tests/typing-modules/Test.ml (working copy)
|
|
-@@ -9,3 +9,11 @@
|
|
- class type c = object method m : [ `A ] t end;;
|
|
- module M : sig val v : (#c as 'a) -> 'a end =
|
|
- struct let v x = ignore (x :> c); x end;;
|
|
-+
|
|
-+(* with module type *)
|
|
-+
|
|
-+module type S = sig module type T module F(X:T) : T end;;
|
|
-+module type T0 = sig type t end;;
|
|
-+module type S1 = S with module type T = T0;;
|
|
-+module type S2 = S with module type T := T0;;
|
|
-+module type S3 = S with module type T := sig type t = int end;;
|
|
+--- typing/printtyped.ml (revision 13947)
|
|
++++ typing/printtyped.ml (working copy)
|
|
+@@ -608,6 +608,12 @@
|
|
+ type_declaration (i+1) ppf td;
|
|
+ | Twith_module (li,_) -> line i ppf "Pwith_module %a\n" fmt_path li;
|
|
+ | Twith_modsubst (li,_) -> line i ppf "Pwith_modsubst %a\n" fmt_path li;
|
|
++ | Twith_modtype (td) ->
|
|
++ line i ppf "Pwith_modtype\n";
|
|
++ modtype_declaration (i+1) ppf td;
|
|
++ | Twith_modtypesubst (td) ->
|
|
++ line i ppf "Pwith_modtypesubst\n";
|
|
++ modtype_declaration (i+1) ppf td;
|
|
+
|
|
+ and module_expr i ppf x =
|
|
+ line i ppf "module_expr %a\n" fmt_location x.mod_loc;
|
|
Index: parsing/pprintast.ml
|
|
===================================================================
|
|
--- parsing/pprintast.ml (revision 13947)
|
|
+++ parsing/pprintast.ml (working copy)
|
|
@@ -847,18 +847,28 @@
|
|
(self#list self#type_var_option ~sep:"," ~first:"(" ~last:")")
|
|
ls self#longident_loc li self#type_declaration td
|
|
| Pwith_module (li2) ->
|
|
- pp f "module %a =@ %a" self#longident_loc li self#longident_loc li2;
|
|
+ pp f "module %a =@ %a"
|
|
+ self#longident_loc li self#longident_loc li2
|
|
| Pwith_typesubst ({ptype_params=ls;_} as td) ->
|
|
pp f "type@ %a %a :=@ %a"
|
|
(self#list self#type_var_option ~sep:"," ~first:"(" ~last:")")
|
|
ls self#longident_loc li
|
|
self#type_declaration td
|
|
| Pwith_modsubst (li2) ->
|
|
- pp f "module %a :=@ %a" self#longident_loc li self#longident_loc li2 in
|
|
+ pp f "module %a :=@ %a"
|
|
+ self#longident_loc li self#longident_loc li2
|
|
+ | Pwith_modtype mty ->
|
|
+ pp f "module type %a =@ %a"
|
|
+ self#longident_loc li self#module_type mty
|
|
+ | Pwith_modtypesubst mty ->
|
|
+ pp f "module type %a :=@ %a"
|
|
+ self#longident_loc li self#module_type mty
|
|
+ in
|
|
(match l with
|
|
| [] -> pp f "@[<hov2>%a@]" self#module_type mt
|
|
| _ -> pp f "@[<hov2>(%a@ with@ %a)@]"
|
|
- self#module_type mt (self#list longident_x_with_constraint ~sep:"@ and@ ") l )
|
|
+ self#module_type mt
|
|
+ (self#list longident_x_with_constraint ~sep:"@ and@ ") l )
|
|
| Pmty_typeof me ->
|
|
pp f "@[<hov2>module@ type@ of@ %a@]"
|
|
self#module_expr me
|
|
Index: parsing/parser.mly
|
|
===================================================================
|
|
--- parsing/parser.mly (revision 13947)
|
|
+++ parsing/parser.mly (working copy)
|
|
@@ -1506,6 +1506,10 @@
|
|
{ (mkrhs $2 2, Pwith_module (mkrhs $4 4)) }
|
|
| MODULE UIDENT COLONEQUAL mod_ext_longident
|
|
{ (mkrhs (Lident $2) 2, Pwith_modsubst (mkrhs $4 4)) }
|
|
+ | MODULE TYPE mty_longident EQUAL module_type
|
|
+ { (mkrhs $3 3, Pwith_modtype $5) }
|
|
+ | MODULE TYPE ident COLONEQUAL module_type
|
|
+ { (mkrhs (Lident $3) 3, Pwith_modtypesubst $5) }
|
|
;
|
|
with_type_binder:
|
|
EQUAL { Public }
|
|
Index: parsing/ast_mapper.ml
|
|
===================================================================
|
|
--- parsing/ast_mapper.ml (revision 13947)
|
|
+++ parsing/ast_mapper.ml (working copy)
|
|
@@ -164,6 +164,8 @@
|
|
| Pwith_module s -> Pwith_module (map_loc sub s)
|
|
| Pwith_typesubst d -> Pwith_typesubst (sub # type_declaration d)
|
|
| Pwith_modsubst s -> Pwith_modsubst (map_loc sub s)
|
|
+ | Pwith_modtype m -> Pwith_modtype (sub # module_type m)
|
|
+ | Pwith_modtypesubst m -> Pwith_modtypesubst (sub # module_type m)
|
|
|
|
let mk_item ?(loc = Location.none) x = {psig_desc = x; psig_loc = loc}
|
|
|
|
Index: parsing/parsetree.mli
|
|
===================================================================
|
|
--- parsing/parsetree.mli (revision 13947)
|
|
+++ parsing/parsetree.mli (working copy)
|
|
@@ -256,6 +256,8 @@
|
|
| Pwith_module of Longident.t loc
|
|
| Pwith_typesubst of type_declaration
|
|
| Pwith_modsubst of Longident.t loc
|
|
+ | Pwith_modtype of module_type
|
|
+ | Pwith_modtypesubst of module_type
|
|
|
|
(* Value expressions for the module language *)
|
|
|
|
Index: parsing/printast.ml
|
|
===================================================================
|
|
--- parsing/printast.ml (revision 13947)
|
|
+++ parsing/printast.ml (working copy)
|
|
@@ -590,6 +590,12 @@
|
|
type_declaration (i+1) ppf td;
|
|
| Pwith_module li -> line i ppf "Pwith_module %a\n" fmt_longident_loc li;
|
|
| Pwith_modsubst li -> line i ppf "Pwith_modsubst %a\n" fmt_longident_loc li;
|
|
+ | Pwith_modtype (mty) ->
|
|
+ line i ppf "Pwith_modtype\n";
|
|
+ module_type (i+1) ppf mty;
|
|
+ | Pwith_modtypesubst (mty) ->
|
|
+ line i ppf "Pwith_modtype\n";
|
|
+ module_type (i+1) ppf mty;
|
|
|
|
and module_expr i ppf x =
|
|
line i ppf "module_expr %a\n" fmt_location x.pmod_loc;
|