summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-term/src/commands/typed.rs53
-rw-r--r--helix-view/src/document.rs7
2 files changed, 12 insertions, 48 deletions
diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs
index 5f94b7c4..8cfc9fd2 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::<Vec<_>>();
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 3fd271eb..49eb13a0 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<Arc<Client>> {
+ 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,