diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 63a77f2642858d58e05a4dc7bfcefb1591c29a02..e49f3b424c4514df090d1b7f9a6276c1d31e0d09 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())); + + 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) { - if let Some((_, server_to_shutdown)) = server_to_shutdown { - if let Some(shutdown_task) = server_to_shutdown.shutdown() { - shutdown_task.await; - } - } - this.update(&mut cx, |this, cx| { this.start_language_server(worktree_id, worktree_path, language, cx); });