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 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 f35b0e24..00fba019 100644 --- a/tests/ppx/react/expected/spreadProps.res.txt +++ b/tests/ppx/react/expected/spreadProps.res.txt @@ -21,6 +21,16 @@ let c4 = ReactDOM.createDOMElementVariadic( [ReactDOM.createDOMElementVariadic("br", []), ReactDOM.createDOMElementVariadic("br", [])], ) +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) + @@jsxConfig({version: 4, mode: "automatic"}) // Error: spreadProps should be first in order than other props // let c0 = @@ -44,3 +54,7 @@ let c5 = ReactDOM.jsxsKeyed( ~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) 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