Get further reinstalling a server which died on startup

Julia created

Change summary

crates/project/src/project.rs | 35 ++++++++++++++++++++++++++---------
1 file changed, 26 insertions(+), 9 deletions(-)

Detailed changes

crates/project/src/project.rs 🔗

@@ -280,7 +280,13 @@ pub enum Event {
 
 pub enum LanguageServerState {
     Validating(Task<Option<Arc<LanguageServer>>>),
-    Starting(Task<Option<Arc<LanguageServer>>>),
+
+    Starting {
+        language: Arc<Language>,
+        adapter: Arc<CachedLspAdapter>,
+        task: Task<Option<Arc<LanguageServer>>>,
+    },
+
     Running {
         language: Arc<Language>,
         adapter: Arc<CachedLspAdapter>,
@@ -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<Self>,
     ) -> Option<Task<()>> {
         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::<Vec<_>>();