diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index b106110c33..6a28d777a0 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1569,11 +1569,25 @@ impl Buffer { self.send_operation(op, true, cx); } - pub fn get_diagnostics(&self, server_id: LanguageServerId) -> Option<&DiagnosticSet> { - let Ok(idx) = self.diagnostics.binary_search_by_key(&server_id, |v| v.0) else { - return None; - }; - Some(&self.diagnostics[idx].1) + /// Retrieve the diagnostics entries for the given language server, or all + /// diagnostics if `server_id` is `None`. + pub fn get_diagnostics( + &self, + server_id: Option, + ) -> Option>> { + if let Some(server_id) = server_id { + let Ok(idx) = self.diagnostics.binary_search_by_key(&server_id, |v| v.0) else { + return None; + }; + Some(self.diagnostics[idx].1.iter().collect::>()) + } else { + let diag = self + .diagnostics + .iter() + .flat_map(|(_, diags)| (*diags).iter()) + .collect::>(); + Some(diag) + } } fn request_autoindent(&mut self, cx: &mut Context) { diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index d2958dce01..ea96dae5ec 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -7588,9 +7588,8 @@ impl LspStore { let snapshot = buffer_handle.read(cx).snapshot(); let buffer = buffer_handle.read(cx); let reused_diagnostics = buffer - .get_diagnostics(server_id) - .into_iter() - .flat_map(|diag| { + .get_diagnostics(Some(server_id)) + .map(|diag| { diag.iter() .filter(|v| merge(buffer, &v.diagnostic, cx)) .map(|v| { @@ -7601,8 +7600,9 @@ impl LspStore { diagnostic: v.diagnostic.clone(), } }) + .collect::>() }) - .collect::>(); + .unwrap_or_default(); self.as_local_mut() .context("cannot merge diagnostics on a remote LspStore")?