Skip to content

Commit d6aa65d

Browse files
author
Andy Hanson
committed
Use unordered removal where possible
1 parent de6707e commit d6aa65d

7 files changed

Lines changed: 26 additions & 20 deletions

File tree

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5336,7 +5336,7 @@ namespace ts {
53365336
while (i > 0) {
53375337
i--;
53385338
if (isSubtypeOfAny(types[i], types)) {
5339-
removeItemAt(types, i);
5339+
removeItemAtPreservingOrder(types, i);
53405340
}
53415341
}
53425342
}

src/compiler/core.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,31 +1395,37 @@ namespace ts {
13951395
}
13961396

13971397
/** Remove an item from an array, moving everything to its right one space left. */
1398-
export function removeItemAt<T>(array: T[], index: number): void {
1398+
export function removeItemAtPreservingOrder<T>(array: T[], index: number): void {
13991399
// This seems to be faster than either `array.splice(i, 1)` or `array.copyWithin(i, i+ 1)`.
14001400
for (let i = index; i < array.length - 1; i++) {
14011401
array[i] = array[i + 1];
14021402
}
14031403
array.pop();
14041404
}
14051405

1406+
export function unorderedRemoveItemAt<T>(array: T[], index: number): void {
1407+
// Fill in the "hole" left at `index`.
1408+
array[index] = array[array.length - 1];
1409+
array.pop();
1410+
}
1411+
14061412
/** Remove the *first* occurrence of `item` from the array. */
1407-
export function removeItem<T>(item: T, array: T[]): void {
1408-
removeFirstItemWhere(array, element => element === item);
1413+
export function unorderedRemoveItem<T>(item: T, array: T[]): void {
1414+
unorderedRemoveFirstItemWhere(array, element => element === item);
14091415
}
14101416

14111417
/** Remove the *first* element satisfying `predicate`. */
1412-
export function removeFirstItemWhere<T>(array: T[], predicate: (element: T) => boolean): void {
1418+
export function unorderedRemoveFirstItemWhere<T>(array: T[], predicate: (element: T) => boolean): void {
14131419
for (let i = 0; i < array.length; i++) {
14141420
if (predicate(array[i])) {
1415-
removeItemAt(array, i);
1421+
unorderedRemoveItemAt(array, i);
14161422
break;
14171423
}
14181424
}
14191425
}
14201426

1421-
export function createGetCanonicalFileName(useCaseSensitivefileNames: boolean): (fileName: string) => string {
1422-
return useCaseSensitivefileNames
1427+
export function createGetCanonicalFileName(useCaseSensitiveFileNames: boolean): (fileName: string) => string {
1428+
return useCaseSensitiveFileNames
14231429
? ((fileName) => fileName)
14241430
: ((fileName) => fileName.toLowerCase());
14251431
}

src/compiler/sys.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ namespace ts {
285285
function removeFileWatcherCallback(filePath: string, callback: FileWatcherCallback) {
286286
const callbacks = fileWatcherCallbacks[filePath];
287287
if (callbacks) {
288-
removeItem(callback, callbacks);
288+
unorderedRemoveItem(callback, callbacks);
289289
if (callbacks.length === 0) {
290290
delete fileWatcherCallbacks[filePath];
291291
}

src/compiler/tsc.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ namespace ts {
490490
sourceFile.fileWatcher.close();
491491
sourceFile.fileWatcher = undefined;
492492
if (removed) {
493-
removeItem(sourceFile.fileName, rootFileNames);
493+
unorderedRemoveItem(sourceFile.fileName, rootFileNames);
494494
}
495495
startTimerForRecompilation();
496496
}

src/harness/harness.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1558,7 +1558,7 @@ namespace Harness {
15581558
tsConfig.options.configFilePath = data.name;
15591559

15601560
// delete entry from the list
1561-
ts.removeItemAt(testUnitData, i);
1561+
ts.removeItemAtPreservingOrder(testUnitData, i);
15621562

15631563
break;
15641564
}

src/harness/unittests/tsserverProjectSystem.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ namespace ts {
214214
referenceCount: 0,
215215
directoryName,
216216
close: () => {
217-
removeFirstItemWhere(callbacks, cb => cb.cb === callback);
217+
unorderedRemoveFirstItemWhere(callbacks, cb => cb.cb === callback);
218218
if (!callbacks.length) {
219219
delete this.watchedDirectories[path];
220220
}
@@ -248,7 +248,7 @@ namespace ts {
248248
callbacks.push(callback);
249249
return {
250250
close: () => {
251-
removeItem(callback, callbacks);
251+
unorderedRemoveItem(callback, callbacks);
252252
if (!callbacks.length) {
253253
delete this.watchedFiles[path];
254254
}
@@ -263,7 +263,7 @@ namespace ts {
263263
};
264264
readonly clearTimeout = (timeoutId: any): void => {
265265
if (typeof timeoutId === "number") {
266-
removeItemAt(this.callbackQueue, timeoutId);
266+
unorderedRemoveItemAt(this.callbackQueue, timeoutId);
267267
}
268268
};
269269

src/server/editorServices.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ namespace ts.server {
275275
removeRoot(info: ScriptInfo) {
276276
if (this.filenameToScript.contains(info.path)) {
277277
this.filenameToScript.remove(info.path);
278-
removeItem(info, this.roots);
278+
unorderedRemoveItem(info, this.roots);
279279
this.resolvedModuleNames.remove(info.path);
280280
this.resolvedTypeReferenceDirectives.remove(info.path);
281281
}
@@ -849,7 +849,7 @@ namespace ts.server {
849849
project.directoryWatcher.close();
850850
forEachValue(project.directoriesWatchedForWildcards, watcher => { watcher.close(); });
851851
delete project.directoriesWatchedForWildcards;
852-
removeItem(project, this.configuredProjects);
852+
unorderedRemoveItem(project, this.configuredProjects);
853853
}
854854
else {
855855
for (const directory of project.directoriesWatchedForTsconfig) {
@@ -861,7 +861,7 @@ namespace ts.server {
861861
delete project.projectService.directoryWatchersForTsconfig[directory];
862862
}
863863
}
864-
removeItem(project, this.inferredProjects);
864+
unorderedRemoveItem(project, this.inferredProjects);
865865
}
866866

867867
const fileNames = project.getFileNames();
@@ -986,7 +986,7 @@ namespace ts.server {
986986
}
987987
}
988988
else {
989-
removeItem(info, this.openFilesReferenced);
989+
unorderedRemoveItem(info, this.openFilesReferenced);
990990
}
991991
info.close();
992992
}
@@ -1496,13 +1496,13 @@ namespace ts.server {
14961496
// openFileRoots or openFileReferenced.
14971497
if (info.isOpen) {
14981498
if (this.openFileRoots.indexOf(info) >= 0) {
1499-
removeItem(info, this.openFileRoots);
1499+
unorderedRemoveItem(info, this.openFileRoots);
15001500
if (info.defaultProject && !info.defaultProject.isConfiguredProject()) {
15011501
this.removeProject(info.defaultProject);
15021502
}
15031503
}
15041504
if (this.openFilesReferenced.indexOf(info) >= 0) {
1505-
removeItem(info, this.openFilesReferenced);
1505+
unorderedRemoveItem(info, this.openFilesReferenced);
15061506
}
15071507
this.openFileRootsConfigured.push(info);
15081508
info.defaultProject = project;

0 commit comments

Comments
 (0)