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:
Lauren Tan
2023-07-27 17:08:01 -04:00
parent 12e6cee06f
commit e77d975b16
3 changed files with 24 additions and 6 deletions
@@ -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,