Skip to content

Commit f3a4900

Browse files
committed
fix parse spread props in jsx
1 parent cdcca2b commit f3a4900

File tree

2 files changed

+49
-24
lines changed

2 files changed

+49
-24
lines changed

res_syntax/src/res_core.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2724,7 +2724,7 @@ and parseJsxProp p =
27242724
(Location.mkloc "res.namedArgLoc" loc, Parsetree.PStr [])
27252725
in
27262726
let attrExpr =
2727-
let e = parsePrimaryExpr ~operand:(parseAtomicExpr p) p in
2727+
let e = parsePrimaryExpr ~operand:(parseExpr p) p in
27282728
{e with pexp_attributes = propLocAttr :: e.pexp_attributes}
27292729
in
27302730
(* using label "spreadProps" to distinguish from others *)
Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,60 @@
1+
@@jsxConfig({version: 4, mode: "classic"})
2+
// Error: spreadProps should be first in order than other props
3+
// let c0 = <A x="x" {...p} />
14

2-
Syntax error!
3-
tests/ppx/react/spreadProps.res:24:23-24
5+
// Error: multiple spreadProps not allowed
6+
// let c0 = <A x="x" {...p0} {...p1} />
47

5-
22 │ // both need to be parsed
6-
23 │ let c6 = <A {...(params->Obj.magic)} />
7-
24 │ let c7 = <A {...params->Obj.magic} />
8-
25 │
9-
26 │ @@jsxConfig({version:4, mode: "automatic"})
8+
// only spread props
9+
let c1 = React.createElement(A.make, p)
1010

11-
I'm not sure what to parse here when looking at "->".
11+
// reversed order
12+
let c2 = React.createElement(A.make, {...p, x: "x"})
1213

14+
let c3 = ReactDOM.createDOMElementVariadic("div", ~props=p, [])
1315

14-
Syntax error!
15-
tests/ppx/react/spreadProps.res:24:25-27
16+
let c4 = ReactDOM.createDOMElementVariadic("div", ~props={...p, x: "x", key: "k"}, [])
1617

17-
22 │ // both need to be parsed
18-
23 │ let c6 = <A {...(params->Obj.magic)} />
19-
24 │ let c7 = <A {...params->Obj.magic} />
20-
25 │
21-
26 │ @@jsxConfig({version:4, mode: "automatic"})
18+
let c4 = ReactDOM.createDOMElementVariadic(
19+
"div",
20+
~props={...p, key: "k"},
21+
[ReactDOM.createDOMElementVariadic("br", []), ReactDOM.createDOMElementVariadic("br", [])],
22+
)
2223

23-
consecutive statements on a line must be separated by ';' or a newline
24+
let c5 = ReactDOM.createDOMElementVariadic(
25+
"div",
26+
~props={...p, key: "k"},
27+
[ReactDOM.createDOMElementVariadic("br", []), ReactDOM.createDOMElementVariadic("br", [])],
28+
)
2429

30+
// both need to be parsed
31+
let c6 = React.createElement(A.make, params->Obj.magic)
32+
let c7 = React.createElement(A.make, params->Obj.magic)
2533

26-
Syntax error!
27-
tests/ppx/react/spreadProps.res:47:23-24
34+
@@jsxConfig({version: 4, mode: "automatic"})
35+
// Error: spreadProps should be first in order than other props
36+
// let c0 = <A x="x" {...p} />
2837

29-
45 │ // both need to be parsed
30-
46 │ let c6 = <A {...(params->Obj.magic)} />
31-
47 │ let c7 = <A {...params->Obj.magic} />
32-
48 │
38+
// Error: multiple spreadProps not allowed
39+
// let c0 = <A x="x" {...p0} {...p1} />
3340

34-
I'm not sure what to parse here when looking at "->".
41+
// only spread props
42+
let c1 = React.jsx(A.make, p)
3543

44+
// reversed order
45+
let c2 = React.jsx(A.make, {...p, x: "x"})
46+
47+
let c3 = ReactDOM.jsx("div", p)
48+
49+
let c4 = ReactDOM.jsxKeyed("div", {...p, x: "x"}, ~key="k", ())
50+
51+
let c5 = ReactDOM.jsxsKeyed(
52+
"div",
53+
{...p, children: React.array([ReactDOM.jsx("br", {}), ReactDOM.jsx("br", {})])},
54+
~key="k",
55+
(),
56+
)
57+
58+
// both need to be parsed
59+
let c6 = React.jsx(A.make, params->Obj.magic)
60+
let c7 = React.jsx(A.make, params->Obj.magic)

0 commit comments

Comments
 (0)