@@ -353,7 +353,6 @@ pub fn symbol_picker(cx: &mut Context) {
353353
354354 let mut futures: FuturesUnordered<_> = doc
355355 .language_servers_with_feature(LanguageServerFeature::DocumentSymbols)
356− .iter()
357356 .filter_map(|ls| {
358357 let request = ls.document_symbols(doc.identifier())?;
359358 Some((request, ls.offset_encoding(), doc.identifier()))
@@ -420,7 +419,6 @@ pub fn workspace_symbol_picker(cx: &mut Context) {
420419 let doc = doc!(editor);
421420 let mut futures: FuturesUnordered<_> = doc
422421 .language_servers_with_feature(LanguageServerFeature::WorkspaceSymbols)
423− .iter()
424422 .filter_map(|ls| Some((ls.workspace_symbols(pattern.clone())?, ls.offset_encoding())))
425423 .map(|(request, offset_encoding)| async move {
426424 let json = request.await?;
@@ -581,7 +579,6 @@ pub fn code_action(cx: &mut Context) {
581579
582580 let mut futures: FuturesUnordered<_> = doc
583581 .language_servers_with_feature(LanguageServerFeature::CodeAction)
584− .iter()
585582 // TODO this should probably already been filtered in something like "language_servers_with_feature"
586583 .filter_map(|language_server| {
587584 let offset_encoding = language_server.offset_encoding();
@@ -1034,15 +1031,15 @@ fn to_locations(definitions: Option<lsp::GotoDefinitionResponse>) -> Vec<lsp::Lo
10341031// TODO find a way to reduce boilerplate of all the goto functions, without unnecessary complexity...
10351032pub fn goto_declaration(cx: &mut Context) {
10361033 let (view, doc) = current!(cx.editor);
1037− let (future, offset_encoding) = match doc
1034+ let future_offset_encoding = doc
10381035 .language_servers_with_feature(LanguageServerFeature::GotoDeclaration)
1039− .iter()
10401036 .find_map(|language_server| {
10411037 let offset_encoding = language_server.offset_encoding();
10421038 let pos = doc.position(view.id, offset_encoding);
10431039 let future = language_server.goto_declaration(doc.identifier(), pos, None)?;
10441040 Some((future, offset_encoding))
1045− }) {
1041+ });
1042+ let (future, offset_encoding) = match future_offset_encoding {
10461043 Some(future_offset_encoding) => future_offset_encoding,
10471044 None => {
10481045 cx.editor
@@ -1062,15 +1059,15 @@ pub fn goto_declaration(cx: &mut Context) {
10621059
10631060pub fn goto_definition(cx: &mut Context) {
10641061 let (view, doc) = current!(cx.editor);
1065− let (future, offset_encoding) = match doc
1062+ let future_offset_encoding = doc
10661063 .language_servers_with_feature(LanguageServerFeature::GotoDefinition)
1067− .iter()
10681064 .find_map(|language_server| {
10691065 let offset_encoding = language_server.offset_encoding();
10701066 let pos = doc.position(view.id, offset_encoding);
10711067 let future = language_server.goto_definition(doc.identifier(), pos, None)?;
10721068 Some((future, offset_encoding))
1073− }) {
1069+ });
1070+ let (future, offset_encoding) = match future_offset_encoding {
10741071 Some(future_offset_encoding) => future_offset_encoding,
10751072 None => {
10761073 cx.editor
@@ -1090,15 +1087,15 @@ pub fn goto_definition(cx: &mut Context) {
10901087
10911088pub fn goto_type_definition(cx: &mut Context) {
10921089 let (view, doc) = current!(cx.editor);
1093− let (future, offset_encoding) = match doc
1090+ let future_offset_encoding = doc
10941091 .language_servers_with_feature(LanguageServerFeature::GotoTypeDefinition)
1095− .iter()
10961092 .find_map(|language_server| {
10971093 let offset_encoding = language_server.offset_encoding();
10981094 let pos = doc.position(view.id, offset_encoding);
10991095 let future = language_server.goto_type_definition(doc.identifier(), pos, None)?;
11001096 Some((future, offset_encoding))
1101− }) {
1097+ });
1098+ let (future, offset_encoding) = match future_offset_encoding {
11021099 Some(future_offset_encoding) => future_offset_encoding,
11031100 None => {
11041101 cx.editor
@@ -1118,15 +1115,15 @@ pub fn goto_type_definition(cx: &mut Context) {
11181115
11191116pub fn goto_implementation(cx: &mut Context) {
11201117 let (view, doc) = current!(cx.editor);
1121− let (future, offset_encoding) = match doc
1118+ let future_offset_encoding = doc
11221119 .language_servers_with_feature(LanguageServerFeature::GotoImplementation)
1123− .iter()
11241120 .find_map(|language_server| {
11251121 let offset_encoding = language_server.offset_encoding();
11261122 let pos = doc.position(view.id, offset_encoding);
11271123 let future = language_server.goto_implementation(doc.identifier(), pos, None)?;
11281124 Some((future, offset_encoding))
1129− }) {
1125+ });
1126+ let (future, offset_encoding) = match future_offset_encoding {
11301127 Some(future_offset_encoding) => future_offset_encoding,
11311128 None => {
11321129 cx.editor
@@ -1147,9 +1144,8 @@ pub fn goto_implementation(cx: &mut Context) {
11471144pub fn goto_reference(cx: &mut Context) {
11481145 let config = cx.editor.config();
11491146 let (view, doc) = current!(cx.editor);
1150− let (future, offset_encoding) = match doc
1147+ let future_offset_encoding = doc
11511148 .language_servers_with_feature(LanguageServerFeature::GotoReference)
1152− .iter()
11531149 .find_map(|language_server| {
11541150 let offset_encoding = language_server.offset_encoding();
11551151 let pos = doc.position(view.id, offset_encoding);
@@ -1160,7 +1156,8 @@ pub fn goto_reference(cx: &mut Context) {
11601156 None,
11611157 )?;
11621158 Some((future, offset_encoding))
1163− }) {
1159+ });
1160+ let (future, offset_encoding) = match future_offset_encoding {
11641161 Some(future_offset_encoding) => future_offset_encoding,
11651162 None => {
11661163 cx.editor
@@ -1192,13 +1189,14 @@ pub fn signature_help_impl(cx: &mut Context, invoked: SignatureHelpInvoked) {
11921189 let (view, doc) = current!(cx.editor);
11931190
11941191 // TODO merge multiple language server signature help into one instead of just taking the first language server that supports it
1195− let future = match doc
1192+ let future = doc
11961193 .language_servers_with_feature(LanguageServerFeature::SignatureHelp)
1197− .iter()
11981194 .find_map(|language_server| {
11991195 let pos = doc.position(view.id, language_server.offset_encoding());
12001196 language_server.text_document_signature_help(doc.identifier(), pos, None)
1201− }) {
1197+ });
1198+
1199+ let future = match future {
12021200 Some(future) => future.boxed(),
12031201 None => {
12041202 // Do not show the message if signature help was invoked
@@ -1328,7 +1326,6 @@ pub fn hover(cx: &mut Context) {
13281326 // TODO: factor out a doc.position_identifier() that returns lsp::TextDocumentPositionIdentifier
13291327 let request = doc
13301328 .language_servers_with_feature(LanguageServerFeature::Hover)
1331− .iter()
13321329 .find_map(|language_server| {
13331330 let pos = doc.position(view.id, language_server.offset_encoding());
13341331 language_server.text_document_hover(doc.identifier(), pos, None)
@@ -1436,7 +1433,6 @@ pub fn rename_symbol(cx: &mut Context) {
14361433 let (view, doc) = current!(cx.editor);
14371434 let request = doc
14381435 .language_servers_with_feature(LanguageServerFeature::RenameSymbol)
1439− .iter()
14401436 .find_map(|language_server| {
14411437 if let Some(language_server_id) = language_server_id {
14421438 if language_server.id() != language_server_id {
@@ -1475,7 +1471,6 @@ pub fn rename_symbol(cx: &mut Context) {
14751471
14761472 let prepare_rename_request = doc
14771473 .language_servers_with_feature(LanguageServerFeature::RenameSymbol)
1478− .iter()
14791474 .find_map(|language_server| {
14801475 let offset_encoding = language_server.offset_encoding();
14811476 let pos = doc.position(view.id, offset_encoding);
@@ -1516,17 +1511,17 @@ pub fn rename_symbol(cx: &mut Context) {
15161511
15171512pub fn select_references_to_symbol_under_cursor(cx: &mut Context) {
15181513 let (view, doc) = current!(cx.editor);
1519− let (future, offset_encoding) = match doc
1514+ let future_offset_encoding = doc
15201515 .language_servers_with_feature(LanguageServerFeature::DocumentHighlight)
1521− .iter()
15221516 .find_map(|language_server| {
15231517 let offset_encoding = language_server.offset_encoding();
15241518 let pos = doc.position(view.id, offset_encoding);
15251519 let future =
15261520 language_server.text_document_document_highlight(doc.identifier(), pos, None)?;
15271521 Some((future, offset_encoding))
1528− }) {
1529− Some(future) => future,
1522+ });
1523+ let (future, offset_encoding) = match future_offset_encoding {
1524+ Some(future_offset_encoding) => future_offset_encoding,
15301525 None => {
15311526 cx.editor
15321527 .set_error("No language server supports document-highlight");
@@ -1587,8 +1582,8 @@ fn compute_inlay_hints_for_view(
15871582 let view_id = view.id;
15881583 let doc_id = view.doc;
15891584
1590− let language_servers = doc.language_servers_with_feature(LanguageServerFeature::InlayHints);
1591− let language_server = language_servers.iter().find(|language_server| {
1585+ let mut language_servers = doc.language_servers_with_feature(LanguageServerFeature::InlayHints);
1586+ let language_server = language_servers.find(|language_server| {
15921587 matches!(
15931588 language_server.capabilities().inlay_hint_provider,
15941589 Some(