diff --git a/CHANGELOG.md b/CHANGELOG.md index d59aee1f22..e095ff088d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ These are only breaking changes for unformatted code. - Prevent inlining of async functions in additional cases https://github.com/rescript-lang/rescript-compiler/issues/5860 - Fix build error where aliasing arguments to `_` in the make function with JSX V4. https://github.com/rescript-lang/rescript-compiler/pull/5881 +- Fix parsing of spread props as an expression in JSX V4 https://github.com/rescript-lang/rescript-compiler/pull/5885 # 10.1.0 diff --git a/res_syntax/src/res_core.ml b/res_syntax/src/res_core.ml index 3c4c0842dc..7826cc8267 100644 --- a/res_syntax/src/res_core.ml +++ b/res_syntax/src/res_core.ml @@ -2724,7 +2724,7 @@ and parseJsxProp p = (Location.mkloc "res.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/res_syntax/tests/ppx/react/expected/spreadProps.res.txt b/res_syntax/tests/ppx/react/expected/spreadProps.res.txt index f35b0e24d3..00fba0199b 100644 --- a/res_syntax/tests/ppx/react/expected/spreadProps.res.txt +++ b/res_syntax/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/res_syntax/tests/ppx/react/spreadProps.res b/res_syntax/tests/ppx/react/spreadProps.res index ba05ca0499..c83a1f8703 100644 --- a/res_syntax/tests/ppx/react/spreadProps.res +++ b/res_syntax/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} />