Change Texp_record into an inline record
parent
c2e66f0097
commit
24f947e95d
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) ->
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) ->
|
||||
|
|
|
@ -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) ->
|
||||
|
|
Loading…
Reference in New Issue