Home / Function/ computeMemoizedIdentifiers() — react Function Reference

computeMemoizedIdentifiers() — react Function Reference

Architecture documentation for the computeMemoizedIdentifiers() function in PruneNonEscapingScopes.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  6cbc6f54_5202_efe6_f13a_d6f4722effbc["computeMemoizedIdentifiers()"]
  c4112963_95fe_d8ed_3bfd_f6d45887acb7["PruneNonEscapingScopes.ts"]
  6cbc6f54_5202_efe6_f13a_d6f4722effbc -->|defined in| c4112963_95fe_d8ed_3bfd_f6d45887acb7
  d832b21e_d654_e993_f855_4556f97c1e2d["pruneNonEscapingScopes()"]
  d832b21e_d654_e993_f855_4556f97c1e2d -->|calls| 6cbc6f54_5202_efe6_f13a_d6f4722effbc
  041ca752_10c1_3cda_1f5c_02f44a01310e["invariant()"]
  6cbc6f54_5202_efe6_f13a_d6f4722effbc -->|calls| 041ca752_10c1_3cda_1f5c_02f44a01310e
  style 6cbc6f54_5202_efe6_f13a_d6f4722effbc fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts lines 280–347

function computeMemoizedIdentifiers(state: State): Set<DeclarationId> {
  const memoized = new Set<DeclarationId>();

  // Visit an identifier, optionally forcing it to be memoized
  function visit(id: DeclarationId, forceMemoize: boolean = false): boolean {
    const node = state.identifiers.get(id);
    CompilerError.invariant(node !== undefined, {
      reason: `Expected a node for all identifiers, none found for \`${id}\``,
      loc: GeneratedSource,
    });
    if (node.seen) {
      return node.memoized;
    }
    node.seen = true;

    /*
     * Note: in case of cycles we temporarily mark the identifier as non-memoized,
     * this is reset later after processing dependencies
     */
    node.memoized = false;

    // Visit dependencies, determine if any of them are memoized
    let hasMemoizedDependency = false;
    for (const dep of node.dependencies) {
      const isDepMemoized = visit(dep);
      hasMemoizedDependency ||= isDepMemoized;
    }

    if (
      node.level === MemoizationLevel.Memoized ||
      (node.level === MemoizationLevel.Conditional &&
        (hasMemoizedDependency || forceMemoize)) ||
      (node.level === MemoizationLevel.Unmemoized && forceMemoize)
    ) {
      node.memoized = true;
      memoized.add(id);
      for (const scope of node.scopes) {
        forceMemoizeScopeDependencies(scope);
      }
    }
    return node.memoized;
  }

  // Force all the scope's optionally-memoizeable dependencies (not "Never") to be memoized
  function forceMemoizeScopeDependencies(id: ScopeId): void {
    const node = state.scopes.get(id);
    CompilerError.invariant(node !== undefined, {
      reason: 'Expected a node for all scopes',
      loc: GeneratedSource,
    });
    if (node.seen) {
      return;
    }
    node.seen = true;

    for (const dep of node.dependencies) {
      visit(dep, true);
    }
    return;
  }

  // Walk from the "roots" aka returned identifiers.
  for (const value of state.escapingValues) {
    visit(value);
  }

  return memoized;
}

Domain

Subdomains

Calls

Frequently Asked Questions

What does computeMemoizedIdentifiers() do?
computeMemoizedIdentifiers() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts.
Where is computeMemoizedIdentifiers() defined?
computeMemoizedIdentifiers() is defined in compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts at line 280.
What does computeMemoizedIdentifiers() call?
computeMemoizedIdentifiers() calls 1 function(s): invariant.
What calls computeMemoizedIdentifiers()?
computeMemoizedIdentifiers() is called by 1 function(s): pruneNonEscapingScopes.

Analyze Your Own Codebase

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

Try Supermodel Free