Skip to content

Commit e83d144

Browse files
Use getNodeId() less, specifically for NodeLinks.
1 parent 28e3cd3 commit e83d144

File tree

4 files changed

+27
-25
lines changed

4 files changed

+27
-25
lines changed

src/compiler/binder.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace ts {
1515
referenced: boolean;
1616
}
1717

18-
export function getModuleInstanceState(node: ModuleDeclaration, visited?: ESMap<number, ModuleInstanceState | undefined>): ModuleInstanceState {
18+
export function getModuleInstanceState(node: ModuleDeclaration, visited?: ESMap<Node, ModuleInstanceState | undefined>): ModuleInstanceState {
1919
if (node.body && !node.body.parent) {
2020
// getModuleInstanceStateForAliasTarget needs to walk up the parent chain, so parent pointers must be set on this tree already
2121
setParent(node.body, node);
@@ -24,18 +24,17 @@ namespace ts {
2424
return node.body ? getModuleInstanceStateCached(node.body, visited) : ModuleInstanceState.Instantiated;
2525
}
2626

27-
function getModuleInstanceStateCached(node: Node, visited = new Map<number, ModuleInstanceState | undefined>()) {
28-
const nodeId = getNodeId(node);
29-
if (visited.has(nodeId)) {
30-
return visited.get(nodeId) || ModuleInstanceState.NonInstantiated;
27+
function getModuleInstanceStateCached(node: Node, visited = new Map<Node, ModuleInstanceState | undefined>()) {
28+
if (visited.has(node)) {
29+
return visited.get(node) || ModuleInstanceState.NonInstantiated;
3130
}
32-
visited.set(nodeId, undefined);
31+
visited.set(node, undefined);
3332
const result = getModuleInstanceStateWorker(node, visited);
34-
visited.set(nodeId, result);
33+
visited.set(node, result);
3534
return result;
3635
}
3736

38-
function getModuleInstanceStateWorker(node: Node, visited: ESMap<number, ModuleInstanceState | undefined>): ModuleInstanceState {
37+
function getModuleInstanceStateWorker(node: Node, visited: ESMap<Node, ModuleInstanceState | undefined>): ModuleInstanceState {
3938
// A module is uninstantiated if it contains only
4039
switch (node.kind) {
4140
// 1. interface declarations, type alias declarations
@@ -107,7 +106,7 @@ namespace ts {
107106
return ModuleInstanceState.Instantiated;
108107
}
109108

110-
function getModuleInstanceStateForAliasTarget(specifier: ExportSpecifier, visited: ESMap<number, ModuleInstanceState | undefined>) {
109+
function getModuleInstanceStateForAliasTarget(specifier: ExportSpecifier, visited: ESMap<Node, ModuleInstanceState | undefined>) {
111110
const name = specifier.propertyName || specifier.name;
112111
let p: Node | undefined = specifier.parent;
113112
while (p) {
@@ -2984,7 +2983,7 @@ namespace ts {
29842983

29852984
function addLateBoundAssignmentDeclarationToSymbol(node: BinaryExpression | DynamicNamedDeclaration, symbol: Symbol | undefined) {
29862985
if (symbol) {
2987-
(symbol.assignmentDeclarationMembers || (symbol.assignmentDeclarationMembers = new Map())).set(getNodeId(node), node);
2986+
(symbol.assignmentDeclarationMembers ||= new Set()).add(node);
29882987
}
29892988
}
29902989

src/compiler/checker.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -974,7 +974,7 @@ namespace ts {
974974
const maximumSuggestionCount = 10;
975975
const mergedSymbols: Symbol[] = [];
976976
const symbolLinks: SymbolLinks[] = [];
977-
const nodeLinks: NodeLinks[] = [];
977+
const nodeLinks: ESMap<Node, NodeLinks> = new Map();
978978
const flowLoopCaches: ESMap<string, Type>[] = [];
979979
const flowLoopNodes: FlowNode[] = [];
980980
const flowLoopKeys: string[] = [];
@@ -1463,8 +1463,11 @@ namespace ts {
14631463
}
14641464

14651465
function getNodeLinks(node: Node): NodeLinks {
1466-
const nodeId = getNodeId(node);
1467-
return nodeLinks[nodeId] || (nodeLinks[nodeId] = new (NodeLinks as any)());
1466+
let result = nodeLinks.get(node);
1467+
if (!result) {
1468+
nodeLinks.set(node, result = new (NodeLinks as any)() as NodeLinks);
1469+
}
1470+
return result;
14681471
}
14691472

14701473
function isGlobalSourceFile(node: Node) {
@@ -40316,9 +40319,8 @@ namespace ts {
4031640319
const enclosingFile = getSourceFileOfNode(node);
4031740320
const links = getNodeLinks(enclosingFile);
4031840321
if (!(links.flags & NodeCheckFlags.TypeChecked)) {
40319-
links.deferredNodes = links.deferredNodes || new Map();
40320-
const id = getNodeId(node);
40321-
links.deferredNodes.set(id, node);
40322+
links.deferredNodes = links.deferredNodes || new Set();
40323+
links.deferredNodes.add(node);
4032240324
}
4032340325
}
4032440326

@@ -41599,9 +41601,7 @@ namespace ts {
4159941601
}
4160041602

4160141603
function getNodeCheckFlags(node: Node): NodeCheckFlags {
41602-
const nodeId = node.id || 0;
41603-
if (nodeId < 0 || nodeId >= nodeLinks.length) return 0;
41604-
return nodeLinks[nodeId]?.flags || 0;
41604+
return nodeLinks.get(node)?.flags || 0;
4160541605
}
4160641606

4160741607
function getEnumMemberValue(node: EnumMember): string | number | undefined {

src/compiler/emitter.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ namespace ts {
869869
const bundledHelpers = new Map<string, boolean>();
870870

871871
let currentSourceFile: SourceFile | undefined;
872-
let nodeIdToGeneratedName: string[]; // Map of generated names for specific nodes.
872+
let nodeToGeneratedName: ESMap<Node, string>; // Map of generated names for specific nodes.
873873
let autoGeneratedIdToGeneratedName: string[]; // Map of generated names for temp and loop variables.
874874
let generatedNames: Set<string>; // Set of names generated by the NameGenerator.
875875
let tempFlagsStack: TempFlags[]; // Stack of enclosing name generation scopes.
@@ -1154,7 +1154,7 @@ namespace ts {
11541154
}
11551155

11561156
function reset() {
1157-
nodeIdToGeneratedName = [];
1157+
nodeToGeneratedName = new Map<Node, string>();
11581158
autoGeneratedIdToGeneratedName = [];
11591159
generatedNames = new Set();
11601160
tempFlagsStack = [];
@@ -5008,8 +5008,11 @@ namespace ts {
50085008
}
50095009

50105010
function generateNameCached(node: Node, flags?: GeneratedIdentifierFlags) {
5011-
const nodeId = getNodeId(node);
5012-
return nodeIdToGeneratedName[nodeId] || (nodeIdToGeneratedName[nodeId] = generateNameForNode(node, flags));
5011+
let result = nodeToGeneratedName.get(node);
5012+
if (result === undefined) {
5013+
nodeToGeneratedName.set(node, result = generateNameForNode(node, flags));
5014+
}
5015+
return result;
50135016
}
50145017

50155018
/**

src/compiler/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4908,7 +4908,7 @@ namespace ts {
49084908
/* @internal */ isReferenced?: SymbolFlags; // True if the symbol is referenced elsewhere. Keeps track of the meaning of a reference in case a symbol is both a type parameter and parameter.
49094909
/* @internal */ isReplaceableByMethod?: boolean; // Can this Javascript class property be replaced by a method symbol?
49104910
/* @internal */ isAssigned?: boolean; // True if the symbol is a parameter with assignments
4911-
/* @internal */ assignmentDeclarationMembers?: ESMap<number, Declaration>; // detected late-bound assignment declarations associated with the symbol
4911+
/* @internal */ assignmentDeclarationMembers?: Set<Declaration>; // detected late-bound assignment declarations associated with the symbol
49124912
}
49134913

49144914
/* @internal */
@@ -5106,7 +5106,7 @@ namespace ts {
51065106
jsxNamespace?: Symbol | false; // Resolved jsx namespace symbol for this node
51075107
jsxImplicitImportContainer?: Symbol | false; // Resolved module symbol the implicit jsx import of this file should refer to
51085108
contextFreeType?: Type; // Cached context-free type used by the first pass of inference; used when a function's return is partially contextually sensitive
5109-
deferredNodes?: ESMap<NodeId, Node>; // Set of nodes whose checking has been deferred
5109+
deferredNodes?: Set<Node>; // Set of nodes whose checking has been deferred
51105110
capturedBlockScopeBindings?: Symbol[]; // Block-scoped bindings captured beneath this part of an IterationStatement
51115111
outerTypeParameters?: TypeParameter[]; // Outer type parameters of anonymous object type
51125112
isExhaustive?: boolean; // Is node an exhaustive switch statement

0 commit comments

Comments
 (0)