From a89d0e43fb380e9e4aabc8c2316b0f38ad559d94 Mon Sep 17 00:00:00 2001 From: Woonki Moon Date: Wed, 26 Oct 2022 23:38:12 +0900 Subject: [PATCH 1/3] add test --- tests/ppx/react/expected/fragment.res.txt | 19 +++++++++++++++++++ tests/ppx/react/fragment.res | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 tests/ppx/react/expected/fragment.res.txt create mode 100644 tests/ppx/react/fragment.res diff --git a/tests/ppx/react/expected/fragment.res.txt b/tests/ppx/react/expected/fragment.res.txt new file mode 100644 index 00000000..341814c6 --- /dev/null +++ b/tests/ppx/react/expected/fragment.res.txt @@ -0,0 +1,19 @@ +@@jsxConfig({version: 4, mode: "classic"}) + +let _ = ReactDOM.createElement(React.fragment, []) +let _ = ReactDOM.createElement(React.fragment, [ReactDOM.createDOMElementVariadic("div", [])]) +let _ = ReactDOM.createElement(React.fragment, [ReactDOM.createElement(React.fragment, [])]) +let _ = React.createElement(Z.make, {}) +let _ = React.createElement(Z.make, {children: ReactDOM.createDOMElementVariadic("div", [])}) +let _ = ReactDOM.createDOMElementVariadic("div", []) +let _ = ReactDOM.createDOMElementVariadic("div", [ReactDOM.createDOMElementVariadic("div", [])]) + +@@jsxConfig({version: 4, mode: "automatic"}) + +let _ = React.jsx(React.jsxFragment, {children: {}}) +let _ = React.jsx(React.jsxFragment, {children: ReactDOM.jsx("div", {})}) +let _ = React.jsx(React.jsxFragment, {children: React.jsx(React.jsxFragment, {children: {}})}) +let _ = React.jsx(Z.make, {}) +let _ = React.jsx(Z.make, {children: ReactDOM.jsx("div", {})}) +let _ = ReactDOM.jsx("div", {}) +let _ = ReactDOM.jsx("div", {children: ?ReactDOM.someElement(ReactDOM.jsx("div", {}))}) diff --git a/tests/ppx/react/fragment.res b/tests/ppx/react/fragment.res new file mode 100644 index 00000000..02af9e71 --- /dev/null +++ b/tests/ppx/react/fragment.res @@ -0,0 +1,19 @@ +@@jsxConfig({version:4, mode: "classic"}) + +let _ = <> +let _ = <>
+let _ = <><> +let _ = +let _ =
+let _ =
+let _ =
+ +@@jsxConfig({version:4, mode: "automatic"}) + +let _ = <> +let _ = <>
+let _ = <><> +let _ = +let _ =
+let _ =
+let _ =
\ No newline at end of file From 0973195443e62224a4b04d3f8cb067e08deff400 Mon Sep 17 00:00:00 2001 From: Woonki Moon Date: Wed, 26 Oct 2022 23:53:16 +0900 Subject: [PATCH 2/3] fix fragment optional children --- cli/reactjs_jsx_v4.ml | 24 +++++++++++------------ tests/ppx/react/expected/fragment.res.txt | 4 ++-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/cli/reactjs_jsx_v4.ml b/cli/reactjs_jsx_v4.ml index 5c78d835..3d1a4f30 100644 --- a/cli/reactjs_jsx_v4.ml +++ b/cli/reactjs_jsx_v4.ml @@ -1368,24 +1368,22 @@ let expr ~config mapper expression = Exp.ident ~loc {loc; txt = Ldot (Lident "React", "fragment")} in let childrenExpr = transformChildrenIfList ~mapper listItems in + let recordOfChildren children = + Exp.record [(Location.mknoloc (Lident "children"), children)] None + in let args = [ (nolabel, fragment); (match config.mode with - | "automatic" -> + | "automatic" -> ( ( nolabel, - Exp.record - [ - ( Location.mknoloc @@ Lident "children", - match childrenExpr with - | {pexp_desc = Pexp_array children} -> ( - match children with - | [] -> emptyRecord ~loc:Location.none - | [child] -> child - | _ -> childrenExpr) - | _ -> childrenExpr ); - ] - None ) + match childrenExpr with + | {pexp_desc = Pexp_array children} -> ( + match children with + | [] -> emptyRecord ~loc:Location.none + | [child] -> recordOfChildren child + | _ -> recordOfChildren childrenExpr) + | _ -> recordOfChildren childrenExpr )) | "classic" | _ -> (nolabel, childrenExpr)); ] in diff --git a/tests/ppx/react/expected/fragment.res.txt b/tests/ppx/react/expected/fragment.res.txt index 341814c6..0306a8ae 100644 --- a/tests/ppx/react/expected/fragment.res.txt +++ b/tests/ppx/react/expected/fragment.res.txt @@ -10,9 +10,9 @@ let _ = ReactDOM.createDOMElementVariadic("div", [ReactDOM.createDOMElementVaria @@jsxConfig({version: 4, mode: "automatic"}) -let _ = React.jsx(React.jsxFragment, {children: {}}) +let _ = React.jsx(React.jsxFragment, {}) let _ = React.jsx(React.jsxFragment, {children: ReactDOM.jsx("div", {})}) -let _ = React.jsx(React.jsxFragment, {children: React.jsx(React.jsxFragment, {children: {}})}) +let _ = React.jsx(React.jsxFragment, {children: React.jsx(React.jsxFragment, {})}) let _ = React.jsx(Z.make, {}) let _ = React.jsx(Z.make, {children: ReactDOM.jsx("div", {})}) let _ = ReactDOM.jsx("div", {}) From df8118f60423f17de471e5f6b163fb2346ced6fb Mon Sep 17 00:00:00 2001 From: Woonki Moon Date: Thu, 27 Oct 2022 00:06:14 +0900 Subject: [PATCH 3/3] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91317ddf..1b6984cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ - Fix issue where certain JSX expressions would be formatted differenctly in compiler 10.1.0-rc.1 https://github.com/rescript-lang/syntax/issues/675 - Fix issue where printing nested pipe discards await https://github.com/rescript-lang/syntax/issues/687 - Fix issue where the JSX key type is not an optional string https://github.com/rescript-lang/syntax/pull/693 +- Fix issue where the JSX fragment withouth children build error https://github.com/rescript-lang/syntax/pull/704 #### :eyeglasses: Spec Compliance