From 1a6c1595fe6645f4dda511465e41f781c3206d09 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Wed, 7 Sep 2022 13:52:55 +0200 Subject: [PATCH] Don't retry requests that have already been cancelled --- Cargo.lock | 14 +++++++------- crates/rust-analyzer/Cargo.toml | 2 +- crates/rust-analyzer/src/global_state.rs | 4 ++++ crates/rust-analyzer/src/main_loop.rs | 4 +++- lib/lsp-server/Cargo.toml | 10 +++++----- lib/lsp-server/src/msg.rs | 2 +- lib/lsp-server/src/req_queue.rs | 7 +++++++ 7 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 216cf51447..93b7f746e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -863,7 +863,7 @@ dependencies = [ [[package]] name = "lsp-server" -version = "0.6.0" +version = "0.7.0" dependencies = [ "crossbeam-channel", "log", @@ -1502,18 +1502,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.143" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.143" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" dependencies = [ "proc-macro2", "quote", @@ -1522,9 +1522,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.83" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" dependencies = [ "indexmap", "itoa", diff --git a/crates/rust-analyzer/Cargo.toml b/crates/rust-analyzer/Cargo.toml index 861753d6fb..71566d5de6 100644 --- a/crates/rust-analyzer/Cargo.toml +++ b/crates/rust-analyzer/Cargo.toml @@ -34,7 +34,7 @@ threadpool = "1.8.1" rayon = "1.5.3" num_cpus = "1.13.1" mimalloc = { version = "0.1.29", default-features = false, optional = true } -lsp-server = { version = "0.6.0", path = "../../lib/lsp-server" } +lsp-server = { version = "0.7.0", path = "../../lib/lsp-server" } tracing = "0.1.35" tracing-subscriber = { version = "0.3.14", default-features = false, features = [ "env-filter", diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index 55fa616d50..000ff88e45 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs @@ -354,6 +354,10 @@ impl GlobalState { } } + pub(crate) fn is_completed(&self, request: &lsp_server::Request) -> bool { + self.req_queue.incoming.is_completed(&request.id) + } + fn send(&mut self, message: lsp_server::Message) { self.sender.send(message).unwrap() } diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 3cfbc2e4e4..c64d557a11 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -425,7 +425,9 @@ impl GlobalState { fn handle_task(&mut self, prime_caches_progress: &mut Vec, task: Task) { match task { Task::Response(response) => self.respond(response), - Task::Retry(req) => self.on_request(req), + // Only retry requests that haven't been cancelled. Otherwise we do unnecessary work. + Task::Retry(req) if self.is_completed(&req) => self.on_request(req), + Task::Retry(_) => (), Task::Diagnostics(diagnostics_per_file) => { for (file_id, diagnostics) in diagnostics_per_file { self.diagnostics.set_native_diagnostics(file_id, diagnostics) diff --git a/lib/lsp-server/Cargo.toml b/lib/lsp-server/Cargo.toml index 204d120d07..b236b156cf 100644 --- a/lib/lsp-server/Cargo.toml +++ b/lib/lsp-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lsp-server" -version = "0.6.0" +version = "0.7.0" description = "Generic LSP server scaffold." license = "MIT OR Apache-2.0" repository = "https://github.com/rust-lang/rust-analyzer/tree/master/lib/lsp-server" @@ -8,9 +8,9 @@ edition = "2021" [dependencies] log = "0.4.17" -serde_json = "1.0.81" -serde = { version = "1.0.137", features = ["derive"] } -crossbeam-channel = "0.5.5" +serde_json = "1.0.85" +serde = { version = "1.0.144", features = ["derive"] } +crossbeam-channel = "0.5.6" [dev-dependencies] -lsp-types = "0.93.0" +lsp-types = "0.93.1" diff --git a/lib/lsp-server/src/msg.rs b/lib/lsp-server/src/msg.rs index ce00d37beb..b241561f9c 100644 --- a/lib/lsp-server/src/msg.rs +++ b/lib/lsp-server/src/msg.rs @@ -98,7 +98,7 @@ pub struct ResponseError { } #[derive(Clone, Copy, Debug)] -#[allow(unused)] +#[non_exhaustive] pub enum ErrorCode { // Defined by JSON RPC: ParseError = -32700, diff --git a/lib/lsp-server/src/req_queue.rs b/lib/lsp-server/src/req_queue.rs index 1f3d447153..e5f19be20b 100644 --- a/lib/lsp-server/src/req_queue.rs +++ b/lib/lsp-server/src/req_queue.rs @@ -35,6 +35,7 @@ impl Incoming { pub fn register(&mut self, id: RequestId, data: I) { self.pending.insert(id, data); } + pub fn cancel(&mut self, id: RequestId) -> Option { let _data = self.complete(id.clone())?; let error = ResponseError { @@ -44,9 +45,14 @@ impl Incoming { }; Some(Response { id, result: None, error: Some(error) }) } + pub fn complete(&mut self, id: RequestId) -> Option { self.pending.remove(&id) } + + pub fn is_completed(&self, id: &RequestId) -> bool { + !self.pending.contains_key(id) + } } impl Outgoing { @@ -56,6 +62,7 @@ impl Outgoing { self.next_id += 1; Request::new(id, method, params) } + pub fn complete(&mut self, id: RequestId) -> Option { self.pending.remove(&id) }