@@ -37,7 +37,12 @@ use crate::{
40− cmp::Ordering, collections::BTreeMap, fmt::Write, future::Future, path::PathBuf, sync::Arc,
41+ collections::{BTreeMap, HashSet},
43impl ui::menu::Item for lsp::Location {
48impl ui::menu::Item for lsp::Location {
@@ -351,8 +356,11 @@ pub fn symbol_picker(cx: &mut Context) {
352 let doc = doc!(cx.editor);
357 let doc = doc!(cx.editor);
359+ let mut seen_language_servers = HashSet::new();
354 let mut futures: FuturesUnordered<_> = doc
361 let mut futures: FuturesUnordered<_> = doc
355 .language_servers_with_feature(LanguageServerFeature::DocumentSymbols)
362 .language_servers_with_feature(LanguageServerFeature::DocumentSymbols)
363+ .filter(|ls| seen_language_servers.insert(ls.id()))
356 .filter_map(|ls| {
364 .filter_map(|ls| {
357 let request = ls.document_symbols(doc.identifier())?;
365 let request = ls.document_symbols(doc.identifier())?;
358 Some((request, ls.offset_encoding(), doc.identifier()))
366 Some((request, ls.offset_encoding(), doc.identifier()))
@@ -413,8 +421,10 @@ pub fn workspace_symbol_picker(cx: &mut Context) {
414 let get_symbols = move |pattern: String, editor: &mut Editor| {
422 let get_symbols = move |pattern: String, editor: &mut Editor| {
415 let doc = doc!(editor);
423 let doc = doc!(editor);
424+ let mut seen_language_servers = HashSet::new();
416 let mut futures: FuturesUnordered<_> = doc
425 let mut futures: FuturesUnordered<_> = doc
417 .language_servers_with_feature(LanguageServerFeature::WorkspaceSymbols)
426 .language_servers_with_feature(LanguageServerFeature::WorkspaceSymbols)
427+ .filter(|ls| seen_language_servers.insert(ls.id()))
418 .filter_map(|ls| Some((ls.workspace_symbols(pattern.clone())?, ls.offset_encoding())))
428 .filter_map(|ls| Some((ls.workspace_symbols(pattern.clone())?, ls.offset_encoding())))
419 .map(|(request, offset_encoding)| async move {
429 .map(|(request, offset_encoding)| async move {
420 let json = request.await?;
430 let json = request.await?;
@@ -573,8 +583,11 @@ pub fn code_action(cx: &mut Context) {
574 let selection_range = doc.selection(view.id).primary();
584 let selection_range = doc.selection(view.id).primary();
586+ let mut seen_language_servers = HashSet::new();
576 let mut futures: FuturesUnordered<_> = doc
588 let mut futures: FuturesUnordered<_> = doc
577 .language_servers_with_feature(LanguageServerFeature::CodeAction)
589 .language_servers_with_feature(LanguageServerFeature::CodeAction)
590+ .filter(|ls| seen_language_servers.insert(ls.id()))
578 // TODO this should probably already been filtered in something like "language_servers_with_feature"
591 // TODO this should probably already been filtered in something like "language_servers_with_feature"
579 .filter_map(|language_server| {
592 .filter_map(|language_server| {
580 let offset_encoding = language_server.offset_encoding();
593 let offset_encoding = language_server.offset_encoding();