From 7a7baf94d2af7053bcfa0e8ac510e8c679697eb0 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 7 Aug 2018 09:06:28 -0700 Subject: [PATCH] Memoize collecting set of all imported packages --- src/compiler/checker.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2b93a80b3b1da..a0fde718219bd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -31,6 +31,18 @@ namespace ts { } export function createTypeChecker(host: TypeCheckerHost, produceDiagnostics: boolean): TypeChecker { + const getPackagesSet: () => Map = memoize(() => { + const set = createMap(); + host.getSourceFiles().forEach(sf => { + if (!sf.resolvedModules) return; + + forEachEntry(sf.resolvedModules, r => { + if (r && r.packageId) set.set(r.packageId.name, true); + }); + }); + return set; + }); + // Cancellation that controls whether or not we can cancel in the middle of type checking. // In general cancelling is *not* safe for the type checker. We might be in the middle of // computing something, and we will leave our internals in an inconsistent state. Callers @@ -2259,8 +2271,7 @@ namespace ts { resolvedFileName)); } function typesPackageExists(packageName: string): boolean { - return host.getSourceFiles().some(sf => !!sf.resolvedModules && !!forEachEntry(sf.resolvedModules, r => - r && r.packageId && r.packageId.name === getTypesPackageName(packageName))); + return getPackagesSet().has(getTypesPackageName(packageName)); } // An external module with an 'export =' declaration resolves to the target of the 'export =' declaration,