From ca5e97d18f32ee65303074ad9f6fb00791087aef Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Sat, 2 May 2026 10:25:48 +0530 Subject: [PATCH] Preserve computed object method keys --- .../ReactiveScopes/CodegenReactiveFunction.ts | 2 +- .../computed-object-method-key.expect.md | 52 +++++++++++++++++++ .../compiler/computed-object-method-key.js | 13 +++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/computed-object-method-key.expect.md create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/computed-object-method-key.js diff --git a/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts b/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts index 486773d5eb91..45230c87bae7 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts @@ -1685,7 +1685,7 @@ function codegenInstructionValue( key, fn.params, fn.body, - false, + property.key.kind === 'computed', ); babelNode.async = fn.async; babelNode.generator = fn.generator; diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/computed-object-method-key.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/computed-object-method-key.expect.md new file mode 100644 index 000000000000..00318f8685bb --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/computed-object-method-key.expect.md @@ -0,0 +1,52 @@ + +## Input + +```javascript +function Component(props) { + const computedKey = props.computedKey; + return { + [computedKey]() { + return props.value; + }, + }; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{computedKey: 'readValue', value: 42}], +}; + +``` + +## Code + +```javascript +import { c as _c } from "react/compiler-runtime"; +function Component(props) { + const $ = _c(3); + const computedKey = props.computedKey; + let t0; + if ($[0] !== computedKey || $[1] !== props.value) { + t0 = { + [computedKey]() { + return props.value; + }, + }; + $[0] = computedKey; + $[1] = props.value; + $[2] = t0; + } else { + t0 = $[2]; + } + return t0; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ computedKey: "readValue", value: 42 }], +}; + +``` + +### Eval output +(kind: ok) {"readValue":"[[ function params=0 ]]"} \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/computed-object-method-key.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/computed-object-method-key.js new file mode 100644 index 000000000000..f2a0789251f3 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/computed-object-method-key.js @@ -0,0 +1,13 @@ +function Component(props) { + const computedKey = props.computedKey; + return { + [computedKey]() { + return props.value; + }, + }; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{computedKey: 'readValue', value: 42}], +};