aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-lsp/src/client.rs15
-rw-r--r--helix-lsp/src/lib.rs4
-rw-r--r--helix-term/src/application.rs13
3 files changed, 31 insertions, 1 deletions
diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs
index 245eb854..101d2f9b 100644
--- a/helix-lsp/src/client.rs
+++ b/helix-lsp/src/client.rs
@@ -272,6 +272,21 @@ impl Client {
self.notify::<lsp::notification::Exit>(())
}
+ /// Tries to shut down the language server but returns
+ /// early if server responds with an error.
+ pub async fn shutdown_and_exit(&self) -> Result<()> {
+ self.shutdown().await?;
+ self.exit().await
+ }
+
+ /// Forcefully shuts down the language server ignoring any errors.
+ pub async fn force_shutdown(&self) -> Result<()> {
+ if let Err(e) = self.shutdown().await {
+ log::warn!("language server failed to terminate gracefully - {}", e);
+ }
+ self.exit().await
+ }
+
// -------------------------------------------------------------------------------------------
// Text document
// -------------------------------------------------------------------------------------------
diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs
index 774de075..49d5527f 100644
--- a/helix-lsp/src/lib.rs
+++ b/helix-lsp/src/lib.rs
@@ -310,6 +310,10 @@ impl Registry {
Err(Error::LspNotDefined)
}
}
+
+ pub fn iter_clients(&self) -> impl Iterator<Item = &Arc<Client>> {
+ self.inner.values().map(|(_, client)| client)
+ }
}
#[derive(Debug)]
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index aa2ce884..1f02ac4f 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -23,7 +23,7 @@ use crossterm::{
use tui::layout::Rect;
-use futures_util::stream::FuturesUnordered;
+use futures_util::{future, stream::FuturesUnordered};
type BoxFuture<T> = Pin<Box<dyn Future<Output = T> + Send>>;
pub type LspCallback =
@@ -406,6 +406,17 @@ impl Application {
self.event_loop().await;
+ tokio::time::timeout(
+ Duration::from_millis(500),
+ future::join_all(
+ self.editor
+ .language_servers
+ .iter_clients()
+ .map(|client| client.force_shutdown()),
+ ),
+ )
+ .await;
+
// reset cursor shape
write!(stdout, "\x1B[2 q");