on master help sign in
Simplify 'lsp_stop' command
58c913cPhilipp Mildenberger
helix-term/src/commands/typed.rs+5−48
@@ -1442,62 +1442,19 @@ fn lsp_stop(
1442 return Ok(());
1442 return Ok(());
1443 }
1443 }
1444
1444
1445− let doc = doc!(cx.editor);
1445+ let ls_shutdown_names = doc!(cx.editor)
1446−
1447− // TODO this stops language servers which may be used in another doc/language type that uses the same language servers
1448− // I'm not sure if this is really what we want
1449− let ls_shutdown_names = doc
1450 .language_servers()
1446 .language_servers()
1451− .map(|ls| ls.name())
1447+ .map(|ls| ls.name().to_string())
1452 .collect::<Vec<_>>();
1448 .collect::<Vec<_>>();
1453
1449
1454 for ls_name in &ls_shutdown_names {
1450 for ls_name in &ls_shutdown_names {
1455 cx.editor.language_servers.stop(ls_name);
1451 cx.editor.language_servers.stop(ls_name);
1456− }
1457
1452
1458− let doc_ids_active_clients: Vec<_> = cx
1453+ for doc in cx.editor.documents_mut() {
1459− .editor
1454+ if let Some(client) = doc.remove_language_server_by_name(ls_name) {
1460− .documents()
1455+ doc.clear_diagnostics(client.id());
1461− .filter_map(|doc| {
1462− let doc_active_ls_ids: Vec<_> = doc
1463− .language_servers()
1464− .filter(|ls| !ls_shutdown_names.contains(&ls.name()))
1465− .map(|ls| ls.id())
1466− .collect();
1467−
1468− let active_clients: Vec<_> = cx
1469− .editor
1470− .language_servers
1471− .iter_clients()
1472− .filter(|client| doc_active_ls_ids.contains(&client.id()))
1473− .map(Clone::clone)
1474− .collect();
1475−
1476− if active_clients.len() != doc.language_servers().count() {
1477− Some((doc.id(), active_clients))
1478− } else {
1479− None
1480 }
1456 }
1481− })
1482− .collect();
1483−
1484− for (doc_id, active_clients) in doc_ids_active_clients {
1485− let doc = cx.editor.documents.get_mut(&doc_id).unwrap();
1486−
1487− let stopped_clients: Vec<_> = doc
1488− .language_servers()
1489− .filter(|ls| {
1490− !active_clients
1491− .iter()
1492− .any(|active_ls| active_ls.id() == ls.id())
1493− })
1494− .map(|ls| ls.id())
1495− .collect(); // is necessary because of borrow-checking
1496−
1497− for client_id in stopped_clients {
1498− doc.clear_diagnostics(client_id)
1499 }
1457 }
1500− doc.set_language_servers(active_clients);
1501 }
1458 }
1502
1459
1503 Ok(())
1460 Ok(())
helix-view/src/document.rs+7
@@ -1442,6 +1442,13 @@ impl Document {
1442 .filter_map(|l| if l.is_initialized() { Some(&**l) } else { None })
1442 .filter_map(|l| if l.is_initialized() { Some(&**l) } else { None })
1443 }
1443 }
1444
1444
1445+ 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)),
1448+ None => None,
1449+ }
1450+ }
1451+
1445 // TODO filter also based on LSP capabilities?
1452 // TODO filter also based on LSP capabilities?
1446 pub fn language_servers_with_feature(
1453 pub fn language_servers_with_feature(
1447 &self,
1454 &self,