diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 25b588ae6b..27d6e42044 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -771,15 +771,21 @@ impl Inner { async fn did_close(&mut self, params: DidCloseTextDocumentParams) { let mark = self.performance.mark("did_close", Some(¶ms)); if params.text_document.uri.scheme() == "deno" { - // we can ignore virtual text documents opening, as they don't need to + // we can ignore virtual text documents closing, as they don't need to // be tracked in memory, as they are static assets that won't change // already managed by the language service return; } let specifier = self.url_map.normalize_url(¶ms.text_document.uri); - self.documents.close(&specifier); + let is_diagnosable = self.documents.is_diagnosable(&specifier); - if self.documents.is_diagnosable(&specifier) { + if is_diagnosable { + let mut specifiers = self.documents.dependents(&specifier); + specifiers.push(specifier.clone()); + self.diagnostics_server.invalidate(specifiers).await; + } + self.documents.close(&specifier); + if is_diagnosable { if let Err(err) = self.diagnostics_server.update() { error!("{}", err); } diff --git a/cli/tsc/99_main_compiler.js b/cli/tsc/99_main_compiler.js index a2f3af176d..f5cfe38dd7 100644 --- a/cli/tsc/99_main_compiler.js +++ b/cli/tsc/99_main_compiler.js @@ -75,6 +75,9 @@ delete Object.prototype.__proto__; /** @type {Map} */ const sourceFileCache = new Map(); + /** @type {string[]=} */ + let scriptFileNamesCache; + /** @type {Map} */ const scriptVersionCache = new Map(); @@ -370,7 +373,12 @@ delete Object.prototype.__proto__; }, getScriptFileNames() { debug("host.getScriptFileNames()"); - return core.opSync("op_script_names", undefined); + // tsc requests the script file names multiple times even though it can't + // possibly have changed, so we will memoize it on a per request basis. + if (scriptFileNamesCache) { + return scriptFileNamesCache; + } + return scriptFileNamesCache = core.opSync("op_script_names", undefined); }, getScriptVersion(specifier) { debug(`host.getScriptVersion("${specifier}")`); @@ -378,9 +386,8 @@ delete Object.prototype.__proto__; if (sourceFile) { return sourceFile.version ?? "1"; } - // tsc neurotically requests the script version multiple times even though - // it can't possibly have changed, so we will memoize it on a per request - // basis. + // tsc requests the script version multiple times even though it can't + // possibly have changed, so we will memoize it on a per request basis. if (scriptVersionCache.has(specifier)) { return scriptVersionCache.get(specifier); } @@ -543,6 +550,8 @@ delete Object.prototype.__proto__; */ function serverRequest({ id, ...request }) { debug(`serverRequest()`, { id, ...request }); + // reset all memoized source files names + scriptFileNamesCache = undefined; // evict all memoized source file versions scriptVersionCache.clear(); switch (request.method) {