diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 44e1523bd1..5a42399040 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -280,7 +280,13 @@ pub enum Event { pub enum LanguageServerState { Validating(Task>>), - Starting(Task>>), + + Starting { + language: Arc, + adapter: Arc, + task: Task>>, + }, + Running { language: Arc, adapter: Arc, @@ -2443,9 +2449,11 @@ impl Project { let server_id = pending_server.server_id; let container_dir = pending_server.container_dir.clone(); - let state = LanguageServerState::Starting({ + let task = { + let adapter = adapter.clone(); let server_name = adapter.name.0.clone(); let languages = self.languages.clone(); + let language = language.clone(); let key = key.clone(); cx.spawn_weak(|this, mut cx| async move { @@ -2488,7 +2496,12 @@ impl Project { } } }) - }); + }; + let state = LanguageServerState::Starting { + language, + adapter, + task, + }; self.language_servers.insert(server_id, state); self.language_server_ids.insert(key, server_id); @@ -2500,19 +2513,23 @@ impl Project { cx: &mut ModelContext, ) -> Option> { println!("starting to reinstall server"); - let (adapter, language, server) = match self.language_servers.remove(&server_id) { + let (language, adapter, server) = match self.language_servers.remove(&server_id) { Some(LanguageServerState::Running { - adapter, language, + adapter, server, .. - }) => (adapter.clone(), language.clone(), server), + }) => (language.clone(), adapter.clone(), Some(server)), + + Some(LanguageServerState::Starting { + language, adapter, .. + }) => (language.clone(), adapter.clone(), None), _ => return None, }; Some(cx.spawn(move |this, mut cx| async move { - if let Some(task) = server.shutdown() { + if let Some(task) = server.and_then(|server| server.shutdown()) { println!("shutting down existing server"); task.await; } @@ -2921,7 +2938,7 @@ impl Project { let server = match server_state { Some(LanguageServerState::Validating(task)) => task.await, - Some(LanguageServerState::Starting(task)) => task.await, + Some(LanguageServerState::Starting { task, .. }) => task.await, Some(LanguageServerState::Running { server, .. }) => Some(server), None => None, }; @@ -7425,7 +7442,7 @@ impl Entity for Project { use LanguageServerState::*; match server_state { Running { server, .. } => server.shutdown()?.await, - Starting(task) | Validating(task) => task.await?.shutdown()?.await, + Starting { task, .. } | Validating(task) => task.await?.shutdown()?.await, } }) .collect::>();