Skip to content

Commit 5da07c5

Browse files
committed
perf: only clear cache when project file set changes
1 parent e836166 commit 5da07c5

1 file changed

Lines changed: 25 additions & 2 deletions

File tree

packages/typescript/lib/node/decorateLanguageServiceHost.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export function decorateLanguageServiceHost(
2525
const resolveModuleNames = languageServiceHost.resolveModuleNames?.bind(languageServiceHost);
2626
const getScriptSnapshot = languageServiceHost.getScriptSnapshot.bind(languageServiceHost);
2727
const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
28+
const getScriptFileNames = languageServiceHost.getScriptFileNames?.bind(languageServiceHost);
2829

2930
// path completion
3031
if (readDirectory) {
@@ -58,12 +59,34 @@ export function decorateLanguageServiceHost(
5859
);
5960

6061
let moduleResolutionProjectVersion: string | undefined;
62+
let moduleResolutionProjectFileNames: Set<string> | undefined;
6163
const tryClearModuleResolutionCache = () => {
6264
const projectVersion = languageServiceHost.getProjectVersion?.();
63-
if (projectVersion === undefined || projectVersion !== moduleResolutionProjectVersion) {
65+
const scriptFileNames = getScriptFileNames?.();
66+
const canonicalScriptFileNames = scriptFileNames?.map(getCanonicalFileName);
67+
const filesUnchanged = Boolean(
68+
canonicalScriptFileNames
69+
&& moduleResolutionProjectFileNames
70+
&& canonicalScriptFileNames.length === moduleResolutionProjectFileNames.size
71+
&& canonicalScriptFileNames.every(name => moduleResolutionProjectFileNames?.has(name)),
72+
);
73+
74+
if (projectVersion === moduleResolutionProjectVersion && (!scriptFileNames || filesUnchanged)) {
75+
return;
76+
}
77+
78+
moduleResolutionProjectVersion = projectVersion;
79+
80+
if (!scriptFileNames) {
81+
moduleResolutionProjectFileNames = undefined;
82+
moduleResolutionCache.clear();
83+
return;
84+
}
85+
86+
if (!filesUnchanged) {
6487
moduleResolutionCache.clear();
65-
moduleResolutionProjectVersion = projectVersion;
6688
}
89+
moduleResolutionProjectFileNames = new Set(canonicalScriptFileNames ?? []);
6790
};
6891

6992
if (resolveModuleNameLiterals) {

0 commit comments

Comments
 (0)