diff --git a/crates/editor/src/lsp_ext.rs b/crates/editor/src/lsp_ext.rs index 4265002366463b022c0a53d558bdde15e16d3a83..2937e75943970cf3f7011b053daecff6ccd961ca 100644 --- a/crates/editor/src/lsp_ext.rs +++ b/crates/editor/src/lsp_ext.rs @@ -1,6 +1,8 @@ +use std::collections::hash_map::Entry; use std::sync::Arc; use crate::Editor; +use collections::HashMap; use gpui::{Model, WindowContext}; use language::Buffer; use language::Language; @@ -20,6 +22,7 @@ where return None; }; let multibuffer = editor.buffer().read(cx); + let mut language_servers_for = HashMap::default(); editor .selections .disjoint_anchors() @@ -28,27 +31,36 @@ where .filter_map(|selection| Some((selection.start.buffer_id?, selection.start))) .filter_map(|(buffer_id, trigger_anchor)| { let buffer = multibuffer.buffer(buffer_id)?; + let server_id = *match language_servers_for.entry(buffer_id) { + Entry::Occupied(occupied_entry) => occupied_entry.into_mut(), + Entry::Vacant(vacant_entry) => { + let language_server_id = project + .read(cx) + .language_servers_for_local_buffer(buffer.read(cx), cx) + .find_map(|(adapter, server)| { + if adapter.name.0.as_ref() == language_server_name { + Some(server.server_id()) + } else { + None + } + }); + vacant_entry.insert(language_server_id) + } + } + .as_ref()?; + + Some((buffer, trigger_anchor, server_id)) + }) + .find_map(|(buffer, trigger_anchor, server_id)| { let language = buffer.read(cx).language_at(trigger_anchor.text_anchor)?; if !filter_language(&language) { return None; } - Some((trigger_anchor, language, buffer)) - }) - .find_map(|(trigger_anchor, language, buffer)| { - project - .read(cx) - .language_servers_for_local_buffer(buffer.read(cx), cx) - .find_map(|(adapter, server)| { - if adapter.name.0.as_ref() == language_server_name { - Some(( - trigger_anchor, - Arc::clone(&language), - server.server_id(), - buffer.clone(), - )) - } else { - None - } - }) + Some(( + trigger_anchor, + Arc::clone(&language), + server_id, + buffer.clone(), + )) }) }