diff --git a/packages/language-service/src/typescript_host.ts b/packages/language-service/src/typescript_host.ts index cd11ab54b3..aa613432dc 100644 --- a/packages/language-service/src/typescript_host.ts +++ b/packages/language-service/src/typescript_host.ts @@ -275,12 +275,14 @@ export class TypeScriptServiceHost implements LanguageServiceHost { // Invalidate file that have changed in the static symbol resolver const seen = new Set(); + let hasChanges = false; for (const sourceFile of program.getSourceFiles()) { const fileName = sourceFile.fileName; seen.add(fileName); const version = this.tsLsHost.getScriptVersion(fileName); const lastVersion = this.fileVersions.get(fileName); if (version !== lastVersion) { + hasChanges = true; this.fileVersions.set(fileName, version); this.staticSymbolResolver.invalidateFile(fileName); } @@ -295,7 +297,7 @@ export class TypeScriptServiceHost implements LanguageServiceHost { this.lastProgram = program; - return false; + return missing.length === 0 && !hasChanges; } /** diff --git a/packages/language-service/test/typescript_host_spec.ts b/packages/language-service/test/typescript_host_spec.ts index c458256640..b130c8938b 100644 --- a/packages/language-service/test/typescript_host_spec.ts +++ b/packages/language-service/test/typescript_host_spec.ts @@ -148,4 +148,14 @@ describe('TypeScriptServiceHost', () => { expect(newModules.ngModuleByPipeOrDirective.has(helloComp)).toBe(true); expect(newModules.ngModuleByPipeOrDirective.has(appComp)).toBe(false); }); + + it('should not clear caches when external template changes', () => { + const tsLSHost = new MockTypescriptHost(['/app/main.ts'], toh); + const tsLS = ts.createLanguageService(tsLSHost); + const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); + const oldModules = ngLSHost.getAnalyzedModules(); + tsLSHost.override('/app/test.ng', '
'); + const newModules = ngLSHost.getAnalyzedModules(); + expect(newModules).toBe(oldModules); + }); });