From fb23ad835cc3753a2c251c49d84088bbc3f7a3d5 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 13 Mar 2026 11:11:14 +0100 Subject: [PATCH] Prevent auto-restart of language servers after Stop All Servers When the user clicks Stop All Servers, set a flag that suppresses automatic language server startup. The flag is cleared when Restart All Servers is hit. This guards the three auto-start paths: - Buffer registration with language servers (new buffers, file path changes, language detection, language registry reloads) - Server tree refresh (workspace config / manifest changes) - Settings-triggered restarts (semantic token mode changes) --- crates/project/src/lsp_store.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 9ea50fdc8f12b68147c1073219625c4fd257afd3..7c223419dff7c31126a18ceb663e4f9b74c450c6 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -331,6 +331,7 @@ pub struct LocalLspStore { HashMap, HashMap>>, >, restricted_worktrees_tasks: HashMap)>, + language_servers_stopped: bool, buffers_to_refresh_hash_set: HashSet, buffers_to_refresh_queue: VecDeque, @@ -2750,6 +2751,9 @@ impl LocalLspStore { only_register_servers: HashSet, cx: &mut Context, ) { + if self.language_servers_stopped { + return; + } let buffer = buffer_handle.read(cx); let buffer_id = buffer.remote_id(); @@ -4279,6 +4283,7 @@ impl LspStore { buffer_pull_diagnostics_result_ids: HashMap::default(), workspace_pull_diagnostics_result_ids: HashMap::default(), restricted_worktrees_tasks: HashMap::default(), + language_servers_stopped: false, watched_manifest_filenames: ManifestProvidersStore::global(cx) .manifest_file_names(), }), @@ -5257,7 +5262,12 @@ impl LspStore { .semantic_token_config .update_global_mode(new_global_semantic_tokens_mode) { - self.restart_all_language_servers(cx); + let stopped = self + .as_local() + .is_some_and(|local| local.language_servers_stopped); + if !stopped { + self.restart_all_language_servers(cx); + } } cx.notify(); @@ -5268,6 +5278,9 @@ impl LspStore { let Some(local) = self.as_local_mut() else { return; }; + if local.language_servers_stopped { + return; + } let mut adapters = BTreeMap::default(); let get_adapter = { let languages = local.languages.clone(); @@ -11051,6 +11064,9 @@ impl LspStore { } pub fn stop_all_language_servers(&mut self, cx: &mut Context) { + if let Some(local) = self.as_local_mut() { + local.language_servers_stopped = true; + } self.shutdown_all_language_servers(cx).detach(); } @@ -11086,6 +11102,9 @@ impl LspStore { } pub fn restart_all_language_servers(&mut self, cx: &mut Context) { + if let Some(local) = self.as_local_mut() { + local.language_servers_stopped = false; + } let buffers = self.buffer_store.read(cx).buffers().collect(); self.restart_language_servers_for_buffers(buffers, HashSet::default(), cx); }