Skip to content

Commit 96a984c

Browse files
committed
Check all documents
1 parent 4e85776 commit 96a984c

File tree

2 files changed

+67
-49
lines changed

2 files changed

+67
-49
lines changed

helix-term/src/handlers/diagnostics.rs

Lines changed: 66 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,16 @@ pub(super) fn register_hooks(handlers: &Handlers) {
3939
.doc
4040
.has_language_server_with_feature(LanguageServerFeature::PullDiagnostics)
4141
{
42+
let language_server_ids = event
43+
.doc
44+
.language_servers_with_feature(LanguageServerFeature::PullDiagnostics)
45+
.map(|x| x.id())
46+
.collect();
47+
4248
send_blocking(
4349
&tx,
4450
PullDiagnosticsEvent {
45-
document_id: event.doc.id(),
51+
language_server_ids,
4652
},
4753
);
4854
}
@@ -54,12 +60,14 @@ const TIMEOUT: u64 = 120;
5460

5561
#[derive(Debug)]
5662
pub(super) struct PullDiagnosticsHandler {
57-
document_id: Option<helix_view::DocumentId>,
63+
language_server_ids: Vec<LanguageServerId>,
5864
}
5965

6066
impl PullDiagnosticsHandler {
6167
pub fn new() -> PullDiagnosticsHandler {
62-
PullDiagnosticsHandler { document_id: None }
68+
PullDiagnosticsHandler {
69+
language_server_ids: vec![],
70+
}
6371
}
6472
}
6573

@@ -71,60 +79,70 @@ impl helix_event::AsyncHook for PullDiagnosticsHandler {
7179
event: Self::Event,
7280
_: Option<tokio::time::Instant>,
7381
) -> Option<tokio::time::Instant> {
74-
self.document_id = Some(event.document_id);
82+
self.language_server_ids = event.language_server_ids;
7583
Some(Instant::now() + Duration::from_millis(TIMEOUT))
7684
}
7785

7886
fn finish_debounce(&mut self) {
79-
let document_id = self.document_id;
80-
87+
let language_servers = self.language_server_ids.clone();
8188
job::dispatch_blocking(move |editor, _| {
82-
let Some(document_id) = document_id else {
83-
return;
84-
};
85-
pull_diagnostic_for_document(editor, document_id)
89+
pull_diagnostic_for_document(
90+
editor,
91+
language_servers,
92+
editor.documents().map(|x| x.id()).collect(),
93+
)
8694
})
8795
}
8896
}
8997

90-
fn pull_diagnostic_for_document(editor: &mut Editor, document_id: helix_view::DocumentId) {
91-
let doc = doc_mut!(editor, &document_id);
92-
93-
for language_server in doc.language_servers_with_feature(LanguageServerFeature::PullDiagnostics)
94-
{
95-
let Some(future) = language_server
96-
.text_document_diagnostic(doc.identifier(), doc.previous_diagnostic_id.clone())
97-
else {
98-
return;
99-
};
100-
101-
let Some(uri) = doc.uri() else {
102-
return;
103-
};
104-
105-
let server_id = language_server.id();
106-
107-
tokio::spawn(async move {
108-
match future.await {
109-
Ok(res) => {
110-
job::dispatch(move |editor, _| {
111-
let parsed_response: Option<lsp::DocumentDiagnosticReport> =
112-
match serde_json::from_value(res) {
113-
Ok(result) => Some(result),
114-
Err(_) => None,
115-
};
98+
fn pull_diagnostic_for_document(
99+
editor: &mut Editor,
100+
language_server_ids: Vec<LanguageServerId>,
101+
document_ids: Vec<helix_view::DocumentId>,
102+
) {
103+
for document_id in document_ids.clone() {
104+
let doc = doc_mut!(editor, &document_id);
105+
let language_servers = doc
106+
.language_servers()
107+
.filter(|x| language_server_ids.contains(&x.id()));
108+
109+
for language_server in language_servers {
110+
let Some(future) = language_server
111+
.text_document_diagnostic(doc.identifier(), doc.previous_diagnostic_id.clone())
112+
else {
113+
return;
114+
};
115+
116+
let Some(uri) = doc.uri() else {
117+
return;
118+
};
119+
120+
let server_id = language_server.id();
116121

117-
let Some(response) = parsed_response else {
118-
return;
119-
};
122+
tokio::spawn(async move {
123+
match future.await {
124+
Ok(res) => {
125+
job::dispatch(move |editor, _| {
126+
log::error!("{}", res);
120127

121-
show_pull_diagnostics(editor, response, server_id, uri, document_id)
122-
})
123-
.await
128+
let parsed_response: Option<lsp::DocumentDiagnosticReport> =
129+
match serde_json::from_value(res) {
130+
Ok(result) => Some(result),
131+
Err(_) => None,
132+
};
133+
134+
let Some(response) = parsed_response else {
135+
return;
136+
};
137+
138+
show_pull_diagnostics(editor, response, server_id, uri, &document_id)
139+
})
140+
.await
141+
}
142+
Err(err) => log::error!("signature help request failed: {err}"),
124143
}
125-
Err(err) => log::error!("signature help request failed: {err}"),
126-
}
127-
});
144+
});
145+
}
128146
}
129147
}
130148

@@ -133,9 +151,9 @@ fn show_pull_diagnostics(
133151
response: lsp::DocumentDiagnosticReport,
134152
server_id: LanguageServerId,
135153
uri: Uri,
136-
document_id: helix_view::DocumentId,
154+
document_id: &helix_view::DocumentId,
137155
) {
138-
let doc = doc_mut!(editor, &document_id);
156+
let doc = doc_mut!(editor, document_id);
139157
match response {
140158
lsp::DocumentDiagnosticReport::Full(report) => {
141159
// Original file diagnostic
@@ -184,7 +202,7 @@ fn parse_diagnostic(
184202

185203
fn handle_document_diagnostic_report_kind(
186204
editor: &mut Editor,
187-
document_id: helix_view::DocumentId,
205+
document_id: &helix_view::DocumentId,
188206
report: Option<HashMap<lsp::Url, lsp::DocumentDiagnosticReportKind>>,
189207
server_id: LanguageServerId,
190208
) {

helix-view/src/handlers/lsp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub enum SignatureHelpEvent {
4848
}
4949

5050
pub struct PullDiagnosticsEvent {
51-
pub document_id: DocumentId,
51+
pub language_server_ids: Vec<helix_lsp::LanguageServerId>,
5252
}
5353

5454
#[derive(Debug)]

0 commit comments

Comments
 (0)