diff --git a/helix-term/src/handlers/diagnostics.rs b/helix-term/src/handlers/diagnostics.rs index 516c57579a9ce..a1af4ff937315 100644 --- a/helix-term/src/handlers/diagnostics.rs +++ b/helix-term/src/handlers/diagnostics.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::time::Duration; use helix_core::syntax::LanguageServerFeature; @@ -71,12 +71,14 @@ pub(super) fn register_hooks(handlers: &Handlers) { #[derive(Debug)] pub(super) struct PullDiagnosticsHandler { - document_id: Option, + document_ids: HashSet, } impl PullDiagnosticsHandler { pub fn new() -> PullDiagnosticsHandler { - PullDiagnosticsHandler { document_id: None } + PullDiagnosticsHandler { + document_ids: [].into(), + } } } @@ -88,29 +90,26 @@ impl helix_event::AsyncHook for PullDiagnosticsHandler { event: Self::Event, _: Option, ) -> Option { - self.document_id = Some(event.document_id); + self.document_ids.insert(event.document_id); Some(Instant::now() + Duration::from_millis(120)) } fn finish_debounce(&mut self) { - let document_id = self.document_id; - job::dispatch_blocking(move |editor, _| { - let Some(document_id) = document_id else { - return; - }; - - let doc = editor.document(document_id); - let Some(doc) = doc else { - return; - }; - - let language_servers = - doc.language_servers_with_feature(LanguageServerFeature::PullDiagnostics); - - for language_server in language_servers { - pull_diagnostics_for_document(doc, language_server); - } - }) + for document_id in self.document_ids.clone() { + job::dispatch_blocking(move |editor, _| { + let doc = editor.document(document_id); + let Some(doc) = doc else { + return; + }; + + let language_servers = + doc.language_servers_with_feature(LanguageServerFeature::PullDiagnostics); + + for language_server in language_servers { + pull_diagnostics_for_document(doc, language_server); + } + }) + } } }