From 5a90713f4e1b8557e3ad8111a42676463b6dca19 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 17 Jul 2017 13:35:33 -0700 Subject: [PATCH 1/2] Deduplicate unresolvedImports --- src/compiler/core.ts | 8 ++++---- src/server/project.ts | 4 ++-- src/server/utilities.ts | 6 ++++++ src/services/jsTyping.ts | 8 ++++---- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 6da3a5b77aa68..4620dddf21f21 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -373,11 +373,11 @@ namespace ts { return false; } - export function filterMutate(array: T[], f: (x: T) => boolean): void { + export function filterMutate(array: T[], f: (x: T, i: number) => boolean): void { let outIndex = 0; - for (const item of array) { - if (f(item)) { - array[outIndex] = item; + for (let i = 0; i < array.length; i++) { + if (f(array[i], i)) { + array[outIndex] = array[i]; outIndex++; } } diff --git a/src/server/project.ts b/src/server/project.ts index 3b09fc48e8519..91175ea5370fe 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -494,7 +494,7 @@ namespace ts.server { this.projectStateVersion++; } - private extractUnresolvedImportsFromSourceFile(file: SourceFile, result: string[]) { + private extractUnresolvedImportsFromSourceFile(file: SourceFile, result: Push) { const cached = this.cachedUnresolvedImportsPerFile.get(file.path); if (cached) { // found cached result - use it and return @@ -554,7 +554,7 @@ namespace ts.server { for (const sourceFile of this.program.getSourceFiles()) { this.extractUnresolvedImportsFromSourceFile(sourceFile, result); } - this.lastCachedUnresolvedImportsList = toSortedArray(result); + this.lastCachedUnresolvedImportsList = toDeduplicatedSortedArray(result); } unresolvedImports = this.lastCachedUnresolvedImportsList; diff --git a/src/server/utilities.ts b/src/server/utilities.ts index 30146c0a92809..a931fad6716c7 100644 --- a/src/server/utilities.ts +++ b/src/server/utilities.ts @@ -201,6 +201,12 @@ namespace ts.server { return arr as SortedArray; } + export function toDeduplicatedSortedArray(arr: string[]): SortedArray { + arr.sort(); + filterMutate(arr, (em, i) => em !== arr[i - 1]); + return arr as SortedArray; + } + export function enumerateInsertsAndDeletes(newItems: SortedReadonlyArray, oldItems: SortedReadonlyArray, inserted: (newItem: T) => void, deleted: (oldItem: T) => void, compare?: Comparer) { compare = compare || compareValues; let newIndex = 0; diff --git a/src/services/jsTyping.ts b/src/services/jsTyping.ts index f31276b6498de..24a4a51da8e84 100644 --- a/src/services/jsTyping.ts +++ b/src/services/jsTyping.ts @@ -38,7 +38,7 @@ namespace ts.JsTyping { "crypto", "stream", "util", "assert", "tty", "domain", "constants", "process", "v8", "timers", "console"]; - const nodeCoreModules = arrayToMap(nodeCoreModuleList, x => x); + const nodeCoreModules = arrayToSet(nodeCoreModuleList); /** * @param host is the object providing I/O related operations. @@ -108,9 +108,9 @@ namespace ts.JsTyping { // add typings for unresolved imports if (unresolvedImports) { - const x = unresolvedImports.map(moduleId => nodeCoreModules.has(moduleId) ? "node" : moduleId); - if (x.length && log) log(`Inferred typings from unresolved imports: ${JSON.stringify(x)}`); - for (const typingName of x) { + const module = unresolvedImports.map(moduleId => nodeCoreModules.has(moduleId) ? "node" : moduleId); + if (module.length && log) log(`Inferred typings from unresolved imports: ${JSON.stringify(module)}`); + for (const typingName of module) { if (!inferredTypings.has(typingName)) { inferredTypings.set(typingName, undefined); } From 2c6a3e968758c201d0664920d4d8b78a65bdec85 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 8 Aug 2017 07:16:45 -0700 Subject: [PATCH 2/2] Add `isNonDuplicateInSortedArray` helper --- src/compiler/core.ts | 4 ++-- src/server/utilities.ts | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 4620dddf21f21..4e34c8bbb0277 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -373,10 +373,10 @@ namespace ts { return false; } - export function filterMutate(array: T[], f: (x: T, i: number) => boolean): void { + export function filterMutate(array: T[], f: (x: T, i: number, array: T[]) => boolean): void { let outIndex = 0; for (let i = 0; i < array.length; i++) { - if (f(array[i], i)) { + if (f(array[i], i, array)) { array[outIndex] = array[i]; outIndex++; } diff --git a/src/server/utilities.ts b/src/server/utilities.ts index a931fad6716c7..fb85c3a6dc52a 100644 --- a/src/server/utilities.ts +++ b/src/server/utilities.ts @@ -203,9 +203,12 @@ namespace ts.server { export function toDeduplicatedSortedArray(arr: string[]): SortedArray { arr.sort(); - filterMutate(arr, (em, i) => em !== arr[i - 1]); + filterMutate(arr, isNonDuplicateInSortedArray); return arr as SortedArray; } + function isNonDuplicateInSortedArray(value: T, index: number, array: T[]) { + return index === 0 || value !== array[index - 1]; + } export function enumerateInsertsAndDeletes(newItems: SortedReadonlyArray, oldItems: SortedReadonlyArray, inserted: (newItem: T) => void, deleted: (oldItem: T) => void, compare?: Comparer) { compare = compare || compareValues;