From 07cb24abddb210bf0e6a8948aac38a9af6914f53 Mon Sep 17 00:00:00 2001
From: Evgeniy Tatarkin <tatarkin.evg@gmail.com>
Date: Tue, 9 Apr 2024 17:28:54 +0300
Subject: [PATCH] Respect lsp definition order for code actions (#9590)

---
 book/src/languages.md           | 2 ++
 helix-term/src/commands/lsp.rs  | 8 ++++----
 helix-term/src/ui/completion.rs | 5 -----
 3 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/book/src/languages.md b/book/src/languages.md
index dd93fec5..33ecbb92 100644
--- a/book/src/languages.md
+++ b/book/src/languages.md
@@ -150,6 +150,8 @@ They have to be defined in the `[language-server]` table as described in the pre
 
 Different languages can use the same language server instance, e.g. `typescript-language-server` is used for javascript, jsx, tsx and typescript by default.
 
+The definition order of language servers affects the order in the results list of code action menu.
+
 In case multiple language servers are specified in the `language-servers` attribute of a `language`,
 it's often useful to only enable/disable certain language-server features for these language servers.
 
diff --git a/helix-term/src/commands/lsp.rs b/helix-term/src/commands/lsp.rs
index 63d1608f..6a5ceae6 100644
--- a/helix-term/src/commands/lsp.rs
+++ b/helix-term/src/commands/lsp.rs
@@ -1,4 +1,4 @@
-use futures_util::{stream::FuturesUnordered, FutureExt};
+use futures_util::{stream::FuturesOrdered, FutureExt};
 use helix_lsp::{
     block_on,
     lsp::{
@@ -341,7 +341,7 @@ pub fn symbol_picker(cx: &mut Context) {
 
     let mut seen_language_servers = HashSet::new();
 
-    let mut futures: FuturesUnordered<_> = doc
+    let mut futures: FuturesOrdered<_> = doc
         .language_servers_with_feature(LanguageServerFeature::DocumentSymbols)
         .filter(|ls| seen_language_servers.insert(ls.id()))
         .map(|language_server| {
@@ -416,7 +416,7 @@ pub fn workspace_symbol_picker(cx: &mut Context) {
     let get_symbols = move |pattern: String, editor: &mut Editor| {
         let doc = doc!(editor);
         let mut seen_language_servers = HashSet::new();
-        let mut futures: FuturesUnordered<_> = doc
+        let mut futures: FuturesOrdered<_> = doc
             .language_servers_with_feature(LanguageServerFeature::WorkspaceSymbols)
             .filter(|ls| seen_language_servers.insert(ls.id()))
             .map(|language_server| {
@@ -574,7 +574,7 @@ pub fn code_action(cx: &mut Context) {
 
     let mut seen_language_servers = HashSet::new();
 
-    let mut futures: FuturesUnordered<_> = doc
+    let mut futures: FuturesOrdered<_> = doc
         .language_servers_with_feature(LanguageServerFeature::CodeAction)
         .filter(|ls| seen_language_servers.insert(ls.id()))
         // TODO this should probably already been filtered in something like "language_servers_with_feature"
diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs
index 6cbb5b10..735bc956 100644
--- a/helix-term/src/ui/completion.rs
+++ b/helix-term/src/ui/completion.rs
@@ -285,11 +285,6 @@ impl Completion {
                     let language_server = language_server!(item);
                     let offset_encoding = language_server.offset_encoding();
 
-                    let language_server = editor
-                        .language_servers
-                        .get_by_id(item.language_server_id)
-                        .unwrap();
-
                     // resolve item if not yet resolved
                     if !item.resolved {
                         if let Some(resolved) =