on master help sign in
Filter out already seen language servers in requests that can be sent to multiple language servers (code-action, completion, symbol pickers)
commit451fe528bbc71e2712c02c1ee0d7ac6fcc1a058b authorPhilipp Mildenberger <philipp@mildenberger.me> dateMon 20 Mar 2023, 01:18 (4 years ago) parent8ee5999
2 files changed+17−1
helix-term/src/commands.rs+3 helix-term/src/commands/lsp.rs+14−1
helix-term/src/commands.rs+3
@@ -4243,9 +4243,12 @@ pub fn completion(cx: &mut Context) {
42434243 let text = savepoint.text.clone();
42444244 let cursor = savepoint.cursor();
42454245
4246+ let mut seen_language_servers = HashSet::new();
4247+
42464248 let mut futures: FuturesUnordered<_> = doc
42474249 .language_servers_with_feature(LanguageServerFeature::Completion)
42484250 // TODO this should probably already been filtered in something like "language_servers_with_feature"
4251+ .filter(|ls| seen_language_servers.insert(ls.id()))
42494252 .filter_map(|language_server| {
42504253 let language_server_id = language_server.id();
42514254 let offset_encoding = language_server.offset_encoding();
helix-term/src/commands/lsp.rs+14−1
@@ -37,7 +37,12 @@ use crate::{
3737};
3838
3939use std::{
40− cmp::Ordering, collections::BTreeMap, fmt::Write, future::Future, path::PathBuf, sync::Arc,
40+ cmp::Ordering,
41+ collections::{BTreeMap, HashSet},
42+ fmt::Write,
43+ future::Future,
44+ path::PathBuf,
45+ sync::Arc,
4146};
4247
4348impl ui::menu::Item for lsp::Location {
@@ -351,8 +356,11 @@ pub fn symbol_picker(cx: &mut Context) {
351356 }
352357 let doc = doc!(cx.editor);
353358
359+ let mut seen_language_servers = HashSet::new();
360+
354361 let mut futures: FuturesUnordered<_> = doc
355362 .language_servers_with_feature(LanguageServerFeature::DocumentSymbols)
363+ .filter(|ls| seen_language_servers.insert(ls.id()))
356364 .filter_map(|ls| {
357365 let request = ls.document_symbols(doc.identifier())?;
358366 Some((request, ls.offset_encoding(), doc.identifier()))
@@ -413,8 +421,10 @@ pub fn workspace_symbol_picker(cx: &mut Context) {
413421
414422 let get_symbols = move |pattern: String, editor: &mut Editor| {
415423 let doc = doc!(editor);
424+ let mut seen_language_servers = HashSet::new();
416425 let mut futures: FuturesUnordered<_> = doc
417426 .language_servers_with_feature(LanguageServerFeature::WorkspaceSymbols)
427+ .filter(|ls| seen_language_servers.insert(ls.id()))
418428 .filter_map(|ls| Some((ls.workspace_symbols(pattern.clone())?, ls.offset_encoding())))
419429 .map(|(request, offset_encoding)| async move {
420430 let json = request.await?;
@@ -573,8 +583,11 @@ pub fn code_action(cx: &mut Context) {
573583
574584 let selection_range = doc.selection(view.id).primary();
575585
586+ let mut seen_language_servers = HashSet::new();
587+
576588 let mut futures: FuturesUnordered<_> = doc
577589 .language_servers_with_feature(LanguageServerFeature::CodeAction)
590+ .filter(|ls| seen_language_servers.insert(ls.id()))
578591 // TODO this should probably already been filtered in something like "language_servers_with_feature"
579592 .filter_map(|language_server| {
580593 let offset_encoding = language_server.offset_encoding();