Home / Function/ validateNoSetStateInRenderImpl() — react Function Reference

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

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