Skip to content

Commit 79b9b60

Browse files
committed
Add separate event for pulling visible documents diagnostics
1 parent 032f7a1 commit 79b9b60

File tree

4 files changed

+78
-16
lines changed

4 files changed

+78
-16
lines changed

helix-term/src/handlers.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::sync::Arc;
22

33
use arc_swap::ArcSwap;
4+
use diagnostics::PullAllDocumentsDiagnosticHandler;
45
use helix_event::AsyncHook;
56

67
use crate::config::Config;
@@ -28,13 +29,15 @@ pub fn setup(config: Arc<ArcSwap<Config>>) -> Handlers {
2829
let auto_save = AutoSaveHandler::new().spawn();
2930
let document_colors = DocumentColorsHandler::default().spawn();
3031
let pull_diagnostics = PullDiagnosticsHandler::new().spawn();
32+
let pull_all_documents_diagnostics = PullAllDocumentsDiagnosticHandler::new().spawn();
3133

3234
let handlers = Handlers {
3335
completions: helix_view::handlers::completion::CompletionHandler::new(event_tx),
3436
signature_hints,
3537
auto_save,
3638
document_colors,
3739
pull_diagnostics,
40+
pull_all_documents_diagnostics,
3841
};
3942

4043
helix_view::handlers::register_hooks(&handlers);

helix-term/src/handlers/diagnostics.rs

Lines changed: 72 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::collections::HashSet;
12
use std::time::Duration;
23
use tokio::time::Instant;
34

@@ -11,7 +12,7 @@ use helix_view::events::{
1112
DiagnosticsDidChange, DocumentDidChange, DocumentDidOpen, LanguageServerInitialized,
1213
};
1314
use helix_view::handlers::diagnostics::DiagnosticEvent;
14-
use helix_view::handlers::lsp::PullDiagnosticsEvent;
15+
use helix_view::handlers::lsp::{PullAllDocumentsDiagnosticsEvent, PullDiagnosticsEvent};
1516
use helix_view::handlers::Handlers;
1617
use helix_view::{DocumentId, Editor};
1718

@@ -35,13 +36,15 @@ pub(super) fn register_hooks(handlers: &Handlers) {
3536
});
3637

3738
let tx = handlers.pull_diagnostics.clone();
39+
let tx_all_documents = handlers.pull_all_documents_diagnostics.clone();
3840
register_hook!(move |event: &mut DocumentDidChange<'_>| {
3941
if event
4042
.doc
4143
.has_language_server_with_feature(LanguageServerFeature::PullDiagnostics)
4244
{
4345
let document_id = event.doc.id();
4446
send_blocking(&tx, PullDiagnosticsEvent { document_id });
47+
send_blocking(&tx_all_documents, PullAllDocumentsDiagnosticsEvent {});
4548
}
4649
Ok(())
4750
});
@@ -74,11 +77,15 @@ pub(super) fn register_hooks(handlers: &Handlers) {
7477
}
7578

7679
#[derive(Debug)]
77-
pub(super) struct PullDiagnosticsHandler {}
80+
pub(super) struct PullDiagnosticsHandler {
81+
document_ids: HashSet<DocumentId>,
82+
}
7883

7984
impl PullDiagnosticsHandler {
8085
pub fn new() -> Self {
81-
PullDiagnosticsHandler {}
86+
PullDiagnosticsHandler {
87+
document_ids: Default::default(),
88+
}
8289
}
8390
}
8491

@@ -87,31 +94,80 @@ impl helix_event::AsyncHook for PullDiagnosticsHandler {
8794

8895
fn handle_event(
8996
&mut self,
90-
_event: Self::Event,
97+
event: Self::Event,
9198
_timeout: Option<tokio::time::Instant>,
9299
) -> Option<tokio::time::Instant> {
100+
self.document_ids.insert(event.document_id);
93101
Some(Instant::now() + Duration::from_millis(125))
94102
}
95103

96104
fn finish_debounce(&mut self) {
97-
dispatch_pull_diagnostic_for_open_documents();
105+
let document_ids = self.document_ids.clone();
106+
job::dispatch_blocking(move |editor, _| {
107+
for document_id in document_ids {
108+
let document = editor.document(document_id);
109+
110+
let Some(document) = document else {
111+
return;
112+
};
113+
114+
let language_servers = document
115+
.language_servers_with_feature(LanguageServerFeature::PullDiagnostics)
116+
.filter(|ls| ls.is_initialized());
117+
118+
for language_server in language_servers {
119+
pull_diagnostics_for_document(document, language_server);
120+
}
121+
}
122+
})
98123
}
99124
}
100125

101-
fn dispatch_pull_diagnostic_for_open_documents() {
102-
job::dispatch_blocking(move |editor, _| {
103-
let documents = editor.documents.values();
126+
#[derive(Debug)]
127+
pub(super) struct PullAllDocumentsDiagnosticHandler {}
128+
129+
impl PullAllDocumentsDiagnosticHandler {
130+
pub fn new() -> Self {
131+
PullAllDocumentsDiagnosticHandler {}
132+
}
133+
}
104134

105-
for document in documents {
106-
let language_servers = document
107-
.language_servers_with_feature(LanguageServerFeature::PullDiagnostics)
108-
.filter(|ls| ls.is_initialized());
135+
impl helix_event::AsyncHook for PullAllDocumentsDiagnosticHandler {
136+
type Event = PullAllDocumentsDiagnosticsEvent;
109137

110-
for language_server in language_servers {
111-
pull_diagnostics_for_document(document, language_server);
138+
fn handle_event(
139+
&mut self,
140+
_event: Self::Event,
141+
_timeout: Option<tokio::time::Instant>,
142+
) -> Option<tokio::time::Instant> {
143+
Some(Instant::now() + Duration::from_millis(500))
144+
}
145+
146+
fn finish_debounce(&mut self) {
147+
job::dispatch_blocking(move |editor, _| {
148+
for document in editor.documents.values() {
149+
let language_servers = document
150+
.language_servers_with_feature(LanguageServerFeature::PullDiagnostics)
151+
.filter(|ls| ls.is_initialized())
152+
.filter(|ls| {
153+
ls.capabilities().diagnostic_provider.as_ref().is_some_and(
154+
|diagnostic_provider| match diagnostic_provider {
155+
lsp::DiagnosticServerCapabilities::Options(options) => {
156+
options.inter_file_dependencies
157+
}
158+
lsp::DiagnosticServerCapabilities::RegistrationOptions(options) => {
159+
options.diagnostic_options.inter_file_dependencies
160+
}
161+
},
162+
)
163+
});
164+
165+
for language_server in language_servers {
166+
pull_diagnostics_for_document(document, language_server);
167+
}
112168
}
113-
}
114-
})
169+
})
170+
}
115171
}
116172

117173
pub fn pull_diagnostics_for_document(

helix-view/src/handlers.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub struct Handlers {
2323
pub auto_save: Sender<AutoSaveEvent>,
2424
pub document_colors: Sender<lsp::DocumentColorsEvent>,
2525
pub pull_diagnostics: Sender<lsp::PullDiagnosticsEvent>,
26+
pub pull_all_documents_diagnostics: Sender<lsp::PullAllDocumentsDiagnosticsEvent>,
2627
}
2728

2829
impl Handlers {

helix-view/src/handlers/lsp.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ pub struct PullDiagnosticsEvent {
3434
pub document_id: DocumentId,
3535
}
3636

37+
pub struct PullAllDocumentsDiagnosticsEvent {}
38+
3739
#[derive(Debug)]
3840
pub struct ApplyEditError {
3941
pub kind: ApplyEditErrorKind,

0 commit comments

Comments
 (0)