Fix: Compiler now memoizes when const is between hooks (#35355) #35356
+25
−8
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #35355
The React Compiler was not properly memoizing values when a
constdeclaration appeared between React hooks. This fix ensures that const declarations don't break the memoization analysis chain.Problem
When a
constdeclaration appears between React hooks, the compiler's memoization logic was incorrectly pruning all active scopes, causinguseMemoand other memoized values to not be properly optimized.**Example of the bug:**pt
function Component() {
const [state, setState] = useState(0);
const someConst = 42; // ← This const between hooks breaks memoization
const memoized = useMemo(() => someConst * 2, [someConst]);
return
}## Solution
Updated the memoization logic in
FlattenScopesWithHooksOrUseHIR.tsto only prune scopes whose body blocks actually contain hooks, rather than pruning all active scopes when a hook is encountered. This allows scopes created between hooks (like const declarations) to be properly memoized.Changes
FlattenScopesWithHooksOrUseHIR.tsto identify blocks containing hooks in a first passTest Plan