From 58c913ce4567a95c52808d78245eb1dac806971c Mon Sep 17 00:00:00 2001 From: Philipp Mildenberger Date: Sun, 19 Mar 2023 19:26:39 +0100 Subject: [PATCH] Simplify 'lsp_stop' command --- helix-term/src/commands/typed.rs | 53 +++----------------------------- helix-view/src/document.rs | 7 +++++ 2 files changed, 12 insertions(+), 48 deletions(-) diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index 5f94b7c48..8cfc9fd22 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -1442,62 +1442,19 @@ fn lsp_stop( return Ok(()); } - let doc = doc!(cx.editor); - - // TODO this stops language servers which may be used in another doc/language type that uses the same language servers - // I'm not sure if this is really what we want - let ls_shutdown_names = doc + let ls_shutdown_names = doc!(cx.editor) .language_servers() - .map(|ls| ls.name()) + .map(|ls| ls.name().to_string()) .collect::>(); for ls_name in &ls_shutdown_names { cx.editor.language_servers.stop(ls_name); - } - let doc_ids_active_clients: Vec<_> = cx - .editor - .documents() - .filter_map(|doc| { - let doc_active_ls_ids: Vec<_> = doc - .language_servers() - .filter(|ls| !ls_shutdown_names.contains(&ls.name())) - .map(|ls| ls.id()) - .collect(); - - let active_clients: Vec<_> = cx - .editor - .language_servers - .iter_clients() - .filter(|client| doc_active_ls_ids.contains(&client.id())) - .map(Clone::clone) - .collect(); - - if active_clients.len() != doc.language_servers().count() { - Some((doc.id(), active_clients)) - } else { - None + for doc in cx.editor.documents_mut() { + if let Some(client) = doc.remove_language_server_by_name(ls_name) { + doc.clear_diagnostics(client.id()); } - }) - .collect(); - - for (doc_id, active_clients) in doc_ids_active_clients { - let doc = cx.editor.documents.get_mut(&doc_id).unwrap(); - - let stopped_clients: Vec<_> = doc - .language_servers() - .filter(|ls| { - !active_clients - .iter() - .any(|active_ls| active_ls.id() == ls.id()) - }) - .map(|ls| ls.id()) - .collect(); // is necessary because of borrow-checking - - for client_id in stopped_clients { - doc.clear_diagnostics(client_id) } - doc.set_language_servers(active_clients); } Ok(()) diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 3fd271eb9..49eb13a0f 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -1442,6 +1442,13 @@ impl Document { .filter_map(|l| if l.is_initialized() { Some(&**l) } else { None }) } + pub fn remove_language_server_by_name(&mut self, name: &str) -> Option> { + match self.language_servers.iter().position(|l| l.name() == name) { + Some(index) => Some(self.language_servers.remove(index)), + None => None, + } + } + // TODO filter also based on LSP capabilities? pub fn language_servers_with_feature( &self,