Home / Class/ CollectDependenciesVisitor Class — react Architecture

CollectDependenciesVisitor Class — react Architecture

Architecture documentation for the CollectDependenciesVisitor class in PruneNonEscapingScopes.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  714af45f_cbe2_027b_49c5_27e47069c22c["CollectDependenciesVisitor"]
  c4112963_95fe_d8ed_3bfd_f6d45887acb7["PruneNonEscapingScopes.ts"]
  714af45f_cbe2_027b_49c5_27e47069c22c -->|defined in| c4112963_95fe_d8ed_3bfd_f6d45887acb7
  6b29824e_99fb_0514_c792_e91ed236ac73["constructor()"]
  714af45f_cbe2_027b_49c5_27e47069c22c -->|method| 6b29824e_99fb_0514_c792_e91ed236ac73
  5f0939bb_76eb_1279_d295_dacefad72c8a["computeMemoizationInputs()"]
  714af45f_cbe2_027b_49c5_27e47069c22c -->|method| 5f0939bb_76eb_1279_d295_dacefad72c8a
  97a5722d_5f85_030f_127a_0ee70f10e274["visitValueForMemoization()"]
  714af45f_cbe2_027b_49c5_27e47069c22c -->|method| 97a5722d_5f85_030f_127a_0ee70f10e274
  3e0ecaac_7842_5d1d_db02_c18fdd69c93b["visitInstruction()"]
  714af45f_cbe2_027b_49c5_27e47069c22c -->|method| 3e0ecaac_7842_5d1d_db02_c18fdd69c93b
  cf86ad4e_f1c8_5ac8_4061_3bc569f34740["visitTerminal()"]
  714af45f_cbe2_027b_49c5_27e47069c22c -->|method| cf86ad4e_f1c8_5ac8_4061_3bc569f34740
  8964b840_74b5_2c96_c227_89dd281fdf38["visitScope()"]
  714af45f_cbe2_027b_49c5_27e47069c22c -->|method| 8964b840_74b5_2c96_c227_89dd281fdf38

Relationship Graph

Source Code

compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts lines 397–1008

class CollectDependenciesVisitor extends ReactiveFunctionVisitor<
  Array<ReactiveScope>
> {
  env: Environment;
  state: State;
  options: MemoizationOptions;

  constructor(env: Environment, state: State) {
    super();
    this.env = env;
    this.state = state;
    this.options = {
      memoizeJsxElements: !this.env.config.enableForest,
      forceMemoizePrimitives:
        this.env.config.enableForest ||
        this.env.config.enablePreserveExistingMemoizationGuarantees,
    };
  }

  /*
   * Given a value, returns a description of how it should be memoized:
   * - lvalues: optional extra places that are lvalue-like in the sense of
   *   aliasing the rvalues
   * - rvalues: places that are aliased by the instruction's lvalues.
   * - level: the level of memoization to apply to this value
   */
  computeMemoizationInputs(
    value: ReactiveValue,
    lvalue: Place | null,
  ): {
    // can optionally return a custom set of lvalues per instruction
    lvalues: Array<LValueMemoization>;
    rvalues: Array<Place>;
  } {
    const env = this.env;
    const options = this.options;

    switch (value.kind) {
      case 'ConditionalExpression': {
        return {
          // Only need to memoize if the rvalues are memoized
          lvalues:
            lvalue !== null
              ? [{place: lvalue, level: MemoizationLevel.Conditional}]
              : [],
          rvalues: [
            // Conditionals do not alias their test value.
            ...this.computeMemoizationInputs(value.consequent, null).rvalues,
            ...this.computeMemoizationInputs(value.alternate, null).rvalues,
          ],
        };
      }
      case 'LogicalExpression': {
        return {
          // Only need to memoize if the rvalues are memoized
          lvalues:
            lvalue !== null
              ? [{place: lvalue, level: MemoizationLevel.Conditional}]
              : [],
          rvalues: [
            ...this.computeMemoizationInputs(value.left, null).rvalues,
            ...this.computeMemoizationInputs(value.right, null).rvalues,
          ],
        };
      }
      case 'SequenceExpression': {
        for (const instr of value.instructions) {
          this.visitValueForMemoization(instr.id, instr.value, instr.lvalue);
        }
        return {
          // Only need to memoize if the rvalues are memoized
          lvalues:
            lvalue !== null
              ? [{place: lvalue, level: MemoizationLevel.Conditional}]
              : [],
          /*
           * Only the final value of the sequence is a true rvalue:
           * values from the sequence's instructions are evaluated
           * as separate nodes
           */
          rvalues: this.computeMemoizationInputs(value.value, null).rvalues,

Domain

Frequently Asked Questions

What is the CollectDependenciesVisitor class?
CollectDependenciesVisitor is a class in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts.
Where is CollectDependenciesVisitor defined?
CollectDependenciesVisitor is defined in compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts at line 397.

Analyze Your Own Codebase

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

Try Supermodel Free