From 9d7476afc6f80a154be4d982ff21f7c3a82d51cb Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 9 Jun 2022 10:05:35 +0200 Subject: [PATCH] Extract a `Project::stop_language_server` method when restarting server This will be useful later to stop a language server when detecting configuration changes. --- crates/project/src/project.rs | 46 +++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 63a77f2642..e49f3b424c 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2060,6 +2060,35 @@ impl Project { }); } + fn stop_language_server( + &mut self, + worktree_id: WorktreeId, + adapter_name: LanguageServerName, + cx: &mut ModelContext, + ) -> Task<()> { + let key = (worktree_id, adapter_name); + self.language_servers.remove(&key); + if let Some(language_server) = self.started_language_servers.remove(&key) { + cx.spawn_weak(|this, mut cx| async move { + if let Some(language_server) = language_server.await { + if let Some(shutdown) = language_server.shutdown() { + shutdown.await; + } + + if let Some(this) = this.upgrade(&cx) { + this.update(&mut cx, |this, cx| { + this.language_server_statuses + .remove(&language_server.server_id()); + cx.notify(); + }); + } + } + }) + } else { + Task::ready(()) + } + } + pub fn restart_language_servers_for_buffers( &mut self, buffers: impl IntoIterator>, @@ -2096,20 +2125,11 @@ impl Project { } else { return; }; - let key = (worktree_id, adapter.name()); - let server_to_shutdown = self.language_servers.remove(&key); - self.started_language_servers.remove(&key); - server_to_shutdown - .as_ref() - .map(|(_, server)| self.language_server_statuses.remove(&server.server_id())); - cx.spawn_weak(|this, mut cx| async move { - if let Some(this) = this.upgrade(&cx) { - if let Some((_, server_to_shutdown)) = server_to_shutdown { - if let Some(shutdown_task) = server_to_shutdown.shutdown() { - shutdown_task.await; - } - } + let stop = self.stop_language_server(worktree_id, adapter.name(), cx); + cx.spawn_weak(|this, mut cx| async move { + stop.await; + if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { this.start_language_server(worktree_id, worktree_path, language, cx); });