mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
Flag ValidateNoSetStateInRender
This needs a bit more work before we can turn it on by default, see the next PR for a failing test case.
This commit is contained in:
@@ -137,12 +137,14 @@ export function* run(
|
||||
validateNoRefAccessInRender(hir);
|
||||
}
|
||||
|
||||
const noSetStateInRenderResult = validateNoSetStateInRender(hir).unwrap();
|
||||
yield log({
|
||||
kind: "debug",
|
||||
name: "ValidateNoSetStateInRender",
|
||||
value: noSetStateInRenderResult.debug(),
|
||||
});
|
||||
if (env.validateNoSetStateInRender) {
|
||||
const noSetStateInRenderResult = validateNoSetStateInRender(hir).unwrap();
|
||||
yield log({
|
||||
kind: "debug",
|
||||
name: "ValidateNoSetStateInRender",
|
||||
value: noSetStateInRenderResult.debug(),
|
||||
});
|
||||
}
|
||||
|
||||
leaveSSA(hir);
|
||||
yield log({ kind: "hir", name: "LeaveSSA", value: hir });
|
||||
|
||||
@@ -83,6 +83,14 @@ export type EnvironmentConfig = Partial<{
|
||||
*/
|
||||
validateFrozenLambdas: boolean;
|
||||
|
||||
/**
|
||||
* Validates that setState is not unconditionally called during render, as it can lead to
|
||||
* infinite loops.
|
||||
*
|
||||
* Defaults to false
|
||||
*/
|
||||
validateNoSetStateInRender: boolean;
|
||||
|
||||
/**
|
||||
* Enable inlining of `useMemo()` function expressions so that they can be more optimally
|
||||
* compiled.
|
||||
@@ -176,6 +184,7 @@ export class Environment {
|
||||
validateHooksUsage: boolean;
|
||||
validateRefAccessDuringRender: boolean;
|
||||
validateFrozenLambdas: boolean;
|
||||
validateNoSetStateInRender: boolean;
|
||||
enableFunctionCallSignatureOptimizations: boolean;
|
||||
enableAssumeHooksFollowRulesOfReact: boolean;
|
||||
enableTreatHooksAsFunctions: boolean;
|
||||
@@ -231,6 +240,8 @@ export class Environment {
|
||||
this.enableOptimizeFunctionExpressions =
|
||||
config?.enableOptimizeFunctionExpressions ?? true;
|
||||
this.assertValidMutableRanges = config?.assertValidMutableRanges ?? false;
|
||||
this.validateNoSetStateInRender =
|
||||
config?.validateNoSetStateInRender ?? false;
|
||||
|
||||
this.#contextIdentifiers = contextIdentifiers;
|
||||
}
|
||||
|
||||
@@ -97,6 +97,7 @@ export async function compile(
|
||||
let enableTreatHooksAsFunctions = true;
|
||||
let disableAllMemoization = false;
|
||||
let validateRefAccessDuringRender = true;
|
||||
let validateNoSetStateInRender = true;
|
||||
let enableEmitFreeze = null;
|
||||
let enableOptimizeFunctionExpressions = true;
|
||||
if (firstLine.indexOf("@forgetDirective") !== -1) {
|
||||
@@ -132,6 +133,9 @@ export async function compile(
|
||||
if (firstLine.includes("@validateRefAccessDuringRender false")) {
|
||||
validateRefAccessDuringRender = false;
|
||||
}
|
||||
if (firstLine.includes("@validateNoSetStateInRender false")) {
|
||||
validateNoSetStateInRender = false;
|
||||
}
|
||||
if (firstLine.includes("@enableOptimizeFunctionExpressions false")) {
|
||||
enableOptimizeFunctionExpressions = false;
|
||||
}
|
||||
@@ -165,6 +169,7 @@ export async function compile(
|
||||
validateHooksUsage: true,
|
||||
validateRefAccessDuringRender,
|
||||
validateFrozenLambdas: true,
|
||||
validateNoSetStateInRender,
|
||||
enableEmitFreeze,
|
||||
enableOptimizeFunctionExpressions,
|
||||
assertValidMutableRanges: true,
|
||||
|
||||
Reference in New Issue
Block a user