@@ -180,7 +180,7 @@ pub struct Document {
180 pub(crate) modified_since_accessed: bool,
180 pub(crate) modified_since_accessed: bool,
182 diagnostics: Vec<Diagnostic>,
182 diagnostics: Vec<Diagnostic>,
183− language_servers: Vec<Arc<helix_lsp::Client>>,
183+ pub(crate) language_servers: HashMap<LanguageServerName, Arc<Client>>,
185 diff_handle: Option<DiffHandle>,
185 diff_handle: Option<DiffHandle>,
186 version_control_head: Option<Arc<ArcSwap<Box<str>>>>,
186 version_control_head: Option<Arc<ArcSwap<Box<str>>>>,
@@ -580,7 +580,7 @@ where
580 *mut_ref = f(mem::take(mut_ref));
580 *mut_ref = f(mem::take(mut_ref));
583−use helix_lsp::{lsp, Client, OffsetEncoding};
583+use helix_lsp::{lsp, Client, LanguageServerName, OffsetEncoding};
584use url::Url;
584use url::Url;
586impl Document {
586impl Document {
@@ -616,7 +616,7 @@ impl Document {
616 last_saved_time: SystemTime::now(),
616 last_saved_time: SystemTime::now(),
617 last_saved_revision: 0,
617 last_saved_revision: 0,
618 modified_since_accessed: false,
618 modified_since_accessed: false,
619− language_servers: Vec::new(),
619+ language_servers: HashMap::new(),
620 diff_handle: None,
620 diff_handle: None,
622 version_control_head: None,
622 version_control_head: None,
@@ -850,7 +850,7 @@ impl Document {
850 text: text.clone(),
850 text: text.clone(),
853− for language_server in language_servers {
853+ for (_, language_server) in language_servers {
854 if !language_server.is_initialized() {
854 if !language_server.is_initialized() {
855 return Ok(event);
855 return Ok(event);
@@ -1006,11 +1006,6 @@ impl Document {
1010− pub fn set_language_servers(&mut self, language_servers: Vec<Arc<helix_lsp::Client>>) {
1011− self.language_servers = language_servers;
1014 /// Select text within the [`Document`].
1009 /// Select text within the [`Document`].
1015 pub fn set_selection(&mut self, view_id: ViewId, selection: Selection) {
1010 pub fn set_selection(&mut self, view_id: ViewId, selection: Selection) {
1016 // TODO: use a transaction?
1011 // TODO: use a transaction?
@@ -1437,16 +1432,17 @@ impl Document {
1439 pub fn language_servers(&self) -> impl Iterator<Item = &helix_lsp::Client> {
1434 pub fn language_servers(&self) -> impl Iterator<Item = &helix_lsp::Client> {
1440− self.language_servers
1435+ self.language_servers.values().filter_map(|l| {
1442− .filter_map(|l| if l.is_initialized() { Some(&**l) } else { None })
1436+ if l.is_initialized() {
1445 pub fn remove_language_server_by_name(&mut self, name: &str) -> Option<Arc<Client>> {
1444 pub fn remove_language_server_by_name(&mut self, name: &str) -> Option<Arc<Client>> {
1446− match self.language_servers.iter().position(|l| l.name() == name) {
1447− Some(index) => Some(self.language_servers.remove(index)),
1445+ self.language_servers.remove(name)
1452 // TODO filter also based on LSP capabilities?
1448 // TODO filter also based on LSP capabilities?
@@ -1454,12 +1450,15 @@ impl Document {
1455 feature: LanguageServerFeature,
1451 feature: LanguageServerFeature,
1456 ) -> impl Iterator<Item = &helix_lsp::Client> {
1452 ) -> impl Iterator<Item = &helix_lsp::Client> {
1457− self.language_servers().filter(move |server| {
1458− self.language_config()
1453+ self.language_config().into_iter().flat_map(move |config| {
1459− .and_then(|config| config.language_servers.get(server.name()))
1454+ config.language_servers.iter().filter_map(move |features| {
1460− .map_or(false, |server_features| {
1455+ let ls = &**self.language_servers.get(&features.name)?;
1461− server_features.has_feature(feature)
1456+ if ls.is_initialized() && features.has_feature(feature) {
@@ -1610,7 +1609,10 @@ impl Document {
1610 .find(|ls| ls.id() == d.language_server_id)
1609 .find(|ls| ls.id() == d.language_server_id)
1611 .and_then(|ls| {
1610 .and_then(|ls| {
1612 let config = self.language_config()?;
1611 let config = self.language_config()?;
1613− let features = config.language_servers.get(ls.name())?;
1612+ let features = config
1615+ .find(|features| features.name == ls.name())?;
1614 Some(features.has_feature(LanguageServerFeature::Diagnostics))
1616 Some(features.has_feature(LanguageServerFeature::Diagnostics))
1616 == Some(true)
1618 == Some(true)