From 8e2660b5cc86266f90926aefe1470f48c801f8bc Mon Sep 17 00:00:00 2001 From: Poliorcetics Date: Tue, 23 May 2023 12:33:01 +0200 Subject: [PATCH] Update diagnostics correctly on LSP exit (#7111) * chore: avoid format! call with argument when useless * feat: also clear diagnostics for unopened documents when exiting an LSP * feat: we already worked on `self.editor.diagnostics` no need to redo the checks --- helix-term/src/application.rs | 26 +++++++++++--------------- helix-term/src/ui/statusline.rs | 2 +- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 40c6d8c6d..0ea314133 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -964,22 +964,18 @@ macro_rules! language_server { Notification::Exit => { self.editor.set_status("Language server exited"); - // Clear any diagnostics for documents with this server open. - let urls: Vec<_> = self - .editor - .documents_mut() - .filter_map(|doc| { - if doc.supports_language_server(server_id) { - doc.clear_diagnostics(server_id); - doc.url() - } else { - None - } - }) - .collect(); + // LSPs may produce diagnostics for files that haven't been opened in helix, + // we need to clear those and remove the entries from the list if this leads to + // an empty diagnostic list for said files + for diags in self.editor.diagnostics.values_mut() { + diags.retain(|(_, lsp_id)| *lsp_id != server_id); + } - for url in urls { - self.editor.diagnostics.remove(&url); + self.editor.diagnostics.retain(|_, diags| !diags.is_empty()); + + // Clear any diagnostics for documents with this server open. + for doc in self.editor.documents_mut() { + doc.clear_diagnostics(server_id); } // Remove the language server from the registry. diff --git a/helix-term/src/ui/statusline.rs b/helix-term/src/ui/statusline.rs index 4aa646345..dbf5ac314 100644 --- a/helix-term/src/ui/statusline.rs +++ b/helix-term/src/ui/statusline.rs @@ -275,7 +275,7 @@ fn render_workspace_diagnostics(context: &mut RenderContext, write: F) }); if warnings > 0 || errors > 0 { - write(context, format!(" {} ", "W"), None); + write(context, " W ".into(), None); } if warnings > 0 {