Skip to content

Commit f6969e9

Browse files
committed
Latest syntax: better treatment of spread props.
1 parent a9688b0 commit f6969e9

File tree

4 files changed

+52
-31
lines changed

4 files changed

+52
-31
lines changed

lib/4.06.1/unstable/js_compiler.ml

+17-10
Original file line numberDiff line numberDiff line change
@@ -272980,6 +272980,7 @@ let makeModuleName fileName nestedModules fnName =
272980272980

272981272981
(* make record from props and spread props if exists *)
272982272982
let recordFromProps ~loc ~removeKey callArguments =
272983+
let spreadPropsLabel = "_spreadProps" in
272983272984
let rec removeLastPositionUnitAux props acc =
272984272985
match props with
272985272986
| [] -> acc
@@ -272988,7 +272989,16 @@ let recordFromProps ~loc ~removeKey callArguments =
272988272989
| (Nolabel, {pexp_loc}) :: _rest ->
272989272990
React_jsx_common.raiseError ~loc:pexp_loc
272990272991
"JSX: found non-labelled argument before the last position"
272991-
| prop :: rest -> removeLastPositionUnitAux rest (prop :: acc)
272992+
| ((Labelled txt, {pexp_loc}) as prop) :: rest
272993+
| ((Optional txt, {pexp_loc}) as prop) :: rest ->
272994+
if txt = spreadPropsLabel then
272995+
match acc with
272996+
| [] -> removeLastPositionUnitAux rest (prop :: acc)
272997+
| _ ->
272998+
React_jsx_common.raiseError ~loc:pexp_loc
272999+
"JSX: use {...p} {x: v} not {x: v} {...p} \n\
273000+
\ multiple spreads {...p} {...p} not allowed."
273001+
else removeLastPositionUnitAux rest (prop :: acc)
272992273002
in
272993273003
let props, propsToSpread =
272994273004
removeLastPositionUnitAux callArguments []
@@ -273013,20 +273023,17 @@ let recordFromProps ~loc ~removeKey callArguments =
273013273023
let spreadFields =
273014273024
propsToSpread |> List.map (fun (_, expression) -> expression)
273015273025
in
273016-
match spreadFields with
273017-
| [] ->
273026+
match (fields, spreadFields) with
273027+
| [], [spreadProps] | [], spreadProps :: _ -> spreadProps
273028+
| _, [] ->
273018273029
{
273019273030
pexp_desc = Pexp_record (fields, None);
273020273031
pexp_loc = loc;
273021273032
pexp_attributes = [];
273022273033
}
273023-
| [spreadProps] ->
273024-
{
273025-
pexp_desc = Pexp_record (fields, Some spreadProps);
273026-
pexp_loc = loc;
273027-
pexp_attributes = [];
273028-
}
273029-
| spreadProps :: _ ->
273034+
| _, [spreadProps]
273035+
(* take the first spreadProps only *)
273036+
| _, spreadProps :: _ ->
273030273037
{
273031273038
pexp_desc = Pexp_record (fields, Some spreadProps);
273032273039
pexp_loc = loc;

lib/4.06.1/unstable/js_playground_compiler.ml

+17-10
Original file line numberDiff line numberDiff line change
@@ -274443,6 +274443,7 @@ let makeModuleName fileName nestedModules fnName =
274443274443

274444274444
(* make record from props and spread props if exists *)
274445274445
let recordFromProps ~loc ~removeKey callArguments =
274446+
let spreadPropsLabel = "_spreadProps" in
274446274447
let rec removeLastPositionUnitAux props acc =
274447274448
match props with
274448274449
| [] -> acc
@@ -274451,7 +274452,16 @@ let recordFromProps ~loc ~removeKey callArguments =
274451274452
| (Nolabel, {pexp_loc}) :: _rest ->
274452274453
React_jsx_common.raiseError ~loc:pexp_loc
274453274454
"JSX: found non-labelled argument before the last position"
274454-
| prop :: rest -> removeLastPositionUnitAux rest (prop :: acc)
274455+
| ((Labelled txt, {pexp_loc}) as prop) :: rest
274456+
| ((Optional txt, {pexp_loc}) as prop) :: rest ->
274457+
if txt = spreadPropsLabel then
274458+
match acc with
274459+
| [] -> removeLastPositionUnitAux rest (prop :: acc)
274460+
| _ ->
274461+
React_jsx_common.raiseError ~loc:pexp_loc
274462+
"JSX: use {...p} {x: v} not {x: v} {...p} \n\
274463+
\ multiple spreads {...p} {...p} not allowed."
274464+
else removeLastPositionUnitAux rest (prop :: acc)
274455274465
in
274456274466
let props, propsToSpread =
274457274467
removeLastPositionUnitAux callArguments []
@@ -274476,20 +274486,17 @@ let recordFromProps ~loc ~removeKey callArguments =
274476274486
let spreadFields =
274477274487
propsToSpread |> List.map (fun (_, expression) -> expression)
274478274488
in
274479-
match spreadFields with
274480-
| [] ->
274489+
match (fields, spreadFields) with
274490+
| [], [spreadProps] | [], spreadProps :: _ -> spreadProps
274491+
| _, [] ->
274481274492
{
274482274493
pexp_desc = Pexp_record (fields, None);
274483274494
pexp_loc = loc;
274484274495
pexp_attributes = [];
274485274496
}
274486-
| [spreadProps] ->
274487-
{
274488-
pexp_desc = Pexp_record (fields, Some spreadProps);
274489-
pexp_loc = loc;
274490-
pexp_attributes = [];
274491-
}
274492-
| spreadProps :: _ ->
274497+
| _, [spreadProps]
274498+
(* take the first spreadProps only *)
274499+
| _, spreadProps :: _ ->
274493274500
{
274494274501
pexp_desc = Pexp_record (fields, Some spreadProps);
274495274502
pexp_loc = loc;

lib/4.06.1/whole_compiler.ml

+17-10
Original file line numberDiff line numberDiff line change
@@ -284822,6 +284822,7 @@ let makeModuleName fileName nestedModules fnName =
284822284822

284823284823
(* make record from props and spread props if exists *)
284824284824
let recordFromProps ~loc ~removeKey callArguments =
284825+
let spreadPropsLabel = "_spreadProps" in
284825284826
let rec removeLastPositionUnitAux props acc =
284826284827
match props with
284827284828
| [] -> acc
@@ -284830,7 +284831,16 @@ let recordFromProps ~loc ~removeKey callArguments =
284830284831
| (Nolabel, {pexp_loc}) :: _rest ->
284831284832
React_jsx_common.raiseError ~loc:pexp_loc
284832284833
"JSX: found non-labelled argument before the last position"
284833-
| prop :: rest -> removeLastPositionUnitAux rest (prop :: acc)
284834+
| ((Labelled txt, {pexp_loc}) as prop) :: rest
284835+
| ((Optional txt, {pexp_loc}) as prop) :: rest ->
284836+
if txt = spreadPropsLabel then
284837+
match acc with
284838+
| [] -> removeLastPositionUnitAux rest (prop :: acc)
284839+
| _ ->
284840+
React_jsx_common.raiseError ~loc:pexp_loc
284841+
"JSX: use {...p} {x: v} not {x: v} {...p} \n\
284842+
\ multiple spreads {...p} {...p} not allowed."
284843+
else removeLastPositionUnitAux rest (prop :: acc)
284834284844
in
284835284845
let props, propsToSpread =
284836284846
removeLastPositionUnitAux callArguments []
@@ -284855,20 +284865,17 @@ let recordFromProps ~loc ~removeKey callArguments =
284855284865
let spreadFields =
284856284866
propsToSpread |> List.map (fun (_, expression) -> expression)
284857284867
in
284858-
match spreadFields with
284859-
| [] ->
284868+
match (fields, spreadFields) with
284869+
| [], [spreadProps] | [], spreadProps :: _ -> spreadProps
284870+
| _, [] ->
284860284871
{
284861284872
pexp_desc = Pexp_record (fields, None);
284862284873
pexp_loc = loc;
284863284874
pexp_attributes = [];
284864284875
}
284865-
| [spreadProps] ->
284866-
{
284867-
pexp_desc = Pexp_record (fields, Some spreadProps);
284868-
pexp_loc = loc;
284869-
pexp_attributes = [];
284870-
}
284871-
| spreadProps :: _ ->
284876+
| _, [spreadProps]
284877+
(* take the first spreadProps only *)
284878+
| _, spreadProps :: _ ->
284872284879
{
284873284880
pexp_desc = Pexp_record (fields, Some spreadProps);
284874284881
pexp_loc = loc;

0 commit comments

Comments
 (0)