@@ -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(),
+ ))
})
}