diff --git a/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts b/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts index bb0d662c4f..6ab9ee79c7 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts @@ -992,9 +992,11 @@ function returnsNonNode( } } }, + // Skip traversing all nested functions and their return statements ArrowFunctionExpression: skipNestedFunctions(node), FunctionExpression: skipNestedFunctions(node), FunctionDeclaration: skipNestedFunctions(node), + ObjectMethod: node => node.skip(), }); return !hasReturn || returnsNonNode; diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-nested-object-method.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-nested-object-method.expect.md new file mode 100644 index 0000000000..cd77fb15e8 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-nested-object-method.expect.md @@ -0,0 +1,63 @@ + +## Input + +```javascript +// @compilationMode(infer) + +import { Stringify } from "shared-runtime"; + +function Test() { + const context = { + testFn() { + // if it is an arrow function its work + return () => 'test'; // it will break compile if returns an arrow fn + }, + }; + + return ; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Test, + params: [{}] +} + +``` + +## Code + +```javascript +import { c as _c } from "react/compiler-runtime"; // @compilationMode(infer) + +import { Stringify } from "shared-runtime"; + +function Test() { + const $ = _c(1); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + const context = { + testFn() { + return _temp; + }, + }; + + t0 = ; + $[0] = t0; + } else { + t0 = $[0]; + } + return t0; +} +function _temp() { + return "test"; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Test, + params: [{}], +}; + +``` + +### Eval output +(kind: ok)
{"value":{"testFn":{"kind":"Function","result":{"kind":"Function","result":"test"}}},"shouldInvokeFns":true}
\ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-nested-object-method.jsx b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-nested-object-method.jsx new file mode 100644 index 0000000000..d6bfdc322d --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-nested-object-method.jsx @@ -0,0 +1,19 @@ +// @compilationMode(infer) + +import { Stringify } from "shared-runtime"; + +function Test() { + const context = { + testFn() { + // if it is an arrow function its work + return () => 'test'; // it will break compile if returns an arrow fn + }, + }; + + return ; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Test, + params: [{}] +}