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.rs | 70 |
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) { |