From 49797fb8db14ed5af1272f6dad72a821c1cc330d Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Mon, 23 Mar 2026 07:08:16 +0100 Subject: [PATCH] Shutdown lsps on window close --- crates/project/src/lsp_store.rs | 37 +++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 41190a32f2d8ff3281240d16e96e35452e390561..71dd75c1776116cadc1a98c5d8d4aec89ef0f689 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -316,7 +316,7 @@ pub struct LocalLspStore { >, >, buffer_snapshots: HashMap>>, // buffer_id -> server_id -> vec of snapshots - _subscription: gpui::Subscription, + _subscriptions: Vec, lsp_tree: LanguageServerTree, registered_buffers: HashMap, buffers_opened_in_servers: HashMap>, @@ -4160,6 +4160,28 @@ impl LspStore { } } + fn shutdown_language_servers(&mut self, cx: &mut App) { + if let Some(local) = self.as_local_mut() { + let shutdown_futures: Vec<_> = local + .language_servers + .drain() + .map(|(_, server_state)| LocalLspStore::shutdown_server(server_state)) + .collect(); + + let supplementary_shutdown_futures: Vec<_> = local + .supplementary_language_servers + .drain() + .filter_map(|(_, (_, server))| server.shutdown()) + .collect(); + + cx.background_spawn(async move { + join_all(shutdown_futures).await; + join_all(supplementary_shutdown_futures).await; + }) + .detach(); + } + } + pub fn new_local( buffer_store: Entity, worktree_store: Entity, @@ -4215,11 +4237,14 @@ impl LspStore { yarn, next_diagnostic_group_id: Default::default(), diagnostics: Default::default(), - _subscription: cx.on_app_quit(|this, _| { - this.as_local_mut() - .unwrap() - .shutdown_language_servers_on_quit() - }), + _subscriptions: vec![ + cx.on_app_quit(|this, _| { + this.as_local_mut() + .unwrap() + .shutdown_language_servers_on_quit() + }), + cx.on_release(Self::shutdown_language_servers), + ], lsp_tree: LanguageServerTree::new( manifest_tree, languages.clone(),