refactor(lsp): minor improvements to handling closed documents (#11518)

Ref #10897
This commit is contained in:
Kitson Kelly 2021-07-27 07:40:12 +10:00 committed by GitHub
parent 091a26104b
commit c6f4e41529
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 7 deletions

View File

@ -771,15 +771,21 @@ impl Inner {
async fn did_close(&mut self, params: DidCloseTextDocumentParams) {
let mark = self.performance.mark("did_close", Some(&params));
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(&params.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);
}

View File

@ -75,6 +75,9 @@ delete Object.prototype.__proto__;
/** @type {Map<string, ts.SourceFile>} */
const sourceFileCache = new Map();
/** @type {string[]=} */
let scriptFileNamesCache;
/** @type {Map<string, string>} */
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) {