diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index a94dc0633..2ef213577 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -864,8 +864,9 @@ and transl_exp0 e = Lprim(Pmakeblock(0, Immutable, None), [Lconst(Const_base(Const_int tag)); lam], e.exp_loc) end - | Texp_record (fields, repr, opt_init_expr) -> - transl_record e.exp_loc e.exp_env fields repr opt_init_expr + | Texp_record {fields; representation; extended_expression} -> + transl_record e.exp_loc e.exp_env fields representation + extended_expression | Texp_field(arg, _, lbl) -> let access = match lbl.lbl_repres with diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 4401ec825..410cc1c9f 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -323,10 +323,10 @@ and expression i ppf x = | Texp_variant (l, eo) -> line i ppf "Texp_variant \"%s\"\n" l; option i expression ppf eo; - | Texp_record (l, _, eo) -> + | Texp_record { fields; extended_expression; _ } -> line i ppf "Texp_record\n"; - array i record_field ppf l; - option i expression ppf eo; + array i record_field ppf fields; + option i expression ppf extended_expression; | Texp_field (e, li, _) -> line i ppf "Texp_field\n"; expression i ppf e; diff --git a/typing/tast_mapper.ml b/typing/tast_mapper.ml index ebd60779b..e77299cef 100644 --- a/typing/tast_mapper.ml +++ b/typing/tast_mapper.ml @@ -255,17 +255,17 @@ let expr sub x = Texp_construct (lid, cd, List.map (sub.expr sub) args) | Texp_variant (l, expo) -> Texp_variant (l, opt (sub.expr sub) expo) - | Texp_record (fields, repr, expo) -> + | Texp_record { fields; representation; extended_expression } -> let fields = Array.map (function | label, Kept t -> label, Kept t | label, Overridden (lid, exp) -> label, Overridden (lid, sub.expr sub exp)) fields in - Texp_record ( - fields, repr, - opt (sub.expr sub) expo - ) + Texp_record { + fields; representation; + extended_expression = opt (sub.expr sub) extended_expression; + } | Texp_field (exp, lid, ld) -> Texp_field (sub.expr sub exp, lid, ld) | Texp_setfield (exp1, lid, ld, exp2) -> diff --git a/typing/typecore.ml b/typing/typecore.ml index 7ee85e560..4cb5bf28d 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1573,7 +1573,7 @@ let rec is_nonexpansive exp = | Texp_construct( _, _, el) -> List.for_all is_nonexpansive el | Texp_variant(_, arg) -> is_nonexpansive_opt arg - | Texp_record (fields, _, opt_init_exp) -> + | Texp_record { fields; extended_expression } -> Array.for_all (fun (lbl, definition) -> match definition with @@ -1581,7 +1581,7 @@ let rec is_nonexpansive exp = lbl.lbl_mut = Immutable && is_nonexpansive exp | Kept _ -> true) fields - && is_nonexpansive_opt opt_init_exp + && is_nonexpansive_opt extended_expression | Texp_field(exp, _, _) -> is_nonexpansive exp | Texp_array [] -> true | Texp_ifthenelse(_cond, ifso, ifnot) -> @@ -2335,7 +2335,7 @@ and type_expect_ ?in_function ?(recarg=Rejected) env sexp ty_expected = | (_, lbl,_)::_ -> Array.length lbl.lbl_all in if opt_sexp <> None && List.length lid_sexp_list = num_fields then Location.prerr_warning loc Warnings.Useless_record_with; - let label_descriptions, record_representation = + let label_descriptions, representation = let (_, { lbl_all; lbl_repres }, _) = List.hd lbl_exp_list in lbl_all, lbl_repres in @@ -2344,8 +2344,10 @@ and type_expect_ ?in_function ?(recarg=Rejected) env sexp ty_expected = label_descriptions label_definitions in re { - exp_desc = Texp_record(fields, - record_representation, opt_exp); + exp_desc = Texp_record { + fields; representation; + extended_expression = opt_exp + }; exp_loc = loc; exp_extra = []; exp_type = instance env ty_expected; exp_attributes = sexp.pexp_attributes; diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 74ee33b9f..d06a13b9a 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -85,9 +85,11 @@ and expression_desc = | Texp_construct of Longident.t loc * constructor_description * expression list | Texp_variant of label * expression option - | Texp_record of - ( Types.label_description * record_label_definition ) array * - Types.record_representation * expression option + | Texp_record of { + fields : ( Types.label_description * record_label_definition ) array; + representation : Types.record_representation; + extended_expression : expression option; + } | Texp_field of expression * Longident.t loc * label_description | Texp_setfield of expression * Longident.t loc * label_description * expression diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 831d60ab9..871453f81 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -186,11 +186,13 @@ and expression_desc = C (E1, ..., En) [E1;...;En] *) | Texp_variant of label * expression option - | Texp_record of - ( Types.label_description * record_label_definition ) array * - Types.record_representation * expression option - (** { l1=P1; ...; ln=Pn } (None) - { E0 with l1=P1; ...; ln=Pn } (Some E0) + | Texp_record of { + fields : ( Types.label_description * record_label_definition ) array; + representation : Types.record_representation; + extended_expression : expression option; + } + (** { l1=P1; ...; ln=Pn } (extended_expression = None) + { E0 with l1=P1; ...; ln=Pn } (extended_expression = Some E0) Invariant: n > 0 diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index cc10d17c3..86b96531c 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -295,12 +295,12 @@ module MakeIterator(Iter : IteratorArgument) : sig None -> () | Some exp -> iter_expression exp end - | Texp_record (fields, _, expo) -> + | Texp_record { fields; extended_expression; _ } -> Array.iter (function | _, Kept _ -> () | _, Overridden (_, exp) -> iter_expression exp) fields; - begin match expo with + begin match extended_expression with None -> () | Some exp -> iter_expression exp end diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 7280fa1a5..0695b2fe7 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -306,7 +306,7 @@ module MakeMap(Map : MapArgument) = struct | Some exp -> Some (map_expression exp) in Texp_variant (label, expo) - | Texp_record (fields, repr, expo) -> + | Texp_record { fields; representation; extended_expression } -> let fields = Array.map (function | label, Kept t -> label, Kept t @@ -314,11 +314,11 @@ module MakeMap(Map : MapArgument) = struct label, Overridden (lid, map_expression exp)) fields in - let expo = match expo with - None -> expo + let extended_expression = match extended_expression with + None -> extended_expression | Some exp -> Some (map_expression exp) in - Texp_record (fields, repr, expo) + Texp_record { fields; representation; extended_expression } | Texp_field (exp, lid, label) -> Texp_field (map_expression exp, lid, label) | Texp_setfield (exp1, lid, label, exp2) -> diff --git a/typing/untypeast.ml b/typing/untypeast.ml index 2c5eb2eee..3b62145d2 100644 --- a/typing/untypeast.ml +++ b/typing/untypeast.ml @@ -410,13 +410,13 @@ let expression sub exp = )) | Texp_variant (label, expo) -> Pexp_variant (label, map_opt (sub.expr sub) expo) - | Texp_record (fields, _repr, expo) -> + | Texp_record { fields; extended_expression; _ } -> let list = Array.fold_left (fun l -> function | _, Kept _ -> l | _, Overridden (lid, exp) -> (lid, sub.expr sub exp) :: l) [] fields in - Pexp_record (list, map_opt (sub.expr sub) expo) + Pexp_record (list, map_opt (sub.expr sub) extended_expression) | Texp_field (exp, lid, _label) -> Pexp_field (sub.expr sub exp, map_loc sub lid) | Texp_setfield (exp1, lid, _label, exp2) ->