diff options
| author | Aleksey Kladov <aleksey.kladov@gmail.com> | 2021-04-12 16:09:21 +0300 |
|---|---|---|
| committer | Aleksey Kladov <aleksey.kladov@gmail.com> | 2021-04-12 16:19:36 +0300 |
| commit | 29d5f29932eae4dcae589f2769e6a0f26c5ee4b9 (patch) | |
| tree | 59dae2f1ee03ec35ab95f05ea4b5bb2506162652 | |
| parent | a526d0a4b78b29fec4c2e8d5608ceaeec128f794 (diff) | |
| download | rust-29d5f29932eae4dcae589f2769e6a0f26c5ee4b9.tar.gz rust-29d5f29932eae4dcae589f2769e6a0f26c5ee4b9.zip | |
fix: don't spam repeated error messages when `cargo check` fails
Conceptually, using a *message* here is wrong, because this is a "status", rather than "point in time" thing. But statuses are an LSP extension, while messages are stable. As a compromise, send message only for more critical `metadata` failures, and only once per state change.
| -rw-r--r-- | crates/rust-analyzer/src/reload.rs | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index d0cc1b61a15..e51532d880f 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs @@ -100,10 +100,6 @@ impl GlobalState { } } pub(crate) fn report_new_status_if_needed(&mut self) { - if !self.config.server_status_notification() { - return; - } - let mut status = lsp_ext::ServerStatusParams { health: lsp_ext::Health::Ok, quiescent: self.is_quiescent(), @@ -129,7 +125,14 @@ impl GlobalState { if self.last_reported_status.as_ref() != Some(&status) { self.last_reported_status = Some(status.clone()); - self.send_notification::<lsp_ext::ServerStatusNotification>(status); + + if let (lsp_ext::Health::Error, Some(message)) = (status.health, &status.message) { + self.show_message(lsp_types::MessageType::Error, message.clone()); + } + + if self.config.server_status_notification() { + self.send_notification::<lsp_ext::ServerStatusNotification>(status); + } } } @@ -225,7 +228,6 @@ impl GlobalState { if let Some(error_message) = self.fetch_workspace_error() { log::error!("failed to switch workspaces: {}", error_message); - self.show_message(lsp_types::MessageType::Error, error_message); if !self.workspaces.is_empty() { return; } @@ -233,7 +235,6 @@ impl GlobalState { if let Some(error_message) = self.build_data_error() { log::error!("failed to switch build data: {}", error_message); - self.show_message(lsp_types::MessageType::Error, error_message); } let workspaces = self |
