Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-lsp/src/lib.rs')
-rw-r--r--helix-lsp/src/lib.rs70
1 files changed, 32 insertions, 38 deletions
diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs
index fd5cdb8b..7ece350a 100644
--- a/helix-lsp/src/lib.rs
+++ b/helix-lsp/src/lib.rs
@@ -618,51 +618,45 @@ impl Registry {
Ok(self.inner[id].clone())
}
- /// If this method is called, all documents that have a reference to language servers used by the language config have to refresh their language servers,
- /// as it could be that language servers of these documents were stopped by this method.
+ /// If this method is called, all documents that have a reference to the language server have to refresh their language servers,
/// See helix_view::editor::Editor::refresh_language_servers
- pub fn restart(
+ pub fn restart_server(
&mut self,
+ name: &str,
language_config: &LanguageConfiguration,
doc_path: Option<&std::path::PathBuf>,
root_dirs: &[PathBuf],
enable_snippets: bool,
- ) -> Result<Vec<Arc<Client>>> {
- language_config
- .language_servers
- .iter()
- .filter_map(|LanguageServerFeatures { name, .. }| {
- if let Some(old_clients) = self.inner_by_name.remove(name) {
- if old_clients.is_empty() {
- log::info!("restarting client for '{name}' which was manually stopped");
- } else {
- log::info!("stopping existing clients for '{name}'");
- }
- for old_client in old_clients {
- self.file_event_handler.remove_client(old_client.id());
- self.inner.remove(old_client.id());
- tokio::spawn(async move {
- let _ = old_client.force_shutdown().await;
- });
- }
- }
- let client = match self.start_client(
- name.clone(),
- language_config,
- doc_path,
- root_dirs,
- enable_snippets,
- ) {
- Ok(client) => client,
- Err(StartupError::NoRequiredRootFound) => return None,
- Err(StartupError::Error(err)) => return Some(Err(err)),
- };
- self.inner_by_name
- .insert(name.to_owned(), vec![client.clone()]);
+ ) -> Option<Result<Arc<Client>>> {
+ if let Some(old_clients) = self.inner_by_name.remove(name) {
+ if old_clients.is_empty() {
+ log::info!("restarting client for '{name}' which was manually stopped");
+ } else {
+ log::info!("stopping existing clients for '{name}'");
+ }
+ for old_client in old_clients {
+ self.file_event_handler.remove_client(old_client.id());
+ self.inner.remove(old_client.id());
+ tokio::spawn(async move {
+ let _ = old_client.force_shutdown().await;
+ });
+ }
+ }
+ let client = match self.start_client(
+ name.to_string(),
+ language_config,
+ doc_path,
+ root_dirs,
+ enable_snippets,
+ ) {
+ Ok(client) => client,
+ Err(StartupError::NoRequiredRootFound) => return None,
+ Err(StartupError::Error(err)) => return Some(Err(err)),
+ };
+ self.inner_by_name
+ .insert(name.to_owned(), vec![client.clone()]);
- Some(Ok(client))
- })
- .collect()
+ Some(Ok(client))
}
pub fn stop(&mut self, name: &str) {