diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 14b5a288e1..b9d28c76a1 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -289,10 +289,13 @@ impl LanguageRegistry { let servers_tx = servers_tx.clone(); cx.background() .spawn(async move { - fake_server - .receive_notification::() - .await; - servers_tx.unbounded_send(fake_server).ok(); + if fake_server + .try_receive_notification::() + .await + .is_some() + { + servers_tx.unbounded_send(fake_server).ok(); + } }) .detach(); Ok(server) diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index 02bc0486f1..d5af202516 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -647,12 +647,18 @@ impl FakeLanguageServer { } pub async fn receive_notification(&mut self) -> T::Params { + self.try_receive_notification::().await.unwrap() + } + + pub async fn try_receive_notification( + &mut self, + ) -> Option { use futures::StreamExt as _; loop { - let (method, params) = self.notifications_rx.next().await.unwrap(); + let (method, params) = self.notifications_rx.next().await?; if &method == T::METHOD { - return serde_json::from_str::(¶ms).unwrap(); + return Some(serde_json::from_str::(¶ms).unwrap()); } else { log::info!("skipping message in fake language server {:?}", params); } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index b54c3677fa..d23122f45b 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -6550,7 +6550,7 @@ mod tests { assert!(results.is_empty()); } - #[gpui::test] + #[gpui::test(iterations = 10)] async fn test_definition(cx: &mut gpui::TestAppContext) { let mut language = Language::new( LanguageConfig {