diff --git a/packages/language-service/src/typescript_host.ts b/packages/language-service/src/typescript_host.ts index 25a3f2e318..e646c97268 100644 --- a/packages/language-service/src/typescript_host.ts +++ b/packages/language-service/src/typescript_host.ts @@ -191,6 +191,44 @@ export class TypeScriptServiceHost implements LanguageServiceHost { return this.analyzedModules; } + /** + * Checks whether the program has changed, and invalidate caches if it has. + * Returns true if modules are up-to-date, false otherwise. + * This should only be called by getAnalyzedModules(). + */ + private upToDate(): boolean { + const {lastProgram, program} = this; + if (lastProgram === program) { + return true; + } + this.lastProgram = program; + + // Invalidate file that have changed in the static symbol resolver + const seen = new Set(); + 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); + this.fileVersions.set(fileName, version); + // Should not invalidate file on the first encounter or if file hasn't changed + if (lastVersion !== undefined && version !== lastVersion) { + const symbols = this.staticSymbolResolver.invalidateFile(fileName); + this.reflector.invalidateSymbols(symbols); + } + } + + // Remove file versions that are no longer in the program and invalidate them. + const missing = Array.from(this.fileVersions.keys()).filter(f => !seen.has(f)); + missing.forEach(f => { + this.fileVersions.delete(f); + const symbols = this.staticSymbolResolver.invalidateFile(f); + this.reflector.invalidateSymbols(symbols); + }); + + return false; + } + /** * Find all templates in the specified `file`. * @param fileName TS or HTML file @@ -282,44 +320,6 @@ export class TypeScriptServiceHost implements LanguageServiceHost { return program; } - /** - * Checks whether the program has changed, and invalidate caches if it has. - * Returns true if modules are up-to-date, false otherwise. - * This should only be called by getAnalyzedModules(). - */ - private upToDate(): boolean { - const {lastProgram, program} = this; - if (lastProgram === program) { - return true; - } - this.lastProgram = program; - - // Invalidate file that have changed in the static symbol resolver - const seen = new Set(); - 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); - this.fileVersions.set(fileName, version); - // Should not invalidate file on the first encounter or if file hasn't changed - if (lastVersion !== undefined && version !== lastVersion) { - const symbols = this.staticSymbolResolver.invalidateFile(fileName); - this.reflector.invalidateSymbols(symbols); - } - } - - // Remove file versions that are no longer in the program and invalidate them. - const missing = Array.from(this.fileVersions.keys()).filter(f => !seen.has(f)); - missing.forEach(f => { - this.fileVersions.delete(f); - const symbols = this.staticSymbolResolver.invalidateFile(f); - this.reflector.invalidateSymbols(symbols); - }); - - return false; - } - /** * Return the TemplateSource if `node` is a template node. *