diff --git a/compiler/packages/babel-plugin-react-forget/src/HIR/BuildHIR.ts b/compiler/packages/babel-plugin-react-forget/src/HIR/BuildHIR.ts index 48f925f673..ca0d26ce61 100644 --- a/compiler/packages/babel-plugin-react-forget/src/HIR/BuildHIR.ts +++ b/compiler/packages/babel-plugin-react-forget/src/HIR/BuildHIR.ts @@ -2238,6 +2238,20 @@ function isReorderableExpression( case "BigIntLiteral": { return true; } + case "TypeCastExpression": { + return isReorderableExpression( + builder, + (expr as NodePath).get("expression") + ); + } + case "ConditionalExpression": { + const conditional = expr as NodePath; + return ( + isReorderableExpression(builder, conditional.get("test")) && + isReorderableExpression(builder, conditional.get("consequent")) && + isReorderableExpression(builder, conditional.get("alternate")) + ); + } case "ArrayExpression": { return (expr as NodePath) .get("elements") diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-conditional-as-default-value.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-conditional-as-default-value.expect.md new file mode 100644 index 0000000000..83e506bb0c --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-conditional-as-default-value.expect.md @@ -0,0 +1,32 @@ + +## Input + +```javascript +function Component(props) { + const [x = true ? 1 : 0] = props.y; + return x; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ y: [] }], +}; + +``` + +## Code + +```javascript +function Component(props) { + const [t23] = props.y; + const x = t23 === undefined ? (true ? 1 : 0) : t23; + return x; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ y: [] }], +}; + +``` + \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-conditional-as-default-value.js b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-conditional-as-default-value.js new file mode 100644 index 0000000000..01e7072294 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-conditional-as-default-value.js @@ -0,0 +1,9 @@ +function Component(props) { + const [x = true ? 1 : 0] = props.y; + return x; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ y: [] }], +}; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-typecast-as-default-value.flow.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-typecast-as-default-value.flow.expect.md new file mode 100644 index 0000000000..fe1f14ef73 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-typecast-as-default-value.flow.expect.md @@ -0,0 +1,43 @@ + +## Input + +```javascript +// @flow +function Component(props) { + const [x = ([]: Array)] = props.y; + return x; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{y: []}], +}; +``` + +## Code + +```javascript +import { unstable_useMemoCache as useMemoCache } from "react"; +function Component(props) { + const $ = useMemoCache(2); + const [t0] = props.y; + const c_0 = $[0] !== t0; + let t1; + if (c_0) { + t1 = t0 === undefined ? ([]: Array) : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const x = t1; + return x; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ y: [] }], +}; + +``` + \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-typecast-as-default-value.flow.js b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-typecast-as-default-value.flow.js new file mode 100644 index 0000000000..05bd688ba8 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/destructuring-with-typecast-as-default-value.flow.js @@ -0,0 +1,10 @@ +// @flow +function Component(props) { + const [x = ([]: Array)] = props.y; + return x; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{y: []}], +}; \ No newline at end of file