Home / Class/ Visitor Class — react Architecture

Visitor Class — react Architecture

Architecture documentation for the Visitor class in PruneHoistedContexts.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  d5fccea7_98aa_783b_f46b_c702031e387a["Visitor"]
  3b44eada_4dab_f6ef_3a59_8679cbd297bb["PruneHoistedContexts.ts"]
  d5fccea7_98aa_783b_f46b_c702031e387a -->|defined in| 3b44eada_4dab_f6ef_3a59_8679cbd297bb
  362d4dbc_afba_225c_96b2_ea1c61130620["visitScope()"]
  d5fccea7_98aa_783b_f46b_c702031e387a -->|method| 362d4dbc_afba_225c_96b2_ea1c61130620
  0dafe3aa_7a5c_93b0_d6e4_69e932495a6a["visitPlace()"]
  d5fccea7_98aa_783b_f46b_c702031e387a -->|method| 0dafe3aa_7a5c_93b0_d6e4_69e932495a6a
  f1e10939_7d28_07b3_187a_eb50166b9b8c["transformInstruction()"]
  d5fccea7_98aa_783b_f46b_c702031e387a -->|method| f1e10939_7d28_07b3_187a_eb50166b9b8c

Relationship Graph

Source Code

compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneHoistedContexts.ts lines 64–170

class Visitor extends ReactiveFunctionTransform<VisitorState> {
  override visitScope(scope: ReactiveScopeBlock, state: VisitorState): void {
    state.activeScopes = state.activeScopes.push(
      new Set(scope.scope.declarations.keys()),
    );
    /**
     * Add declared but not initialized / assigned variables. This may include
     * function declarations that escape the memo block.
     */
    for (const decl of scope.scope.declarations.values()) {
      state.uninitialized.set(decl.identifier.id, {kind: 'unknown-kind'});
    }
    this.traverseScope(scope, state);
    state.activeScopes.pop();
    for (const decl of scope.scope.declarations.values()) {
      state.uninitialized.delete(decl.identifier.id);
    }
  }
  override visitPlace(
    _id: InstructionId,
    place: Place,
    state: VisitorState,
  ): void {
    const maybeHoistedFn = state.uninitialized.get(place.identifier.id);
    if (
      maybeHoistedFn?.kind === 'func' &&
      maybeHoistedFn.definition !== place
    ) {
      CompilerError.throwTodo({
        reason: '[PruneHoistedContexts] Rewrite hoisted function references',
        loc: place.loc,
      });
    }
  }
  override transformInstruction(
    instruction: ReactiveInstruction,
    state: VisitorState,
  ): Transformed<ReactiveStatement> {
    /**
     * Remove hoisted declarations to preserve TDZ
     */
    if (instruction.value.kind === 'DeclareContext') {
      const maybeNonHoisted = convertHoistedLValueKind(
        instruction.value.lvalue.kind,
      );
      if (maybeNonHoisted != null) {
        if (
          maybeNonHoisted === InstructionKind.Function &&
          state.uninitialized.has(instruction.value.lvalue.place.identifier.id)
        ) {
          state.uninitialized.set(
            instruction.value.lvalue.place.identifier.id,
            {
              kind: 'func',
              definition: null,
            },
          );
        }
        return {kind: 'remove'};
      }
    }
    if (
      instruction.value.kind === 'StoreContext' &&
      instruction.value.lvalue.kind !== InstructionKind.Reassign
    ) {
      /**
       * Rewrite StoreContexts let/const that will be pre-declared in
       * codegen to reassignments.
       */
      const lvalueId = instruction.value.lvalue.place.identifier.id;
      const isDeclaredByScope = state.activeScopes.find(scope =>
        scope.has(lvalueId),
      );
      if (isDeclaredByScope) {
        if (
          instruction.value.lvalue.kind === InstructionKind.Let ||
          instruction.value.lvalue.kind === InstructionKind.Const
        ) {
          instruction.value.lvalue.kind = InstructionKind.Reassign;
        } else if (instruction.value.lvalue.kind === InstructionKind.Function) {
          const maybeHoistedFn = state.uninitialized.get(lvalueId);

Domain

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free