validateNoSetStateInRenderImpl() — react Function Reference
Architecture documentation for the validateNoSetStateInRenderImpl() function in ValidateNoSetStateInRender.ts from the react codebase.
Entity Profile
Dependency Diagram
graph TD da2fbbff_5a50_02e1_6269_0f09c43ccbeb["validateNoSetStateInRenderImpl()"] b4e382c8_ed3f_36e3_497f_a485571ec5ea["ValidateNoSetStateInRender.ts"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|defined in| b4e382c8_ed3f_36e3_497f_a485571ec5ea 6b44da3c_02a3_ccb3_6ac4_8f2c2291b667["validateNoSetStateInRender()"] 6b44da3c_02a3_ccb3_6ac4_8f2c2291b667 -->|calls| da2fbbff_5a50_02e1_6269_0f09c43ccbeb cc92da6a_36c2_147e_624d_3b9a7d1999b0["computeUnconditionalBlocks()"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|calls| cc92da6a_36c2_147e_624d_3b9a7d1999b0 b2fc2985_a7ba_9865_c2a3_2a7531f27d44["eachInstructionValueOperand()"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|calls| b2fc2985_a7ba_9865_c2a3_2a7531f27d44 041ca752_10c1_3cda_1f5c_02f44a01310e["invariant()"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|calls| 041ca752_10c1_3cda_1f5c_02f44a01310e 02303def_636f_c5b3_a751_1cf138fcea69["pushDiagnostic()"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|calls| 02303def_636f_c5b3_a751_1cf138fcea69 ac13f5c1_be17_dd7a_6bd3_66d91c46aadf["create()"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|calls| ac13f5c1_be17_dd7a_6bd3_66d91c46aadf 1a2b7047_24c8_62d6_b328_5f07307d27ab["withDetails()"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|calls| 1a2b7047_24c8_62d6_b328_5f07307d27ab 531eb985_e192_f9a2_2d7b_5deeb85ba95c["asResult()"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|calls| 531eb985_e192_f9a2_2d7b_5deeb85ba95c 8f45c458_198e_ea00_a21c_eae224736051["isErr()"] da2fbbff_5a50_02e1_6269_0f09c43ccbeb -->|calls| 8f45c458_198e_ea00_a21c_eae224736051 style da2fbbff_5a50_02e1_6269_0f09c43ccbeb fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
compiler/packages/babel-plugin-react-compiler/src/Validation/ValidateNoSetStateInRender.ts lines 53–187
function validateNoSetStateInRenderImpl(
fn: HIRFunction,
unconditionalSetStateFunctions: Set<IdentifierId>,
): Result<void, CompilerError> {
const unconditionalBlocks = computeUnconditionalBlocks(fn);
let activeManualMemoId: number | null = null;
const errors = new CompilerError();
for (const [, block] of fn.body.blocks) {
for (const instr of block.instructions) {
switch (instr.value.kind) {
case 'LoadLocal': {
if (
unconditionalSetStateFunctions.has(instr.value.place.identifier.id)
) {
unconditionalSetStateFunctions.add(instr.lvalue.identifier.id);
}
break;
}
case 'StoreLocal': {
if (
unconditionalSetStateFunctions.has(instr.value.value.identifier.id)
) {
unconditionalSetStateFunctions.add(
instr.value.lvalue.place.identifier.id,
);
unconditionalSetStateFunctions.add(instr.lvalue.identifier.id);
}
break;
}
case 'ObjectMethod':
case 'FunctionExpression': {
if (
// faster-path to check if the function expression references a setState
[...eachInstructionValueOperand(instr.value)].some(
operand =>
isSetStateType(operand.identifier) ||
unconditionalSetStateFunctions.has(operand.identifier.id),
) &&
// if yes, does it unconditonally call it?
validateNoSetStateInRenderImpl(
instr.value.loweredFunc.func,
unconditionalSetStateFunctions,
).isErr()
) {
// This function expression unconditionally calls a setState
unconditionalSetStateFunctions.add(instr.lvalue.identifier.id);
}
break;
}
case 'StartMemoize': {
CompilerError.invariant(activeManualMemoId === null, {
reason: 'Unexpected nested StartMemoize instructions',
loc: instr.value.loc,
});
activeManualMemoId = instr.value.manualMemoId;
break;
}
case 'FinishMemoize': {
CompilerError.invariant(
activeManualMemoId === instr.value.manualMemoId,
{
reason:
'Expected FinishMemoize to align with previous StartMemoize instruction',
loc: instr.value.loc,
},
);
activeManualMemoId = null;
break;
}
case 'CallExpression': {
const callee = instr.value.callee;
if (
isSetStateType(callee.identifier) ||
unconditionalSetStateFunctions.has(callee.identifier.id)
) {
if (activeManualMemoId !== null) {
errors.pushDiagnostic(
CompilerDiagnostic.create({
category: ErrorCategory.RenderSetState,
reason:
'Calling setState from useMemo may trigger an infinite loop',
Domain
Subdomains
Defined In
Calls
Called By
Source
Frequently Asked Questions
What does validateNoSetStateInRenderImpl() do?
validateNoSetStateInRenderImpl() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/Validation/ValidateNoSetStateInRender.ts.
Where is validateNoSetStateInRenderImpl() defined?
validateNoSetStateInRenderImpl() is defined in compiler/packages/babel-plugin-react-compiler/src/Validation/ValidateNoSetStateInRender.ts at line 53.
What does validateNoSetStateInRenderImpl() call?
validateNoSetStateInRenderImpl() calls 8 function(s): asResult, computeUnconditionalBlocks, create, eachInstructionValueOperand, invariant, isErr, pushDiagnostic, withDetails.
What calls validateNoSetStateInRenderImpl()?
validateNoSetStateInRenderImpl() is called by 1 function(s): validateNoSetStateInRender.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free