📄 ExportVisitor¶
📊 Analysis Summary¶
| Metric | Count |
|---|---|
| 🔧 Functions | 5 |
| 🧱 Classes | 1 |
| 📦 Imports | 4 |
| 📑 Type Aliases | 1 |
📚 Table of Contents¶
🛠️ File Location:¶
📂 packages/scope-manager/src/referencer/ExportVisitor.ts
📦 Imports¶
| Name | Source |
|---|---|
TSESTree |
@typescript-eslint/types |
AST_NODE_TYPES |
@typescript-eslint/types |
Referencer |
./Referencer |
Visitor |
./Visitor |
Functions¶
ExportVisitor.visit(referencer: Referencer, node: ExportNode): void¶
Parameters:
referencerReferencernodeExportNode
Returns: void
Calls:
exportReferencer.visit
Code
ExportVisitor.ExportDefaultDeclaration(node: TSESTree.ExportDefaultDeclaration): void¶
Parameters:
nodeTSESTree.ExportDefaultDeclaration
Returns: void
Calls:
this.visit
Internal Comments:
Code
protected ExportDefaultDeclaration(
node: TSESTree.ExportDefaultDeclaration,
): void {
if (node.declaration.type === AST_NODE_TYPES.Identifier) {
// export default A;
// this could be a type or a variable
this.visit(node.declaration);
} else {
// export const a = 1;
// export something();
// etc
// these not included in the scope of this visitor as they are all guaranteed to be values or declare variables
}
}
ExportVisitor.ExportNamedDeclaration(node: TSESTree.ExportNamedDeclaration): void¶
Parameters:
nodeTSESTree.ExportNamedDeclaration
Returns: void
Calls:
this.visitChildren
Internal Comments:
// export ... from 'foo';
// these are external identifiers so there shouldn't be references or defs
// export { x }; (x4)
Code
protected ExportNamedDeclaration(
node: TSESTree.ExportNamedDeclaration,
): void {
if (node.source) {
// export ... from 'foo';
// these are external identifiers so there shouldn't be references or defs
return;
}
if (!node.declaration) {
// export { x };
this.visitChildren(node);
} else {
// export const x = 1;
// this is not included in the scope of this visitor as it creates a variable
}
}
ExportVisitor.ExportSpecifier(node: TSESTree.ExportSpecifier): void¶
Parameters:
nodeTSESTree.ExportSpecifier
Returns: void
Calls:
this.#referencer.currentScope().referenceTypethis.visit
Internal Comments:
// export { type T }; (x7)
// type exports can only reference types (x7)
// (x7)
// we can't let this fall through to the Identifier selector because the exportKind is on this node (x7)
// and we don't have access to the `.parent` during scope analysis (x7)
Code
protected ExportSpecifier(node: TSESTree.ExportSpecifier): void {
if (
node.exportKind === 'type' &&
node.local.type === AST_NODE_TYPES.Identifier
) {
// export { type T };
// type exports can only reference types
//
// we can't let this fall through to the Identifier selector because the exportKind is on this node
// and we don't have access to the `.parent` during scope analysis
this.#referencer.currentScope().referenceType(node.local);
} else {
this.visit(node.local);
}
}
ExportVisitor.Identifier(node: TSESTree.Identifier): void¶
Parameters:
nodeTSESTree.Identifier
Returns: void
Calls:
this.#referencer.currentScope().referenceTypethis.#referencer.currentScope().referenceDualValueType
Internal Comments:
Code
Classes¶
ExportVisitor¶
Extends: Visitor
Class Code
export class ExportVisitor extends Visitor {
readonly #exportNode: ExportNode;
readonly #referencer: Referencer;
constructor(node: ExportNode, referencer: Referencer) {
super(referencer);
this.#exportNode = node;
this.#referencer = referencer;
}
static visit(referencer: Referencer, node: ExportNode): void {
const exportReferencer = new ExportVisitor(node, referencer);
exportReferencer.visit(node);
}
protected ExportDefaultDeclaration(
node: TSESTree.ExportDefaultDeclaration,
): void {
if (node.declaration.type === AST_NODE_TYPES.Identifier) {
// export default A;
// this could be a type or a variable
this.visit(node.declaration);
} else {
// export const a = 1;
// export something();
// etc
// these not included in the scope of this visitor as they are all guaranteed to be values or declare variables
}
}
protected ExportNamedDeclaration(
node: TSESTree.ExportNamedDeclaration,
): void {
if (node.source) {
// export ... from 'foo';
// these are external identifiers so there shouldn't be references or defs
return;
}
if (!node.declaration) {
// export { x };
this.visitChildren(node);
} else {
// export const x = 1;
// this is not included in the scope of this visitor as it creates a variable
}
}
protected ExportSpecifier(node: TSESTree.ExportSpecifier): void {
if (
node.exportKind === 'type' &&
node.local.type === AST_NODE_TYPES.Identifier
) {
// export { type T };
// type exports can only reference types
//
// we can't let this fall through to the Identifier selector because the exportKind is on this node
// and we don't have access to the `.parent` during scope analysis
this.#referencer.currentScope().referenceType(node.local);
} else {
this.visit(node.local);
}
}
protected Identifier(node: TSESTree.Identifier): void {
if (this.#exportNode.exportKind === 'type') {
// export type { T };
// type exports can only reference types
this.#referencer.currentScope().referenceType(node);
} else {
this.#referencer.currentScope().referenceDualValueType(node);
}
}
}
Methods (5) — full entries under Functions
| Method | Signature |
|---|---|
visit |
(referencer: Referencer, node: ExportNode): void |
ExportDefaultDeclaration |
(node: TSESTree.ExportDefaultDeclaration): void |
ExportNamedDeclaration |
(node: TSESTree.ExportNamedDeclaration): void |
ExportSpecifier |
(node: TSESTree.ExportSpecifier): void |
Identifier |
(node: TSESTree.Identifier): void |
Type Aliases¶
ExportNode¶
type ExportNode = | TSESTree.ExportAllDeclaration
| TSESTree.ExportDefaultDeclaration
| TSESTree.ExportNamedDeclaration;
Generated by Syntax Scribe