Skip to content

Commit 1b1ca9e

Browse files
author
Andy
authored
Memoize collecting set of all imported packages (#26263)
1 parent c3eb8e8 commit 1b1ca9e

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

src/compiler/checker.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ namespace ts {
3131
}
3232

3333
export function createTypeChecker(host: TypeCheckerHost, produceDiagnostics: boolean): TypeChecker {
34+
const getPackagesSet: () => Map<true> = memoize(() => {
35+
const set = createMap<true>();
36+
host.getSourceFiles().forEach(sf => {
37+
if (!sf.resolvedModules) return;
38+
39+
forEachEntry(sf.resolvedModules, r => {
40+
if (r && r.packageId) set.set(r.packageId.name, true);
41+
});
42+
});
43+
return set;
44+
});
45+
3446
// Cancellation that controls whether or not we can cancel in the middle of type checking.
3547
// In general cancelling is *not* safe for the type checker. We might be in the middle of
3648
// computing something, and we will leave our internals in an inconsistent state. Callers
@@ -2265,8 +2277,7 @@ namespace ts {
22652277
resolvedFileName));
22662278
}
22672279
function typesPackageExists(packageName: string): boolean {
2268-
return host.getSourceFiles().some(sf => !!sf.resolvedModules && !!forEachEntry(sf.resolvedModules, r =>
2269-
r && r.packageId && r.packageId.name === getTypesPackageName(packageName)));
2280+
return getPackagesSet().has(getTypesPackageName(packageName));
22702281
}
22712282

22722283
// An external module with an 'export =' declaration resolves to the target of the 'export =' declaration,

0 commit comments

Comments
 (0)