From eb623b74903a61a5424cd1fe49a7cd3d6bd9020b Mon Sep 17 00:00:00 2001 From: Cristiano Calcagno Date: Fri, 3 Mar 2023 22:18:33 +0100 Subject: [PATCH] Fix issue with JSX V4 when components are nested Fixes https://github.com/rescript-lang/rescript-compiler/issues/5975 The issue is due to a combination of: 1) when a component let make = body is transformed, first the body is transformed, then when transformStructureItem4 is called, the body is transformed again 2) @react.component is left after the PPX transformation Because of this, in the case of nested components, the transformed inner components is transformed again by transformStructureItem4, but it should not as it's been desugared already. It would be enough to change either one, to avoid the error with nested components, but this PR handles both aspects. --- CHANGELOG.md | 1 + res_syntax/src/reactjs_jsx_ppx.ml | 4 ++-- res_syntax/src/reactjs_jsx_v3.ml | 14 ++++++------- res_syntax/src/reactjs_jsx_v4.ml | 21 +++++++++---------- .../ppx/react/expected/aliasProps.res.txt | 3 --- .../ppx/react/expected/commentAtTop.res.txt | 1 - .../react/expected/defaultValueProp.res.txt | 2 -- .../react/expected/fileLevelConfig.res.txt | 2 -- .../react/expected/firstClassModules.res.txt | 1 - .../ppx/react/expected/forwardRef.res.txt | 8 ------- .../ppx/react/expected/interface.res.txt | 4 ++-- .../react/expected/interfaceWithRef.res.txt | 1 - .../ppx/react/expected/mangleKeyword.res.txt | 2 -- .../tests/ppx/react/expected/nested.res.txt | 21 +++++++++++++++++++ .../tests/ppx/react/expected/newtype.res.txt | 5 ----- .../ppx/react/expected/noPropsWithKey.res.txt | 6 ++---- .../expected/optimizeAutomaticMode.res.txt | 1 - .../ppx/react/expected/removedKeyProp.res.txt | 4 +--- .../ppx/react/expected/sharedProps.res.txt | 14 ++++++------- .../tests/ppx/react/expected/topLevel.res.txt | 2 -- .../ppx/react/expected/typeConstraint.res.txt | 3 +-- .../ppx/react/expected/uncurriedProps.res.txt | 4 +--- .../tests/ppx/react/expected/v4.res.txt | 6 +++--- res_syntax/tests/ppx/react/nested.res | 11 ++++++++++ 24 files changed, 67 insertions(+), 74 deletions(-) create mode 100644 res_syntax/tests/ppx/react/expected/nested.res.txt create mode 100644 res_syntax/tests/ppx/react/nested.res diff --git a/CHANGELOG.md b/CHANGELOG.md index 65b7c4ad47..64f7903f52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,7 @@ These are only breaking changes for unformatted code. - Support `@gentype.import` as an alias to `@genType.import` in the compiler https://github.com/rescript-lang/rescript-compiler/pull/6020 - Fix issue with integer overflow check https://github.com/rescript-lang/rescript-compiler/pull/6028 - Fix issue with JSX V4 and newtype https://github.com/rescript-lang/rescript-compiler/pull/6029 +- Fix issue with JSX V4 when components are nested https://github.com/rescript-lang/rescript-compiler/pull/6031 #### :nail_care: Polish diff --git a/res_syntax/src/reactjs_jsx_ppx.ml b/res_syntax/src/reactjs_jsx_ppx.ml index 5c2a9597b1..6329dfa0d2 100644 --- a/res_syntax/src/reactjs_jsx_ppx.ml +++ b/res_syntax/src/reactjs_jsx_ppx.ml @@ -127,8 +127,8 @@ let getMapper ~config = | Pstr_attribute attr -> processConfigAttribute attr config | _ -> ()); let item = default_mapper.structure_item mapper item in - if config.version = 3 then transformStructureItem3 mapper item - else if config.version = 4 then transformStructureItem4 mapper item + if config.version = 3 then transformStructureItem3 item + else if config.version = 4 then transformStructureItem4 item else [item]) items |> List.flatten diff --git a/res_syntax/src/reactjs_jsx_v3.ml b/res_syntax/src/reactjs_jsx_v3.ml index c55970d1b8..a349e7e4c4 100644 --- a/res_syntax/src/reactjs_jsx_v3.ml +++ b/res_syntax/src/reactjs_jsx_v3.ml @@ -446,8 +446,7 @@ let jsxMapper ~config = args in - let rec recursivelyTransformNamedArgsForMake mapper expr args newtypes = - let expr = mapper.expr mapper expr in + let rec recursivelyTransformNamedArgsForMake expr args newtypes = match expr.pexp_desc with (* TODO: make this show up with a loc. *) | Pexp_fun (Labelled "key", _, _, _) | Pexp_fun (Optional "key", _, _, _) -> @@ -494,7 +493,7 @@ let jsxMapper ~config = | _ -> None in - recursivelyTransformNamedArgsForMake mapper expression + recursivelyTransformNamedArgsForMake expression ((arg, default, pattern, alias, pattern.ppat_loc, type_) :: args) newtypes | Pexp_fun @@ -517,10 +516,9 @@ let jsxMapper ~config = "React: react.component refs only support plain arguments and type \ annotations." | Pexp_newtype (label, expression) -> - recursivelyTransformNamedArgsForMake mapper expression args - (label :: newtypes) + recursivelyTransformNamedArgsForMake expression args (label :: newtypes) | Pexp_constraint (expression, _typ) -> - recursivelyTransformNamedArgsForMake mapper expression args newtypes + recursivelyTransformNamedArgsForMake expression args newtypes | _ -> (args, newtypes, None) in @@ -586,7 +584,7 @@ let jsxMapper ~config = in let nestedModules = ref [] in - let transformStructureItem mapper item = + let transformStructureItem item = match item with (* external *) | { @@ -825,7 +823,7 @@ let jsxMapper ~config = let props = getPropsAttr payload in (* do stuff here! *) let namedArgList, newtypes, forwardRef = - recursivelyTransformNamedArgsForMake mapper + recursivelyTransformNamedArgsForMake (modifiedBindingOld binding) [] [] in diff --git a/res_syntax/src/reactjs_jsx_v4.ml b/res_syntax/src/reactjs_jsx_v4.ml index df25329fac..389b7e521e 100644 --- a/res_syntax/src/reactjs_jsx_v4.ml +++ b/res_syntax/src/reactjs_jsx_v4.ml @@ -598,9 +598,7 @@ let transformLowercaseCall3 ~config mapper jsxExprLoc callExprLoc attrs }) args -let rec recursivelyTransformNamedArgsForMake mapper expr args newtypes coreType - = - let expr = mapper.expr mapper expr in +let rec recursivelyTransformNamedArgsForMake expr args newtypes coreType = match expr.pexp_desc with (* TODO: make this show up with a loc. *) | Pexp_fun (Labelled "key", _, _, _) | Pexp_fun (Optional "key", _, _, _) -> @@ -647,7 +645,7 @@ let rec recursivelyTransformNamedArgsForMake mapper expr args newtypes coreType | _ -> None in - recursivelyTransformNamedArgsForMake mapper expression + recursivelyTransformNamedArgsForMake expression ((arg, default, pattern, alias, pattern.ppat_loc, type_) :: args) newtypes coreType | Pexp_fun @@ -680,10 +678,10 @@ let rec recursivelyTransformNamedArgsForMake mapper expr args newtypes coreType "React: react.component refs only support plain arguments and type \ annotations." | Pexp_newtype (label, expression) -> - recursivelyTransformNamedArgsForMake mapper expression args - (label :: newtypes) coreType + recursivelyTransformNamedArgsForMake expression args (label :: newtypes) + coreType | Pexp_constraint (expression, coreType) -> - recursivelyTransformNamedArgsForMake mapper expression args newtypes + recursivelyTransformNamedArgsForMake expression args newtypes (Some coreType) | _ -> (args, newtypes, coreType) @@ -724,7 +722,7 @@ let check_string_int_attribute_iter = {Ast_iterator.default_iterator with attribute} -let transformStructureItem ~config mapper item = +let transformStructureItem ~config item = match item with (* external *) | { @@ -848,6 +846,8 @@ let transformStructureItem ~config mapper item = binding with pvb_pat = {binding.pvb_pat with ppat_loc = emptyLoc}; pvb_loc = emptyLoc; + pvb_attributes = + binding.pvb_attributes |> List.filter otherAttrsPure; } in let fnName = getFnName binding.pvb_pat in @@ -891,8 +891,7 @@ let transformStructureItem ~config mapper item = let modifiedBinding binding = let hasApplication = ref false in let wrapExpressionWithBinding expressionFn expression = - Vb.mk ~loc:bindingLoc - ~attrs:(List.filter otherAttrsPure binding.pvb_attributes) + Vb.mk ~loc:bindingLoc ~attrs:binding.pvb_attributes (Pat.var ~loc:bindingPatLoc {loc = bindingPatLoc; txt = fnName}) (expressionFn expression) in @@ -1000,7 +999,7 @@ let transformStructureItem ~config mapper item = in (* do stuff here! *) let namedArgList, newtypes, _typeConstraints = - recursivelyTransformNamedArgsForMake mapper + recursivelyTransformNamedArgsForMake (modifiedBindingOld binding) [] [] None in diff --git a/res_syntax/tests/ppx/react/expected/aliasProps.res.txt b/res_syntax/tests/ppx/react/expected/aliasProps.res.txt index 3857f28f2e..0e310eab42 100644 --- a/res_syntax/tests/ppx/react/expected/aliasProps.res.txt +++ b/res_syntax/tests/ppx/react/expected/aliasProps.res.txt @@ -3,7 +3,6 @@ module C0 = { type props<'priority, 'text> = {priority: 'priority, text?: 'text} - @react.component let make = (props: props<_, _>) => { let _ = props.priority let text = switch props.text { @@ -23,7 +22,6 @@ module C0 = { module C1 = { type props<'priority, 'text> = {priority: 'priority, text?: 'text} - @react.component let make = (props: props<_, _>) => { let p = props.priority let text = switch props.text { @@ -43,7 +41,6 @@ module C1 = { module C2 = { type props<'foo> = {foo?: 'foo} - @react.component let make = (props: props<_>) => { let bar = switch props.foo { | Some(foo) => foo diff --git a/res_syntax/tests/ppx/react/expected/commentAtTop.res.txt b/res_syntax/tests/ppx/react/expected/commentAtTop.res.txt index af2649b0d2..d620f691c5 100644 --- a/res_syntax/tests/ppx/react/expected/commentAtTop.res.txt +++ b/res_syntax/tests/ppx/react/expected/commentAtTop.res.txt @@ -1,6 +1,5 @@ type props<'msg> = {msg: 'msg} // test React JSX file -@react.component let make = ({msg, _}: props<_>) => { ReactDOM.jsx("div", {children: ?ReactDOM.someElement({msg->React.string})}) } diff --git a/res_syntax/tests/ppx/react/expected/defaultValueProp.res.txt b/res_syntax/tests/ppx/react/expected/defaultValueProp.res.txt index a72ee93bc3..705b8e7ad6 100644 --- a/res_syntax/tests/ppx/react/expected/defaultValueProp.res.txt +++ b/res_syntax/tests/ppx/react/expected/defaultValueProp.res.txt @@ -1,6 +1,5 @@ module C0 = { type props<'a, 'b> = {a?: 'a, b?: 'b} - @react.component let make = (props: props<_, _>) => { let a = switch props.a { | Some(a) => a @@ -22,7 +21,6 @@ module C0 = { module C1 = { type props<'a, 'b> = {a?: 'a, b: 'b} - @react.component let make = (props: props<_, _>) => { let a = switch props.a { | Some(a) => a diff --git a/res_syntax/tests/ppx/react/expected/fileLevelConfig.res.txt b/res_syntax/tests/ppx/react/expected/fileLevelConfig.res.txt index 4927786e42..817461d18b 100644 --- a/res_syntax/tests/ppx/react/expected/fileLevelConfig.res.txt +++ b/res_syntax/tests/ppx/react/expected/fileLevelConfig.res.txt @@ -20,7 +20,6 @@ module V3 = { module V4C = { type props<'msg> = {msg: 'msg} - @react.component let make = ({msg, _}: props<_>) => { ReactDOM.createDOMElementVariadic("div", [{msg->React.string}]) } @@ -36,7 +35,6 @@ module V4C = { module V4A = { type props<'msg> = {msg: 'msg} - @react.component let make = ({msg, _}: props<_>) => { ReactDOM.jsx("div", {children: ?ReactDOM.someElement({msg->React.string})}) } diff --git a/res_syntax/tests/ppx/react/expected/firstClassModules.res.txt b/res_syntax/tests/ppx/react/expected/firstClassModules.res.txt index 689760fc05..2ce2da2676 100644 --- a/res_syntax/tests/ppx/react/expected/firstClassModules.res.txt +++ b/res_syntax/tests/ppx/react/expected/firstClassModules.res.txt @@ -64,7 +64,6 @@ module Select = { items: 'items, } - @react.component let make = ( type a key, {model, selected, onChange, items, _}: props< diff --git a/res_syntax/tests/ppx/react/expected/forwardRef.res.txt b/res_syntax/tests/ppx/react/expected/forwardRef.res.txt index ec36fa3534..09555aba53 100644 --- a/res_syntax/tests/ppx/react/expected/forwardRef.res.txt +++ b/res_syntax/tests/ppx/react/expected/forwardRef.res.txt @@ -75,7 +75,6 @@ module V4C = { ref?: 'ref, } - @react.component let make = ( {?className, children, _}: props<_, _, ReactRef.currentDomRef>, ref: Js.Nullable.t, @@ -103,7 +102,6 @@ module V4C = { } type props = {} - @react.component let make = (_: props) => { let input = React.useRef(Js.Nullable.null) @@ -132,7 +130,6 @@ module V4CUncurried = { ref?: 'ref, } - @react.component let make = ( {?className, children, _}: props<_, _, ReactRef.currentDomRef>, ref: Js.Nullable.t, @@ -160,7 +157,6 @@ module V4CUncurried = { } type props = {} - @react.component let make = (_: props) => { let input = React.useRef(Js.Nullable.null) @@ -191,7 +187,6 @@ module V4A = { ref?: 'ref, } - @react.component let make = ({?className, children, _}: props<_, _, ReactDOM.Ref.currentDomRef>, ref) => ReactDOM.jsxs( "div", @@ -217,7 +212,6 @@ module V4A = { } type props = {} - @react.component let make = (_: props) => { let input = React.useRef(Js.Nullable.null) @@ -245,7 +239,6 @@ module V4AUncurried = { ref?: 'ref, } - @react.component let make = ({?className, children, _}: props<_, _, ReactDOM.Ref.currentDomRef>, ref) => ReactDOM.jsxs( "div", @@ -271,7 +264,6 @@ module V4AUncurried = { } type props = {} - @react.component let make = (_: props) => { let input = React.useRef(Js.Nullable.null) diff --git a/res_syntax/tests/ppx/react/expected/interface.res.txt b/res_syntax/tests/ppx/react/expected/interface.res.txt index 77c607248a..166ed2ed90 100644 --- a/res_syntax/tests/ppx/react/expected/interface.res.txt +++ b/res_syntax/tests/ppx/react/expected/interface.res.txt @@ -1,6 +1,6 @@ module A = { type props<'x> = {x: 'x} - @react.component let make = ({x, _}: props<_>) => React.string(x) + let make = ({x, _}: props<_>) => React.string(x) let make = { let \"Interface$A" = (props: props<_>) => make(props) \"Interface$A" @@ -10,7 +10,7 @@ module A = { module NoProps = { type props = {} - @react.component let make = (_: props) => ReactDOM.jsx("div", {}) + let make = (_: props) => ReactDOM.jsx("div", {}) let make = { let \"Interface$NoProps" = props => make(props) diff --git a/res_syntax/tests/ppx/react/expected/interfaceWithRef.res.txt b/res_syntax/tests/ppx/react/expected/interfaceWithRef.res.txt index 7249ceb5bb..dbb6acfd5e 100644 --- a/res_syntax/tests/ppx/react/expected/interfaceWithRef.res.txt +++ b/res_syntax/tests/ppx/react/expected/interfaceWithRef.res.txt @@ -1,5 +1,4 @@ type props<'x, 'ref> = {x: 'x, ref?: 'ref} -@react.component let make = ( {x, _}: props, ref: Js.Nullable.t, diff --git a/res_syntax/tests/ppx/react/expected/mangleKeyword.res.txt b/res_syntax/tests/ppx/react/expected/mangleKeyword.res.txt index f5642f49ca..5b6ad70b29 100644 --- a/res_syntax/tests/ppx/react/expected/mangleKeyword.res.txt +++ b/res_syntax/tests/ppx/react/expected/mangleKeyword.res.txt @@ -22,7 +22,6 @@ let c31 = React.createElement(C31.make, C31.makeProps(~_open="x", ())) module C4C0 = { type props<'T_open, 'T_type> = {@as("open") _open: 'T_open, @as("type") _type: 'T_type} - @react.component let make = ({@as("open") _open, @as("type") _type, _}: props<_, string>) => React.string(_open) let make = { let \"MangleKeyword$C4C0" = (props: props<_>) => make(props) @@ -44,7 +43,6 @@ let c4c1 = React.createElement(C4C1.make, {_open: "x", _type: "t"}) module C4A0 = { type props<'T_open, 'T_type> = {@as("open") _open: 'T_open, @as("type") _type: 'T_type} - @react.component let make = ({@as("open") _open, @as("type") _type, _}: props<_, string>) => React.string(_open) let make = { let \"MangleKeyword$C4A0" = (props: props<_>) => make(props) diff --git a/res_syntax/tests/ppx/react/expected/nested.res.txt b/res_syntax/tests/ppx/react/expected/nested.res.txt new file mode 100644 index 0000000000..f290915b30 --- /dev/null +++ b/res_syntax/tests/ppx/react/expected/nested.res.txt @@ -0,0 +1,21 @@ +module Outer = { + type props = {} + let make = (_: props) => { + module Inner = { + type props = {} + + let make = (_: props) => ReactDOM.jsx("div", {}) + let make = { + let \"Nested$Outer" = props => make(props) + + \"Nested$Outer" + } + } + + React.jsx(Inner.make, {}) + } + let make = { + let \"Nested$Outer" = props => make(props) + \"Nested$Outer" + } +} diff --git a/res_syntax/tests/ppx/react/expected/newtype.res.txt b/res_syntax/tests/ppx/react/expected/newtype.res.txt index 178ce71d92..b8900c508b 100644 --- a/res_syntax/tests/ppx/react/expected/newtype.res.txt +++ b/res_syntax/tests/ppx/react/expected/newtype.res.txt @@ -26,7 +26,6 @@ module V3 = { module V4C = { type props<'a, 'b, 'c> = {a: 'a, b: 'b, c: 'c} - @react.component let make = (type a, {a, b, c, _}: props>, 'a>) => ReactDOM.createDOMElementVariadic("div", []) let make = { @@ -41,7 +40,6 @@ module V4C = { module V4A = { type props<'a, 'b, 'c> = {a: 'a, b: 'b, c: 'c} - @react.component let make = (type a, {a, b, c, _}: props>, 'a>) => ReactDOM.jsx("div", {}) let make = { @@ -54,7 +52,6 @@ module V4A = { module V4A1 = { type props<'a, 'b, 'c> = {a: 'a, b: 'b, c: 'c} - @react.component let make = (type x y, {a, b, c, _}: props, 'a>) => ReactDOM.jsx("div", {}) let make = { let \"Newtype$V4A1" = (props: props<_>) => make(props) @@ -70,7 +67,6 @@ module type T = { module V4A2 = { type props<'foo> = {foo: 'foo} - @react.component let make = (type a, {foo, _}: props) => { module T = unpack(foo) ReactDOM.jsx("div", {}) @@ -85,7 +81,6 @@ module V4A2 = { module V4A3 = { type props<'foo> = {foo: 'foo} - @react.component let make = (type a, {foo, _}: props<_>) => { module T = unpack(foo: T with type t = a) foo diff --git a/res_syntax/tests/ppx/react/expected/noPropsWithKey.res.txt b/res_syntax/tests/ppx/react/expected/noPropsWithKey.res.txt index 3b0e499b89..9a1ab4b625 100644 --- a/res_syntax/tests/ppx/react/expected/noPropsWithKey.res.txt +++ b/res_syntax/tests/ppx/react/expected/noPropsWithKey.res.txt @@ -3,7 +3,7 @@ module V4CA = { type props = {} - @react.component let make = (_: props) => ReactDOM.createDOMElementVariadic("div", []) + let make = (_: props) => ReactDOM.createDOMElementVariadic("div", []) let make = { let \"NoPropsWithKey$V4CA" = props => make(props) @@ -21,7 +21,6 @@ module V4CB = { module V4C = { type props = {} - @react.component let make = (_: props) => ReactDOM.createElement( React.fragment, @@ -42,7 +41,7 @@ module V4C = { module V4CA = { type props = {} - @react.component let make = (_: props) => ReactDOM.jsx("div", {}) + let make = (_: props) => ReactDOM.jsx("div", {}) let make = { let \"NoPropsWithKey$V4CA" = props => make(props) @@ -60,7 +59,6 @@ module V4CB = { module V4C = { type props = {} - @react.component let make = (_: props) => React.jsxs( React.jsxFragment, diff --git a/res_syntax/tests/ppx/react/expected/optimizeAutomaticMode.res.txt b/res_syntax/tests/ppx/react/expected/optimizeAutomaticMode.res.txt index 5234e02ac4..18a5a3198b 100644 --- a/res_syntax/tests/ppx/react/expected/optimizeAutomaticMode.res.txt +++ b/res_syntax/tests/ppx/react/expected/optimizeAutomaticMode.res.txt @@ -6,7 +6,6 @@ module User = { let format = user => "Dr." ++ user.lastName type props<'doctor> = {doctor: 'doctor} - @react.component let make = ({doctor, _}: props<_>) => { ReactDOM.jsx("h1", {id: "h1", children: ?ReactDOM.someElement({React.string(format(doctor))})}) } diff --git a/res_syntax/tests/ppx/react/expected/removedKeyProp.res.txt b/res_syntax/tests/ppx/react/expected/removedKeyProp.res.txt index 83d11e9b3e..5bc7af10ba 100644 --- a/res_syntax/tests/ppx/react/expected/removedKeyProp.res.txt +++ b/res_syntax/tests/ppx/react/expected/removedKeyProp.res.txt @@ -3,7 +3,7 @@ module Foo = { type props<'x, 'y> = {x: 'x, y: 'y} - @react.component let make = ({x, y, _}: props<_, _>) => React.string(x ++ y) + let make = ({x, y, _}: props<_, _>) => React.string(x ++ y) let make = { let \"RemovedKeyProp$Foo" = (props: props<_>) => make(props) @@ -14,7 +14,6 @@ module Foo = { module HasChildren = { type props<'children> = {children: 'children} - @react.component let make = ({children, _}: props<_>) => ReactDOM.createElement(React.fragment, [children]) let make = { let \"RemovedKeyProp$HasChildren" = (props: props<_>) => make(props) @@ -24,7 +23,6 @@ module HasChildren = { } type props = {} -@react.component let make = (_: props) => ReactDOM.createElement( React.fragment, diff --git a/res_syntax/tests/ppx/react/expected/sharedProps.res.txt b/res_syntax/tests/ppx/react/expected/sharedProps.res.txt index c6e4bc247d..c200b5ba3a 100644 --- a/res_syntax/tests/ppx/react/expected/sharedProps.res.txt +++ b/res_syntax/tests/ppx/react/expected/sharedProps.res.txt @@ -3,7 +3,7 @@ module V4C1 = { type props = sharedProps - @react.component(: sharedProps) let make = ({x, y, _}: props) => React.string(x ++ y) + let make = ({x, y, _}: props) => React.string(x ++ y) let make = { let \"SharedProps$V4C1" = props => make(props) @@ -14,7 +14,7 @@ module V4C1 = { module V4C2 = { type props<'a> = sharedProps<'a> - @react.component(: sharedProps<'a>) let make = ({x, y, _}: props<_>) => React.string(x ++ y) + let make = ({x, y, _}: props<_>) => React.string(x ++ y) let make = { let \"SharedProps$V4C2" = (props: props<_>) => make(props) @@ -25,7 +25,6 @@ module V4C2 = { module V4C3 = { type props<'a> = sharedProps - @react.component(: sharedProps) let make = ({x, y, _}: props<_>) => React.string(x ++ y) let make = { let \"SharedProps$V4C3" = (props: props<_>) => make(props) @@ -37,7 +36,7 @@ module V4C3 = { module V4C4 = { type props = sharedProps - @react.component(: sharedProps) let make = ({x, y, _}: props) => React.string(x ++ y) + let make = ({x, y, _}: props) => React.string(x ++ y) let make = { let \"SharedProps$V4C4" = props => make(props) @@ -74,7 +73,7 @@ module V4C8 = { module V4A1 = { type props = sharedProps - @react.component(: sharedProps) let make = ({x, y, _}: props) => React.string(x ++ y) + let make = ({x, y, _}: props) => React.string(x ++ y) let make = { let \"SharedProps$V4A1" = props => make(props) @@ -85,7 +84,7 @@ module V4A1 = { module V4A2 = { type props<'a> = sharedProps<'a> - @react.component(: sharedProps<'a>) let make = ({x, y, _}: props<_>) => React.string(x ++ y) + let make = ({x, y, _}: props<_>) => React.string(x ++ y) let make = { let \"SharedProps$V4A2" = (props: props<_>) => make(props) @@ -96,7 +95,6 @@ module V4A2 = { module V4A3 = { type props<'a> = sharedProps - @react.component(: sharedProps) let make = ({x, y, _}: props<_>) => React.string(x ++ y) let make = { let \"SharedProps$V4A3" = (props: props<_>) => make(props) @@ -108,7 +106,7 @@ module V4A3 = { module V4A4 = { type props = sharedProps - @react.component(: sharedProps) let make = ({x, y, _}: props) => React.string(x ++ y) + let make = ({x, y, _}: props) => React.string(x ++ y) let make = { let \"SharedProps$V4A4" = props => make(props) diff --git a/res_syntax/tests/ppx/react/expected/topLevel.res.txt b/res_syntax/tests/ppx/react/expected/topLevel.res.txt index 5268d7e824..36e60aed27 100644 --- a/res_syntax/tests/ppx/react/expected/topLevel.res.txt +++ b/res_syntax/tests/ppx/react/expected/topLevel.res.txt @@ -24,7 +24,6 @@ module V3 = { module V4C = { type props<'a, 'b> = {a: 'a, b: 'b} - @react.component let make = ({a, b, _}: props<_, _>) => { Js.log("This function should be named 'TopLevel.react'") ReactDOM.createDOMElementVariadic("div", []) @@ -41,7 +40,6 @@ module V4C = { module V4A = { type props<'a, 'b> = {a: 'a, b: 'b} - @react.component let make = ({a, b, _}: props<_, _>) => { Js.log("This function should be named 'TopLevel.react'") ReactDOM.jsx("div", {}) diff --git a/res_syntax/tests/ppx/react/expected/typeConstraint.res.txt b/res_syntax/tests/ppx/react/expected/typeConstraint.res.txt index 1ce2faafe6..9cb9635324 100644 --- a/res_syntax/tests/ppx/react/expected/typeConstraint.res.txt +++ b/res_syntax/tests/ppx/react/expected/typeConstraint.res.txt @@ -19,7 +19,6 @@ module V3 = { module V4C = { type props<'a, 'b> = {a: 'a, b: 'b} - @react.component let make = (type a, {a, b, _}: props<_, _>) => ReactDOM.createDOMElementVariadic("div", []) let make = { let \"TypeConstraint$V4C" = (props: props<_>) => make(props) @@ -33,7 +32,7 @@ module V4C = { module V4A = { type props<'a, 'b> = {a: 'a, b: 'b} - @react.component let make = (type a, {a, b, _}: props<_, _>) => ReactDOM.jsx("div", {}) + let make = (type a, {a, b, _}: props<_, _>) => ReactDOM.jsx("div", {}) let make = { let \"TypeConstraint$V4A" = (props: props<_>) => make(props) diff --git a/res_syntax/tests/ppx/react/expected/uncurriedProps.res.txt b/res_syntax/tests/ppx/react/expected/uncurriedProps.res.txt index 2d00031d71..e09209752e 100644 --- a/res_syntax/tests/ppx/react/expected/uncurriedProps.res.txt +++ b/res_syntax/tests/ppx/react/expected/uncurriedProps.res.txt @@ -1,7 +1,6 @@ @@jsxConfig({version: 4}) type props<'a> = {a?: 'a} -@react.component let make = (props: props<(. unit) => unit>) => { let a = switch props.a { | Some(a) => a @@ -29,7 +28,6 @@ func(~callback=(. str, a, b) => { module Foo = { type props<'callback> = {callback?: 'callback} - @react.component let make = (props: props<(. string, bool, bool) => unit>) => { let callback = switch props.callback { | Some(callback) => callback @@ -50,7 +48,7 @@ module Foo = { module Bar = { type props = {} - @react.component let make = (_: props) => React.jsx(Foo.make, {callback: (. _, _, _) => ()}) + let make = (_: props) => React.jsx(Foo.make, {callback: (. _, _, _) => ()}) let make = { let \"UncurriedProps$Bar" = props => make(props) diff --git a/res_syntax/tests/ppx/react/expected/v4.res.txt b/res_syntax/tests/ppx/react/expected/v4.res.txt index 8e604f8777..0a548c9021 100644 --- a/res_syntax/tests/ppx/react/expected/v4.res.txt +++ b/res_syntax/tests/ppx/react/expected/v4.res.txt @@ -1,5 +1,5 @@ type props<'x, 'y> = {x: 'x, y: 'y} // Component with type constraint -@react.component let make = ({x, y, _}: props) => React.string(x ++ y) +let make = ({x, y, _}: props) => React.string(x ++ y) let make = { let \"V4" = (props: props<_>) => make(props) \"V4" @@ -9,7 +9,7 @@ module AnotherName = { type // Component with another name than "make" props<'x> = {x: 'x} - @react.component let anotherName = ({x, _}: props<_>) => React.string(x) + let anotherName = ({x, _}: props<_>) => React.string(x) let anotherName = { let \"V4$AnotherName$anotherName" = (props: props<_>) => anotherName(props) @@ -20,7 +20,7 @@ module AnotherName = { module Uncurried = { type props<'x> = {x: 'x} - @react.component let make = ({x, _}: props<_>) => React.string(x) + let make = ({x, _}: props<_>) => React.string(x) let make = { let \"V4$Uncurried" = (props: props<_>) => make(props) diff --git a/res_syntax/tests/ppx/react/nested.res b/res_syntax/tests/ppx/react/nested.res new file mode 100644 index 0000000000..c7382d0e29 --- /dev/null +++ b/res_syntax/tests/ppx/react/nested.res @@ -0,0 +1,11 @@ +module Outer = { + @react.component + let make = () => { + module Inner = { + @react.component + let make = () =>
+ } + + + } +} \ No newline at end of file