on master help sign in
lsp: Eagerly process notifications/server calls to avoid re-rendering
2f321b9Blaž Hrastnik
helix-term/src/application.rs+7−5
@@ -152,14 +152,19 @@ impl Application {
152 break;
152 break;
153 }
153 }
154
154
155− use futures_util::StreamExt;
155+ use futures_util::{FutureExt, StreamExt};
156
156
157 tokio::select! {
157 tokio::select! {
158 event = reader.next() => {
158 event = reader.next() => {
159 self.handle_terminal_events(event)
159 self.handle_terminal_events(event)
160 }
160 }
161 Some((id, call)) = self.editor.language_servers.incoming.next() => {
161 Some((id, call)) = self.editor.language_servers.incoming.next() => {
162− self.handle_language_server_message(call, id).await
162+ self.handle_language_server_message(call, id).await;
163+ // eagerly process any other available notifications/calls
164+ while let Some(Some((id, call))) = self.editor.language_servers.incoming.next().now_or_never() {
165+ self.handle_language_server_message(call, id).await;
166+ }
167+ self.render();
163 }
168 }
164 Some(callback) = &mut self.callbacks.next() => {
169 Some(callback) = &mut self.callbacks.next() => {
165 self.handle_language_server_callback(callback)
170 self.handle_language_server_callback(callback)
@@ -294,7 +299,6 @@ impl Application {
294
299
295 doc.set_diagnostics(diagnostics);
300 doc.set_diagnostics(diagnostics);
296 // TODO: we want to process all the events in queue, then render. publishDiagnostic tends to send a whole bunch of events
301 // TODO: we want to process all the events in queue, then render. publishDiagnostic tends to send a whole bunch of events
297− self.render();
298 }
302 }
299 }
303 }
300 Notification::ShowMessage(params) => {
304 Notification::ShowMessage(params) => {
@@ -330,7 +334,6 @@ impl Application {
330 self.editor.clear_status();
334 self.editor.clear_status();
331
335
332 // we want to render to clear any leftover spinners or messages
336 // we want to render to clear any leftover spinners or messages
333− self.render();
334 return;
337 return;
335 }
338 }
336 }
339 }
@@ -378,7 +381,6 @@ impl Application {
378 if self.config.lsp.display_messages {
381 if self.config.lsp.display_messages {
379 self.editor.set_status(status);
382 self.editor.set_status(status);
380 }
383 }
381− self.render();
382 }
384 }
383 _ => unreachable!(),
385 _ => unreachable!(),
384 }
386 }