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
Source
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