[compiler][ez] Patch compilationMode:infer object method edge case (#32055)

Fix for  https://github.com/facebook/react/issues/31180
This commit is contained in:
mofeiZ
2025-01-13 12:18:59 -05:00
committed by GitHub
parent 460121364e
commit c9523826dc
3 changed files with 84 additions and 0 deletions
@@ -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;
@@ -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 <Stringify value={context} shouldInvokeFns={true} />;
}
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 = <Stringify value={context} shouldInvokeFns={true} />;
$[0] = t0;
} else {
t0 = $[0];
}
return t0;
}
function _temp() {
return "test";
}
export const FIXTURE_ENTRYPOINT = {
fn: Test,
params: [{}],
};
```
### Eval output
(kind: ok) <div>{"value":{"testFn":{"kind":"Function","result":{"kind":"Function","result":"test"}}},"shouldInvokeFns":true}</div>
@@ -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 <Stringify value={context} shouldInvokeFns={true} />;
}
export const FIXTURE_ENTRYPOINT = {
fn: Test,
params: [{}],
};