diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 85e044056b..cb23d01fb6 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -8284,7 +8284,7 @@ impl LspStore { .into_iter() .flatten() .collect(); - Some(hovers) + Some(deduplicate_hovers(hovers)) }) } else { let all_actions_task = self.request_multiple_lsp_locally( @@ -8294,13 +8294,13 @@ impl LspStore { cx, ); cx.background_spawn(async move { - Some( + Some(deduplicate_hovers( all_actions_task .await .into_iter() .filter_map(|(_, hover)| remove_empty_hover_blocks(hover?)) .collect::>(), - ) + )) }) } } @@ -13985,6 +13985,19 @@ fn remove_empty_hover_blocks(mut hover: Hover) -> Option { } } +fn deduplicate_hovers(hovers: Vec) -> Vec { + let mut unique_hovers = Vec::with_capacity(hovers.len()); + for hover in hovers { + if !unique_hovers + .iter() + .any(|unique: &Hover| unique.contents == hover.contents) + { + unique_hovers.push(hover); + } + } + unique_hovers +} + async fn populate_labels_for_completions( new_completions: Vec, language: Option>, diff --git a/crates/project/tests/integration/project_tests.rs b/crates/project/tests/integration/project_tests.rs index e926216141..c2ec56e0dc 100644 --- a/crates/project/tests/integration/project_tests.rs +++ b/crates/project/tests/integration/project_tests.rs @@ -9416,6 +9416,7 @@ async fn test_multiple_language_server_hovers(cx: &mut gpui::TestAppContext) { "TailwindServer", "ESLintServer", "NoHoverCapabilitiesServer", + "DuplicateTypeScriptServer", ]; let mut language_servers = [ language_registry.register_fake_lsp( @@ -9462,6 +9463,17 @@ async fn test_multiple_language_server_hovers(cx: &mut gpui::TestAppContext) { ..FakeLspAdapter::default() }, ), + language_registry.register_fake_lsp( + "tsx", + FakeLspAdapter { + name: language_server_names[4], + capabilities: lsp::ServerCapabilities { + hover_provider: Some(lsp::HoverProviderCapability::Simple(true)), + ..lsp::ServerCapabilities::default() + }, + ..FakeLspAdapter::default() + }, + ), ]; let (buffer, _handle) = project @@ -9504,6 +9516,21 @@ async fn test_multiple_language_server_hovers(cx: &mut gpui::TestAppContext) { ), ); } + "DuplicateTypeScriptServer" => { + servers_with_hover_requests.insert( + new_server_name, + new_server.set_request_handler::( + |_, _| async move { + Ok(Some(lsp::Hover { + contents: lsp::HoverContents::Scalar(lsp::MarkedString::String( + "TypeScriptServer hover".to_string(), + )), + range: None, + })) + }, + ), + ); + } "ESLintServer" => { servers_with_hover_requests.insert( new_server_name, @@ -9545,7 +9572,7 @@ async fn test_multiple_language_server_hovers(cx: &mut gpui::TestAppContext) { .map(|hover| hover.contents.iter().map(|block| &block.text).join("|")) .sorted() .collect::>(), - "Should receive hover responses from all related servers with hover capabilities" + "Should receive unique hover responses from all related servers with hover capabilities" ); }