about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAleksey Kladov <aleksey.kladov@gmail.com>2021-04-12 16:09:21 +0300
committerAleksey Kladov <aleksey.kladov@gmail.com>2021-04-12 16:19:36 +0300
commit29d5f29932eae4dcae589f2769e6a0f26c5ee4b9 (patch)
tree59dae2f1ee03ec35ab95f05ea4b5bb2506162652
parenta526d0a4b78b29fec4c2e8d5608ceaeec128f794 (diff)
downloadrust-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.rs15
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