Skip to content

Commit 17578e8

Browse files
author
Andy
authored
Use Map<true> for sets (#16972)
1 parent 2d802a6 commit 17578e8

File tree

9 files changed

+38
-35
lines changed

9 files changed

+38
-35
lines changed

src/compiler/binder.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,9 @@ namespace ts {
132132
let inStrictMode: boolean;
133133

134134
let symbolCount = 0;
135+
135136
let Symbol: { new (flags: SymbolFlags, name: __String): Symbol };
136-
let classifiableNames: UnderscoreEscapedMap<__String>;
137+
let classifiableNames: UnderscoreEscapedMap<true>;
137138

138139
const unreachableFlow: FlowNode = { flags: FlowFlags.Unreachable };
139140
const reportedUnreachableFlow: FlowNode = { flags: FlowFlags.Unreachable };
@@ -147,7 +148,7 @@ namespace ts {
147148
options = opts;
148149
languageVersion = getEmitScriptTarget(options);
149150
inStrictMode = bindInStrictMode(file, opts);
150-
classifiableNames = createUnderscoreEscapedMap<__String>();
151+
classifiableNames = createUnderscoreEscapedMap<true>();
151152
symbolCount = 0;
152153
skipTransformFlagAggregation = file.isDeclarationFile;
153154

@@ -349,7 +350,7 @@ namespace ts {
349350
}
350351

351352
if (name && (includes & SymbolFlags.Classifiable)) {
352-
classifiableNames.set(name, name);
353+
classifiableNames.set(name, true);
353354
}
354355

355356
if (symbol.flags & excludes) {
@@ -2445,7 +2446,7 @@ namespace ts {
24452446
bindAnonymousDeclaration(node, SymbolFlags.Class, bindingName);
24462447
// Add name of class expression into the map for semantic classifier
24472448
if (node.name) {
2448-
classifiableNames.set(node.name.text, node.name.text);
2449+
classifiableNames.set(node.name.text, true);
24492450
}
24502451
}
24512452

src/compiler/core.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1117,8 +1117,10 @@ namespace ts {
11171117
*
11181118
* @param array the array of input elements.
11191119
*/
1120-
export function arrayToSet<T>(array: T[], makeKey: (value: T) => string): Map<true> {
1121-
return arrayToMap<T, true>(array, makeKey, () => true);
1120+
export function arrayToSet(array: string[]): Map<true>;
1121+
export function arrayToSet<T>(array: T[], makeKey: (value: T) => string): Map<true>;
1122+
export function arrayToSet(array: any[], makeKey?: (value: any) => string): Map<true> {
1123+
return arrayToMap<any, true>(array, makeKey || (s => s), () => true);
11221124
}
11231125

11241126
export function cloneMap(map: SymbolTable): SymbolTable;

src/compiler/emitter.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ namespace ts {
281281
let currentSourceFile: SourceFile | undefined;
282282
let nodeIdToGeneratedName: string[]; // Map of generated names for specific nodes.
283283
let autoGeneratedIdToGeneratedName: string[]; // Map of generated names for temp and loop variables.
284-
let generatedNames: Map<string>; // Set of names generated by the NameGenerator.
284+
let generatedNames: Map<true>; // Set of names generated by the NameGenerator.
285285
let tempFlagsStack: TempFlags[]; // Stack of enclosing name generation scopes.
286286
let tempFlags: TempFlags; // TempFlags for the current name generation scope.
287287
let writer: EmitTextWriter;
@@ -399,7 +399,7 @@ namespace ts {
399399
function reset() {
400400
nodeIdToGeneratedName = [];
401401
autoGeneratedIdToGeneratedName = [];
402-
generatedNames = createMap<string>();
402+
generatedNames = createMap<true>();
403403
tempFlagsStack = [];
404404
tempFlags = TempFlags.Auto;
405405
comments.reset();
@@ -2228,7 +2228,7 @@ namespace ts {
22282228
* Emits any prologue directives at the start of a Statement list, returning the
22292229
* number of prologue directives written to the output.
22302230
*/
2231-
function emitPrologueDirectives(statements: Node[], startWithNewLine?: boolean, seenPrologueDirectives?: Map<String>): number {
2231+
function emitPrologueDirectives(statements: Node[], startWithNewLine?: boolean, seenPrologueDirectives?: Map<true>): number {
22322232
for (let i = 0; i < statements.length; i++) {
22332233
const statement = statements[i];
22342234
if (isPrologueDirective(statement)) {
@@ -2239,7 +2239,7 @@ namespace ts {
22392239
}
22402240
emit(statement);
22412241
if (seenPrologueDirectives) {
2242-
seenPrologueDirectives.set(statement.expression.text, statement.expression.text);
2242+
seenPrologueDirectives.set(statement.expression.text, true);
22432243
}
22442244
}
22452245
}
@@ -2258,7 +2258,7 @@ namespace ts {
22582258
emitPrologueDirectives((sourceFileOrBundle as SourceFile).statements);
22592259
}
22602260
else {
2261-
const seenPrologueDirectives = createMap<String>();
2261+
const seenPrologueDirectives = createMap<true>();
22622262
for (const sourceFile of (sourceFileOrBundle as Bundle).sourceFiles) {
22632263
setSourceFile(sourceFile);
22642264
emitPrologueDirectives(sourceFile.statements, /*startWithNewLine*/ true, seenPrologueDirectives);
@@ -2896,7 +2896,7 @@ namespace ts {
28962896
while (true) {
28972897
const generatedName = baseName + i;
28982898
if (isUniqueName(generatedName)) {
2899-
generatedNames.set(generatedName, generatedName);
2899+
generatedNames.set(generatedName, true);
29002900
return generatedName;
29012901
}
29022902
i++;

src/compiler/program.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ namespace ts {
405405
let commonSourceDirectory: string;
406406
let diagnosticsProducingTypeChecker: TypeChecker;
407407
let noDiagnosticsTypeChecker: TypeChecker;
408-
let classifiableNames: UnderscoreEscapedMap<__String>;
408+
let classifiableNames: UnderscoreEscapedMap<true>;
409409
let modifiedFilePaths: Path[] | undefined;
410410

411411
const cachedSemanticDiagnosticsForFile: DiagnosticCache = {};
@@ -580,7 +580,7 @@ namespace ts {
580580
if (!classifiableNames) {
581581
// Initialize a checker so that all our files are bound.
582582
getTypeChecker();
583-
classifiableNames = createUnderscoreEscapedMap<__String>();
583+
classifiableNames = createUnderscoreEscapedMap<true>();
584584

585585
for (const sourceFile of files) {
586586
copyEntries(sourceFile.classifiableNames, classifiableNames);

src/compiler/transformers/es2015.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ namespace ts {
7070
* set of labels that occurred inside the converted loop
7171
* used to determine if labeled jump can be emitted as is or it should be dispatched to calling code
7272
*/
73-
labels?: Map<string>;
73+
labels?: Map<boolean>;
7474
/*
7575
* collection of labeled jumps that transfer control outside the converted loop.
7676
* maps store association 'label -> labelMarker' where
@@ -2236,16 +2236,16 @@ namespace ts {
22362236
}
22372237

22382238
function recordLabel(node: LabeledStatement) {
2239-
convertedLoopState.labels.set(unescapeLeadingUnderscores(node.label.text), unescapeLeadingUnderscores(node.label.text));
2239+
convertedLoopState.labels.set(unescapeLeadingUnderscores(node.label.text), true);
22402240
}
22412241

22422242
function resetLabel(node: LabeledStatement) {
2243-
convertedLoopState.labels.set(unescapeLeadingUnderscores(node.label.text), undefined);
2243+
convertedLoopState.labels.set(unescapeLeadingUnderscores(node.label.text), false);
22442244
}
22452245

22462246
function visitLabeledStatement(node: LabeledStatement): VisitResult<Statement> {
22472247
if (convertedLoopState && !convertedLoopState.labels) {
2248-
convertedLoopState.labels = createMap<string>();
2248+
convertedLoopState.labels = createMap<boolean>();
22492249
}
22502250
const statement = unwrapInnermostStatementOfLabel(node, convertedLoopState && recordLabel);
22512251
return isIterationStatement(statement, /*lookInLabeledStatements*/ false)

src/compiler/types.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2363,7 +2363,7 @@ namespace ts {
23632363
// The first node that causes this file to be a CommonJS module
23642364
/* @internal */ commonJsModuleIndicator: Node;
23652365

2366-
/* @internal */ identifiers: Map<string>;
2366+
/* @internal */ identifiers: Map<string>; // Map from a string to an interned string
23672367
/* @internal */ nodeCount: number;
23682368
/* @internal */ identifierCount: number;
23692369
/* @internal */ symbolCount: number;
@@ -2384,7 +2384,7 @@ namespace ts {
23842384
// Stores a line map for the file.
23852385
// This field should never be used directly to obtain line map, use getLineMap function instead.
23862386
/* @internal */ lineMap: number[];
2387-
/* @internal */ classifiableNames?: UnderscoreEscapedMap<__String>;
2387+
/* @internal */ classifiableNames?: UnderscoreEscapedMap<true>;
23882388
// Stores a mapping 'external module reference text' -> 'resolved file name' | undefined
23892389
// It is used to resolve module names in the checker.
23902390
// Content of this field should never be used directly - use getResolvedModuleFileName/setResolvedModuleFileName functions instead
@@ -2490,7 +2490,7 @@ namespace ts {
24902490
/* @internal */ getDiagnosticsProducingTypeChecker(): TypeChecker;
24912491
/* @internal */ dropDiagnosticsProducingTypeChecker(): void;
24922492

2493-
/* @internal */ getClassifiableNames(): UnderscoreEscapedMap<__String>;
2493+
/* @internal */ getClassifiableNames(): UnderscoreEscapedMap<true>;
24942494

24952495
/* @internal */ getNodeCount(): number;
24962496
/* @internal */ getIdentifierCount(): number;

src/server/project.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,11 @@ namespace ts.server {
123123
/**
124124
* Set of files names that were updated since the last call to getChangesSinceVersion.
125125
*/
126-
private updatedFileNames: Map<string>;
126+
private updatedFileNames: Map<true>;
127127
/**
128128
* Set of files that was returned from the last call to getChangesSinceVersion.
129129
*/
130-
private lastReportedFileNames: Map<string>;
130+
private lastReportedFileNames: Map<true>;
131131
/**
132132
* Last version that was reported.
133133
*/
@@ -487,7 +487,7 @@ namespace ts.server {
487487
}
488488

489489
registerFileUpdate(fileName: string) {
490-
(this.updatedFileNames || (this.updatedFileNames = createMap<string>())).set(fileName, fileName);
490+
(this.updatedFileNames || (this.updatedFileNames = createMap<true>())).set(fileName, true);
491491
}
492492

493493
markAsDirty() {
@@ -611,7 +611,7 @@ namespace ts.server {
611611
}
612612

613613
const missingFilePaths = this.program.getMissingFilePaths();
614-
const missingFilePathsSet = arrayToSet(missingFilePaths, p => p);
614+
const missingFilePathsSet = arrayToSet(missingFilePaths);
615615

616616
// Files that are no longer missing (e.g. because they are no longer required)
617617
// should no longer be watched.
@@ -742,7 +742,7 @@ namespace ts.server {
742742
}
743743
// compute and return the difference
744744
const lastReportedFileNames = this.lastReportedFileNames;
745-
const currentFiles = arrayToMap(this.getFileNames(), x => x);
745+
const currentFiles = arrayToSet(this.getFileNames());
746746

747747
const added: string[] = [];
748748
const removed: string[] = [];
@@ -765,7 +765,7 @@ namespace ts.server {
765765
else {
766766
// unknown version - return everything
767767
const projectFileNames = this.getFileNames();
768-
this.lastReportedFileNames = arrayToMap(projectFileNames, x => x);
768+
this.lastReportedFileNames = arrayToSet(projectFileNames);
769769
this.lastReportedVersion = this.projectStructureVersion;
770770
return { info, files: projectFileNames, projectErrors: this.getGlobalProjectErrors() };
771771
}

src/services/classifier.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ namespace ts {
462462
}
463463

464464
/* @internal */
465-
export function getSemanticClassifications(typeChecker: TypeChecker, cancellationToken: CancellationToken, sourceFile: SourceFile, classifiableNames: UnderscoreEscapedMap<__String>, span: TextSpan): ClassifiedSpan[] {
465+
export function getSemanticClassifications(typeChecker: TypeChecker, cancellationToken: CancellationToken, sourceFile: SourceFile, classifiableNames: UnderscoreEscapedMap<true>, span: TextSpan): ClassifiedSpan[] {
466466
return convertClassifications(getEncodedSemanticClassifications(typeChecker, cancellationToken, sourceFile, classifiableNames, span));
467467
}
468468

@@ -487,7 +487,7 @@ namespace ts {
487487
}
488488

489489
/* @internal */
490-
export function getEncodedSemanticClassifications(typeChecker: TypeChecker, cancellationToken: CancellationToken, sourceFile: SourceFile, classifiableNames: UnderscoreEscapedMap<__String>, span: TextSpan): Classifications {
490+
export function getEncodedSemanticClassifications(typeChecker: TypeChecker, cancellationToken: CancellationToken, sourceFile: SourceFile, classifiableNames: UnderscoreEscapedMap<true>, span: TextSpan): Classifications {
491491
const result: number[] = [];
492492
processNode(sourceFile);
493493

@@ -557,7 +557,7 @@ namespace ts {
557557
// Only bother calling into the typechecker if this is an identifier that
558558
// could possibly resolve to a type name. This makes classification run
559559
// in a third of the time it would normally take.
560-
if (classifiableNames.get(identifier.text)) {
560+
if (classifiableNames.has(identifier.text)) {
561561
const symbol = typeChecker.getSymbolAtLocation(node);
562562
if (symbol) {
563563
const type = classifySymbol(symbol, getMeaningFromLocation(node));

src/services/completions.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ namespace ts.Completions {
7979
return { isGlobalCompletion, isMemberCompletion, isNewIdentifierLocation, entries };
8080
}
8181

82-
function getJavaScriptCompletionEntries(sourceFile: SourceFile, position: number, uniqueNames: Map<string>, target: ScriptTarget): CompletionEntry[] {
82+
function getJavaScriptCompletionEntries(sourceFile: SourceFile, position: number, uniqueNames: Map<true>, target: ScriptTarget): CompletionEntry[] {
8383
const entries: CompletionEntry[] = [];
8484

8585
const nameTable = getNameTable(sourceFile);
@@ -91,7 +91,7 @@ namespace ts.Completions {
9191
const realName = unescapeLeadingUnderscores(name);
9292

9393
if (!uniqueNames.get(realName)) {
94-
uniqueNames.set(realName, realName);
94+
uniqueNames.set(realName, true);
9595
const displayName = getCompletionEntryDisplayName(realName, target, /*performCharacterChecks*/ true);
9696
if (displayName) {
9797
const entry = {
@@ -133,17 +133,17 @@ namespace ts.Completions {
133133
};
134134
}
135135

136-
function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: Push<CompletionEntry>, location: Node, performCharacterChecks: boolean, typeChecker: TypeChecker, target: ScriptTarget, log: Log): Map<string> {
136+
function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: Push<CompletionEntry>, location: Node, performCharacterChecks: boolean, typeChecker: TypeChecker, target: ScriptTarget, log: Log): Map<true> {
137137
const start = timestamp();
138-
const uniqueNames = createMap<string>();
138+
const uniqueNames = createMap<true>();
139139
if (symbols) {
140140
for (const symbol of symbols) {
141141
const entry = createCompletionEntry(symbol, location, performCharacterChecks, typeChecker, target);
142142
if (entry) {
143143
const id = entry.name;
144144
if (!uniqueNames.get(id)) {
145145
entries.push(entry);
146-
uniqueNames.set(id, id);
146+
uniqueNames.set(id, true);
147147
}
148148
}
149149
}

0 commit comments

Comments
 (0)