[compiler][ez] Patch compilationMode:infer object method edge case

Fix for  https://github.com/facebook/react/issues/31180
This commit is contained in:
Mofei Zhang
2025-01-13 11:58:38 -05:00
parent 0bf1f39ec6
commit f65ea108eb
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: [{}]
}