Home / Function/ validateExhaustiveDependencies() — react Function Reference

validateExhaustiveDependencies() — react Function Reference

Architecture documentation for the validateExhaustiveDependencies() function in ValidateExhaustiveDependencies.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00["validateExhaustiveDependencies()"]
  fe7a7397_dddc_7222_20d4_d5b1015466f1["ValidateExhaustiveDependencies.ts"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|defined in| fe7a7397_dddc_7222_20d4_d5b1015466f1
  c3bc3875_256f_8f5e_7800_2f9c5bae65eb["runWithEnvironment()"]
  c3bc3875_256f_8f5e_7800_2f9c5bae65eb -->|calls| 46f23ae0_a9cb_8a6e_401f_cd99f2f91c00
  b0a60b4f_b441_1268_4d97_11d4cab39424["collectReactiveIdentifiersHIR()"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|calls| b0a60b4f_b441_1268_4d97_11d4cab39424
  041ca752_10c1_3cda_1f5c_02f44a01310e["invariant()"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|calls| 041ca752_10c1_3cda_1f5c_02f44a01310e
  0f1abc72_e074_1bef_6bd2_9c27c1ca2020["visitCandidateDependency()"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|calls| 0f1abc72_e074_1bef_6bd2_9c27c1ca2020
  6869984f_c56b_62c6_1328_06ff93395ab4["validateDependencies()"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|calls| 6869984f_c56b_62c6_1328_06ff93395ab4
  02303def_636f_c5b3_a751_1cf138fcea69["pushDiagnostic()"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|calls| 02303def_636f_c5b3_a751_1cf138fcea69
  75fd8677_19db_75c9_a011_6a3a774fa8f5["collectDependencies()"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|calls| 75fd8677_19db_75c9_a011_6a3a774fa8f5
  073c81a5_c389_d108_5b8f_4d6dc6eece83["push()"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|calls| 073c81a5_c389_d108_5b8f_4d6dc6eece83
  531eb985_e192_f9a2_2d7b_5deeb85ba95c["asResult()"]
  46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 -->|calls| 531eb985_e192_f9a2_2d7b_5deeb85ba95c
  style 46f23ae0_a9cb_8a6e_401f_cd99f2f91c00 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

compiler/packages/babel-plugin-react-compiler/src/Validation/ValidateExhaustiveDependencies.ts lines 89–219

export function validateExhaustiveDependencies(
  fn: HIRFunction,
): Result<void, CompilerError> {
  const env = fn.env;
  const reactive = collectReactiveIdentifiersHIR(fn);

  const temporaries: Map<IdentifierId, Temporary> = new Map();
  for (const param of fn.params) {
    const place = param.kind === 'Identifier' ? param : param.place;
    temporaries.set(place.identifier.id, {
      kind: 'Local',
      identifier: place.identifier,
      path: [],
      context: false,
      loc: place.loc,
    });
  }
  const error = new CompilerError();
  let startMemo: StartMemoize | null = null;

  function onStartMemoize(
    value: StartMemoize,
    dependencies: Set<InferredDependency>,
    locals: Set<IdentifierId>,
  ): void {
    CompilerError.invariant(startMemo == null, {
      reason: 'Unexpected nested memo calls',
      loc: value.loc,
    });
    startMemo = value;
    dependencies.clear();
    locals.clear();
  }
  function onFinishMemoize(
    value: FinishMemoize,
    dependencies: Set<InferredDependency>,
    locals: Set<IdentifierId>,
  ): void {
    CompilerError.invariant(
      startMemo != null && startMemo.manualMemoId === value.manualMemoId,
      {
        reason: 'Found FinishMemoize without corresponding StartMemoize',
        loc: value.loc,
      },
    );
    if (env.config.validateExhaustiveMemoizationDependencies) {
      visitCandidateDependency(value.decl, temporaries, dependencies, locals);
      const inferred: Array<InferredDependency> = Array.from(dependencies);

      const diagnostic = validateDependencies(
        inferred,
        startMemo.deps ?? [],
        reactive,
        startMemo.depsLoc,
        ErrorCategory.MemoDependencies,
        'all',
      );
      if (diagnostic != null) {
        error.pushDiagnostic(diagnostic);
      }
    }

    dependencies.clear();
    locals.clear();
    startMemo = null;
  }

  collectDependencies(
    fn,
    temporaries,
    {
      onStartMemoize,
      onFinishMemoize,
      onEffect: (inferred, manual, manualMemoLoc) => {
        if (env.config.validateExhaustiveEffectDependencies === 'off') {
          return;
        }
        if (DEBUG) {
          console.log(Array.from(inferred, printInferredDependency));
          console.log(Array.from(manual, printInferredDependency));
        }

Domain

Subdomains

Frequently Asked Questions

What does validateExhaustiveDependencies() do?
validateExhaustiveDependencies() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/Validation/ValidateExhaustiveDependencies.ts.
Where is validateExhaustiveDependencies() defined?
validateExhaustiveDependencies() is defined in compiler/packages/babel-plugin-react-compiler/src/Validation/ValidateExhaustiveDependencies.ts at line 89.
What does validateExhaustiveDependencies() call?
validateExhaustiveDependencies() calls 8 function(s): asResult, collectDependencies, collectReactiveIdentifiersHIR, invariant, push, pushDiagnostic, validateDependencies, visitCandidateDependency.
What calls validateExhaustiveDependencies()?
validateExhaustiveDependencies() is called by 1 function(s): runWithEnvironment.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free