From 6c6b542936ab096dab312a76a1ed057187fdbcc5 Mon Sep 17 00:00:00 2001 From: Woonki Moon Date: Thu, 8 Dec 2022 02:20:46 +0900 Subject: [PATCH 1/3] add test --- tests/ppx/react/expected/spreadProps.res.txt | 56 ++++++++------------ tests/ppx/react/spreadProps.res | 12 ++++- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/tests/ppx/react/expected/spreadProps.res.txt b/tests/ppx/react/expected/spreadProps.res.txt index f35b0e24..970f9db6 100644 --- a/tests/ppx/react/expected/spreadProps.res.txt +++ b/tests/ppx/react/expected/spreadProps.res.txt @@ -1,46 +1,34 @@ -@@jsxConfig({version: 4, mode: "classic"}) -// Error: spreadProps should be first in order than other props -// let c0 = -// Error: multiple spreadProps not allowed -// let c0 = + Syntax error! + tests/ppx/react/spreadProps.res:24:23-24 -// only spread props -let c1 = React.createElement(A.make, p) + 22 │ // both need to be parsed + 23 │ let c6 = Obj.magic)} /> + 24 │ let c7 = Obj.magic} /> + 25 │ + 26 │ @@jsxConfig({version:4, mode: "automatic"}) -// reversed order -let c2 = React.createElement(A.make, {...p, x: "x"}) + I'm not sure what to parse here when looking at "->". -let c3 = ReactDOM.createDOMElementVariadic("div", ~props=p, []) -let c4 = ReactDOM.createDOMElementVariadic("div", ~props={...p, x: "x", key: "k"}, []) + Syntax error! + tests/ppx/react/spreadProps.res:24:25-27 -let c4 = ReactDOM.createDOMElementVariadic( - "div", - ~props={...p, key: "k"}, - [ReactDOM.createDOMElementVariadic("br", []), ReactDOM.createDOMElementVariadic("br", [])], -) + 22 │ // both need to be parsed + 23 │ let c6 = Obj.magic)} /> + 24 │ let c7 = Obj.magic} /> + 25 │ + 26 │ @@jsxConfig({version:4, mode: "automatic"}) -@@jsxConfig({version: 4, mode: "automatic"}) -// Error: spreadProps should be first in order than other props -// let c0 = + consecutive statements on a line must be separated by ';' or a newline -// Error: multiple spreadProps not allowed -// let c0 = -// only spread props -let c1 = React.jsx(A.make, p) + Syntax error! + tests/ppx/react/spreadProps.res:47:23-24 -// reversed order -let c2 = React.jsx(A.make, {...p, x: "x"}) + 45 │ // both need to be parsed + 46 │ let c6 = Obj.magic)} /> + 47 │ let c7 = Obj.magic} /> -let c3 = ReactDOM.jsx("div", p) + I'm not sure what to parse here when looking at "->". -let c4 = ReactDOM.jsxKeyed("div", {...p, x: "x"}, ~key="k", ()) - -let c5 = ReactDOM.jsxsKeyed( - "div", - {...p, children: React.array([ReactDOM.jsx("br", {}), ReactDOM.jsx("br", {})])}, - ~key="k", - (), -) diff --git a/tests/ppx/react/spreadProps.res b/tests/ppx/react/spreadProps.res index ba05ca04..591a7038 100644 --- a/tests/ppx/react/spreadProps.res +++ b/tests/ppx/react/spreadProps.res @@ -17,6 +17,12 @@ let c4 =
let c4 =


+let c5 =


+ +// both need to be parsed +let c6 =
Obj.magic)} /> +let c7 = Obj.magic} /> + @@jsxConfig({version:4, mode: "automatic"}) // Error: spreadProps should be first in order than other props // let c0 = @@ -34,4 +40,8 @@ let c3 =
let c4 =
-let c5 =


\ No newline at end of file +let c5 =


+ +// both need to be parsed +let c6 =
Obj.magic)} /> +let c7 = Obj.magic} /> \ No newline at end of file From 1e15064852f1e40bdc1efe1062958ce6a0dd8839 Mon Sep 17 00:00:00 2001 From: Woonki Moon Date: Thu, 8 Dec 2022 02:24:56 +0900 Subject: [PATCH 2/3] fix parse spread props in jsx --- src/res_core.ml | 2 +- tests/ppx/react/expected/spreadProps.res.txt | 70 ++++++++++++++------ 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/res_core.ml b/src/res_core.ml index e4048594..64f7aecb 100644 --- a/src/res_core.ml +++ b/src/res_core.ml @@ -2630,7 +2630,7 @@ and parseJsxProp p = (Location.mkloc "ns.namedArgLoc" loc, Parsetree.PStr []) in let attrExpr = - let e = parsePrimaryExpr ~operand:(parseAtomicExpr p) p in + let e = parsePrimaryExpr ~operand:(parseExpr p) p in {e with pexp_attributes = propLocAttr :: e.pexp_attributes} in (* using label "spreadProps" to distinguish from others *) diff --git a/tests/ppx/react/expected/spreadProps.res.txt b/tests/ppx/react/expected/spreadProps.res.txt index 970f9db6..00fba019 100644 --- a/tests/ppx/react/expected/spreadProps.res.txt +++ b/tests/ppx/react/expected/spreadProps.res.txt @@ -1,34 +1,60 @@ +@@jsxConfig({version: 4, mode: "classic"}) +// Error: spreadProps should be first in order than other props +// let c0 = - Syntax error! - tests/ppx/react/spreadProps.res:24:23-24 +// Error: multiple spreadProps not allowed +// let c0 = - 22 │ // both need to be parsed - 23 │ let c6 = Obj.magic)} /> - 24 │ let c7 = Obj.magic} /> - 25 │ - 26 │ @@jsxConfig({version:4, mode: "automatic"}) +// only spread props +let c1 = React.createElement(A.make, p) - I'm not sure what to parse here when looking at "->". +// reversed order +let c2 = React.createElement(A.make, {...p, x: "x"}) +let c3 = ReactDOM.createDOMElementVariadic("div", ~props=p, []) - Syntax error! - tests/ppx/react/spreadProps.res:24:25-27 +let c4 = ReactDOM.createDOMElementVariadic("div", ~props={...p, x: "x", key: "k"}, []) - 22 │ // both need to be parsed - 23 │ let c6 = Obj.magic)} /> - 24 │ let c7 = Obj.magic} /> - 25 │ - 26 │ @@jsxConfig({version:4, mode: "automatic"}) +let c4 = ReactDOM.createDOMElementVariadic( + "div", + ~props={...p, key: "k"}, + [ReactDOM.createDOMElementVariadic("br", []), ReactDOM.createDOMElementVariadic("br", [])], +) - consecutive statements on a line must be separated by ';' or a newline +let c5 = ReactDOM.createDOMElementVariadic( + "div", + ~props={...p, key: "k"}, + [ReactDOM.createDOMElementVariadic("br", []), ReactDOM.createDOMElementVariadic("br", [])], +) +// both need to be parsed +let c6 = React.createElement(A.make, params->Obj.magic) +let c7 = React.createElement(A.make, params->Obj.magic) - Syntax error! - tests/ppx/react/spreadProps.res:47:23-24 +@@jsxConfig({version: 4, mode: "automatic"}) +// Error: spreadProps should be first in order than other props +// let c0 = - 45 │ // both need to be parsed - 46 │ let c6 = Obj.magic)} /> - 47 │ let c7 = Obj.magic} /> +// Error: multiple spreadProps not allowed +// let c0 = - I'm not sure what to parse here when looking at "->". +// only spread props +let c1 = React.jsx(A.make, p) +// reversed order +let c2 = React.jsx(A.make, {...p, x: "x"}) + +let c3 = ReactDOM.jsx("div", p) + +let c4 = ReactDOM.jsxKeyed("div", {...p, x: "x"}, ~key="k", ()) + +let c5 = ReactDOM.jsxsKeyed( + "div", + {...p, children: React.array([ReactDOM.jsx("br", {}), ReactDOM.jsx("br", {})])}, + ~key="k", + (), +) + +// both need to be parsed +let c6 = React.jsx(A.make, params->Obj.magic) +let c7 = React.jsx(A.make, params->Obj.magic) From 647590caad5deeee0f7e3a29abc2669b9c317881 Mon Sep 17 00:00:00 2001 From: Woonki Moon Date: Thu, 8 Dec 2022 02:32:37 +0900 Subject: [PATCH 3/3] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d5e5820..66abd7eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ - Fix issue where async as an id cannot be used with application and labelled arguments https://github.com/rescript-lang/syntax/issues/707 - Treat await as almost-unary operator weaker than pipe so `await foo->bar` means `await (foo->bar)` https://github.com/rescript-lang/syntax/pull/711 - Fix build error where aliasing arguments to `_` in the make function with JSX V4. https://github.com/rescript-lang/syntax/pull/720 +- Fix parsing of spread props as an expression in JSX V4 https://github.com/rescript-lang/syntax/pull/721 #### :eyeglasses: Spec Compliance