@@ -39,10 +39,16 @@ pub(super) fn register_hooks(handlers: &Handlers) {
39
39
. doc
40
40
. has_language_server_with_feature( LanguageServerFeature :: PullDiagnostics )
41
41
{
42
+ let language_server_ids = event
43
+ . doc
44
+ . language_servers_with_feature( LanguageServerFeature :: PullDiagnostics )
45
+ . map( |x| x. id( ) )
46
+ . collect( ) ;
47
+
42
48
send_blocking(
43
49
& tx,
44
50
PullDiagnosticsEvent {
45
- document_id : event . doc . id ( ) ,
51
+ language_server_ids ,
46
52
} ,
47
53
) ;
48
54
}
@@ -54,12 +60,14 @@ const TIMEOUT: u64 = 120;
54
60
55
61
#[ derive( Debug ) ]
56
62
pub ( super ) struct PullDiagnosticsHandler {
57
- document_id : Option < helix_view :: DocumentId > ,
63
+ language_server_ids : Vec < LanguageServerId > ,
58
64
}
59
65
60
66
impl PullDiagnosticsHandler {
61
67
pub fn new ( ) -> PullDiagnosticsHandler {
62
- PullDiagnosticsHandler { document_id : None }
68
+ PullDiagnosticsHandler {
69
+ language_server_ids : vec ! [ ] ,
70
+ }
63
71
}
64
72
}
65
73
@@ -71,60 +79,70 @@ impl helix_event::AsyncHook for PullDiagnosticsHandler {
71
79
event : Self :: Event ,
72
80
_: Option < tokio:: time:: Instant > ,
73
81
) -> Option < tokio:: time:: Instant > {
74
- self . document_id = Some ( event. document_id ) ;
82
+ self . language_server_ids = event. language_server_ids ;
75
83
Some ( Instant :: now ( ) + Duration :: from_millis ( TIMEOUT ) )
76
84
}
77
85
78
86
fn finish_debounce ( & mut self ) {
79
- let document_id = self . document_id ;
80
-
87
+ let language_servers = self . language_server_ids . clone ( ) ;
81
88
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
+ )
86
94
} )
87
95
}
88
96
}
89
97
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 ( ) ;
116
121
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) ;
120
127
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}" ) ,
124
143
}
125
- Err ( err) => log:: error!( "signature help request failed: {err}" ) ,
126
- }
127
- } ) ;
144
+ } ) ;
145
+ }
128
146
}
129
147
}
130
148
@@ -133,9 +151,9 @@ fn show_pull_diagnostics(
133
151
response : lsp:: DocumentDiagnosticReport ,
134
152
server_id : LanguageServerId ,
135
153
uri : Uri ,
136
- document_id : helix_view:: DocumentId ,
154
+ document_id : & helix_view:: DocumentId ,
137
155
) {
138
- let doc = doc_mut ! ( editor, & document_id) ;
156
+ let doc = doc_mut ! ( editor, document_id) ;
139
157
match response {
140
158
lsp:: DocumentDiagnosticReport :: Full ( report) => {
141
159
// Original file diagnostic
@@ -184,7 +202,7 @@ fn parse_diagnostic(
184
202
185
203
fn handle_document_diagnostic_report_kind (
186
204
editor : & mut Editor ,
187
- document_id : helix_view:: DocumentId ,
205
+ document_id : & helix_view:: DocumentId ,
188
206
report : Option < HashMap < lsp:: Url , lsp:: DocumentDiagnosticReportKind > > ,
189
207
server_id : LanguageServerId ,
190
208
) {
0 commit comments