Change Texp_record into an inline record
parent
c2e66f0097
commit
24f947e95d
|
@ -864,8 +864,9 @@ and transl_exp0 e =
|
||||||
Lprim(Pmakeblock(0, Immutable, None),
|
Lprim(Pmakeblock(0, Immutable, None),
|
||||||
[Lconst(Const_base(Const_int tag)); lam], e.exp_loc)
|
[Lconst(Const_base(Const_int tag)); lam], e.exp_loc)
|
||||||
end
|
end
|
||||||
| Texp_record (fields, repr, opt_init_expr) ->
|
| Texp_record {fields; representation; extended_expression} ->
|
||||||
transl_record e.exp_loc e.exp_env fields repr opt_init_expr
|
transl_record e.exp_loc e.exp_env fields representation
|
||||||
|
extended_expression
|
||||||
| Texp_field(arg, _, lbl) ->
|
| Texp_field(arg, _, lbl) ->
|
||||||
let access =
|
let access =
|
||||||
match lbl.lbl_repres with
|
match lbl.lbl_repres with
|
||||||
|
|
|
@ -323,10 +323,10 @@ and expression i ppf x =
|
||||||
| Texp_variant (l, eo) ->
|
| Texp_variant (l, eo) ->
|
||||||
line i ppf "Texp_variant \"%s\"\n" l;
|
line i ppf "Texp_variant \"%s\"\n" l;
|
||||||
option i expression ppf eo;
|
option i expression ppf eo;
|
||||||
| Texp_record (l, _, eo) ->
|
| Texp_record { fields; extended_expression; _ } ->
|
||||||
line i ppf "Texp_record\n";
|
line i ppf "Texp_record\n";
|
||||||
array i record_field ppf l;
|
array i record_field ppf fields;
|
||||||
option i expression ppf eo;
|
option i expression ppf extended_expression;
|
||||||
| Texp_field (e, li, _) ->
|
| Texp_field (e, li, _) ->
|
||||||
line i ppf "Texp_field\n";
|
line i ppf "Texp_field\n";
|
||||||
expression i ppf e;
|
expression i ppf e;
|
||||||
|
|
|
@ -255,17 +255,17 @@ let expr sub x =
|
||||||
Texp_construct (lid, cd, List.map (sub.expr sub) args)
|
Texp_construct (lid, cd, List.map (sub.expr sub) args)
|
||||||
| Texp_variant (l, expo) ->
|
| Texp_variant (l, expo) ->
|
||||||
Texp_variant (l, opt (sub.expr sub) 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
|
let fields = Array.map (function
|
||||||
| label, Kept t -> label, Kept t
|
| label, Kept t -> label, Kept t
|
||||||
| label, Overridden (lid, exp) ->
|
| label, Overridden (lid, exp) ->
|
||||||
label, Overridden (lid, sub.expr sub exp))
|
label, Overridden (lid, sub.expr sub exp))
|
||||||
fields
|
fields
|
||||||
in
|
in
|
||||||
Texp_record (
|
Texp_record {
|
||||||
fields, repr,
|
fields; representation;
|
||||||
opt (sub.expr sub) expo
|
extended_expression = opt (sub.expr sub) extended_expression;
|
||||||
)
|
}
|
||||||
| Texp_field (exp, lid, ld) ->
|
| Texp_field (exp, lid, ld) ->
|
||||||
Texp_field (sub.expr sub exp, lid, ld)
|
Texp_field (sub.expr sub exp, lid, ld)
|
||||||
| Texp_setfield (exp1, lid, ld, exp2) ->
|
| Texp_setfield (exp1, lid, ld, exp2) ->
|
||||||
|
|
|
@ -1573,7 +1573,7 @@ let rec is_nonexpansive exp =
|
||||||
| Texp_construct( _, _, el) ->
|
| Texp_construct( _, _, el) ->
|
||||||
List.for_all is_nonexpansive el
|
List.for_all is_nonexpansive el
|
||||||
| Texp_variant(_, arg) -> is_nonexpansive_opt arg
|
| Texp_variant(_, arg) -> is_nonexpansive_opt arg
|
||||||
| Texp_record (fields, _, opt_init_exp) ->
|
| Texp_record { fields; extended_expression } ->
|
||||||
Array.for_all
|
Array.for_all
|
||||||
(fun (lbl, definition) ->
|
(fun (lbl, definition) ->
|
||||||
match definition with
|
match definition with
|
||||||
|
@ -1581,7 +1581,7 @@ let rec is_nonexpansive exp =
|
||||||
lbl.lbl_mut = Immutable && is_nonexpansive exp
|
lbl.lbl_mut = Immutable && is_nonexpansive exp
|
||||||
| Kept _ -> true)
|
| Kept _ -> true)
|
||||||
fields
|
fields
|
||||||
&& is_nonexpansive_opt opt_init_exp
|
&& is_nonexpansive_opt extended_expression
|
||||||
| Texp_field(exp, _, _) -> is_nonexpansive exp
|
| Texp_field(exp, _, _) -> is_nonexpansive exp
|
||||||
| Texp_array [] -> true
|
| Texp_array [] -> true
|
||||||
| Texp_ifthenelse(_cond, ifso, ifnot) ->
|
| 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
|
| (_, lbl,_)::_ -> Array.length lbl.lbl_all in
|
||||||
if opt_sexp <> None && List.length lid_sexp_list = num_fields then
|
if opt_sexp <> None && List.length lid_sexp_list = num_fields then
|
||||||
Location.prerr_warning loc Warnings.Useless_record_with;
|
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
|
let (_, { lbl_all; lbl_repres }, _) = List.hd lbl_exp_list in
|
||||||
lbl_all, lbl_repres
|
lbl_all, lbl_repres
|
||||||
in
|
in
|
||||||
|
@ -2344,8 +2344,10 @@ and type_expect_ ?in_function ?(recarg=Rejected) env sexp ty_expected =
|
||||||
label_descriptions label_definitions
|
label_descriptions label_definitions
|
||||||
in
|
in
|
||||||
re {
|
re {
|
||||||
exp_desc = Texp_record(fields,
|
exp_desc = Texp_record {
|
||||||
record_representation, opt_exp);
|
fields; representation;
|
||||||
|
extended_expression = opt_exp
|
||||||
|
};
|
||||||
exp_loc = loc; exp_extra = [];
|
exp_loc = loc; exp_extra = [];
|
||||||
exp_type = instance env ty_expected;
|
exp_type = instance env ty_expected;
|
||||||
exp_attributes = sexp.pexp_attributes;
|
exp_attributes = sexp.pexp_attributes;
|
||||||
|
|
|
@ -85,9 +85,11 @@ and expression_desc =
|
||||||
| Texp_construct of
|
| Texp_construct of
|
||||||
Longident.t loc * constructor_description * expression list
|
Longident.t loc * constructor_description * expression list
|
||||||
| Texp_variant of label * expression option
|
| Texp_variant of label * expression option
|
||||||
| Texp_record of
|
| Texp_record of {
|
||||||
( Types.label_description * record_label_definition ) array *
|
fields : ( Types.label_description * record_label_definition ) array;
|
||||||
Types.record_representation * expression option
|
representation : Types.record_representation;
|
||||||
|
extended_expression : expression option;
|
||||||
|
}
|
||||||
| Texp_field of expression * Longident.t loc * label_description
|
| Texp_field of expression * Longident.t loc * label_description
|
||||||
| Texp_setfield of
|
| Texp_setfield of
|
||||||
expression * Longident.t loc * label_description * expression
|
expression * Longident.t loc * label_description * expression
|
||||||
|
|
|
@ -186,11 +186,13 @@ and expression_desc =
|
||||||
C (E1, ..., En) [E1;...;En]
|
C (E1, ..., En) [E1;...;En]
|
||||||
*)
|
*)
|
||||||
| Texp_variant of label * expression option
|
| Texp_variant of label * expression option
|
||||||
| Texp_record of
|
| Texp_record of {
|
||||||
( Types.label_description * record_label_definition ) array *
|
fields : ( Types.label_description * record_label_definition ) array;
|
||||||
Types.record_representation * expression option
|
representation : Types.record_representation;
|
||||||
(** { l1=P1; ...; ln=Pn } (None)
|
extended_expression : expression option;
|
||||||
{ E0 with l1=P1; ...; ln=Pn } (Some E0)
|
}
|
||||||
|
(** { l1=P1; ...; ln=Pn } (extended_expression = None)
|
||||||
|
{ E0 with l1=P1; ...; ln=Pn } (extended_expression = Some E0)
|
||||||
|
|
||||||
Invariant: n > 0
|
Invariant: n > 0
|
||||||
|
|
||||||
|
|
|
@ -295,12 +295,12 @@ module MakeIterator(Iter : IteratorArgument) : sig
|
||||||
None -> ()
|
None -> ()
|
||||||
| Some exp -> iter_expression exp
|
| Some exp -> iter_expression exp
|
||||||
end
|
end
|
||||||
| Texp_record (fields, _, expo) ->
|
| Texp_record { fields; extended_expression; _ } ->
|
||||||
Array.iter (function
|
Array.iter (function
|
||||||
| _, Kept _ -> ()
|
| _, Kept _ -> ()
|
||||||
| _, Overridden (_, exp) -> iter_expression exp)
|
| _, Overridden (_, exp) -> iter_expression exp)
|
||||||
fields;
|
fields;
|
||||||
begin match expo with
|
begin match extended_expression with
|
||||||
None -> ()
|
None -> ()
|
||||||
| Some exp -> iter_expression exp
|
| Some exp -> iter_expression exp
|
||||||
end
|
end
|
||||||
|
|
|
@ -306,7 +306,7 @@ module MakeMap(Map : MapArgument) = struct
|
||||||
| Some exp -> Some (map_expression exp)
|
| Some exp -> Some (map_expression exp)
|
||||||
in
|
in
|
||||||
Texp_variant (label, expo)
|
Texp_variant (label, expo)
|
||||||
| Texp_record (fields, repr, expo) ->
|
| Texp_record { fields; representation; extended_expression } ->
|
||||||
let fields =
|
let fields =
|
||||||
Array.map (function
|
Array.map (function
|
||||||
| label, Kept t -> label, Kept t
|
| label, Kept t -> label, Kept t
|
||||||
|
@ -314,11 +314,11 @@ module MakeMap(Map : MapArgument) = struct
|
||||||
label, Overridden (lid, map_expression exp))
|
label, Overridden (lid, map_expression exp))
|
||||||
fields
|
fields
|
||||||
in
|
in
|
||||||
let expo = match expo with
|
let extended_expression = match extended_expression with
|
||||||
None -> expo
|
None -> extended_expression
|
||||||
| Some exp -> Some (map_expression exp)
|
| Some exp -> Some (map_expression exp)
|
||||||
in
|
in
|
||||||
Texp_record (fields, repr, expo)
|
Texp_record { fields; representation; extended_expression }
|
||||||
| Texp_field (exp, lid, label) ->
|
| Texp_field (exp, lid, label) ->
|
||||||
Texp_field (map_expression exp, lid, label)
|
Texp_field (map_expression exp, lid, label)
|
||||||
| Texp_setfield (exp1, lid, label, exp2) ->
|
| Texp_setfield (exp1, lid, label, exp2) ->
|
||||||
|
|
|
@ -410,13 +410,13 @@ let expression sub exp =
|
||||||
))
|
))
|
||||||
| Texp_variant (label, expo) ->
|
| Texp_variant (label, expo) ->
|
||||||
Pexp_variant (label, map_opt (sub.expr sub) 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
|
let list = Array.fold_left (fun l -> function
|
||||||
| _, Kept _ -> l
|
| _, Kept _ -> l
|
||||||
| _, Overridden (lid, exp) -> (lid, sub.expr sub exp) :: l)
|
| _, Overridden (lid, exp) -> (lid, sub.expr sub exp) :: l)
|
||||||
[] fields
|
[] fields
|
||||||
in
|
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) ->
|
| Texp_field (exp, lid, _label) ->
|
||||||
Pexp_field (sub.expr sub exp, map_loc sub lid)
|
Pexp_field (sub.expr sub exp, map_loc sub lid)
|
||||||
| Texp_setfield (exp1, lid, _label, exp2) ->
|
| Texp_setfield (exp1, lid, _label, exp2) ->
|
||||||
|
|
Loading…
Reference in New Issue