diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 8c2596f11f..670256d87c 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -326,43 +326,25 @@ pub trait LspAdapter: 'static + Send + Sync { .context("failed to create container directory")?; } - if let Some(task) = self.will_fetch_server(&delegate, cx) { - task.await?; - } - - let name = self.name(); - log::info!("fetching latest version of language server {:?}", name.0); - delegate.update_status( - name.clone(), - LanguageServerBinaryStatus::CheckingForUpdate, - ); - let latest_version = self.fetch_latest_server_version(delegate.as_ref()).await?; - - log::info!("downloading language server {:?}", name.0); - delegate.update_status(self.name(), LanguageServerBinaryStatus::Downloading); - let mut binary = self - .fetch_server_binary(latest_version, container_dir.to_path_buf(), delegate.as_ref()) - .await; - - delegate.update_status(name.clone(), LanguageServerBinaryStatus::Downloaded); + let mut binary = try_fetch_server_binary(self.as_ref(), &delegate, container_dir.to_path_buf(), cx).await; if let Err(error) = binary.as_ref() { if let Some(prev_downloaded_binary) = self .cached_server_binary(container_dir.to_path_buf(), delegate.as_ref()) .await { - delegate.update_status(name.clone(), LanguageServerBinaryStatus::Cached); + delegate.update_status(self.name(), LanguageServerBinaryStatus::Cached); log::info!( "failed to fetch newest version of language server {:?}. falling back to using {:?}", - name.clone(), - prev_downloaded_binary.path.display() + self.name(), + prev_downloaded_binary.path ); binary = Ok(prev_downloaded_binary); } else { delegate.update_status( - name.clone(), + self.name(), LanguageServerBinaryStatus::Failed { - error: format!("{:?}", error), + error: format!("{error:?}"), }, ); } @@ -500,6 +482,33 @@ pub trait LspAdapter: 'static + Send + Sync { } } +async fn try_fetch_server_binary( + adapter: &L, + delegate: &Arc, + container_dir: PathBuf, + cx: &mut AsyncAppContext, +) -> Result { + if let Some(task) = adapter.will_fetch_server(delegate, cx) { + task.await?; + } + + let name = adapter.name(); + log::info!("fetching latest version of language server {:?}", name.0); + delegate.update_status(name.clone(), LanguageServerBinaryStatus::CheckingForUpdate); + let latest_version = adapter + .fetch_latest_server_version(delegate.as_ref()) + .await?; + + log::info!("downloading language server {:?}", name.0); + delegate.update_status(adapter.name(), LanguageServerBinaryStatus::Downloading); + let binary = adapter + .fetch_server_binary(latest_version, container_dir, delegate.as_ref()) + .await; + + delegate.update_status(name.clone(), LanguageServerBinaryStatus::Downloaded); + binary +} + #[derive(Clone, Debug, PartialEq, Eq)] pub struct CodeLabel { /// The text to display. diff --git a/crates/languages/src/rust.rs b/crates/languages/src/rust.rs index 2a58bc6015..5b83249fb3 100644 --- a/crates/languages/src/rust.rs +++ b/crates/languages/src/rust.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, bail, Result}; +use anyhow::{anyhow, bail, Context, Result}; use async_compression::futures::bufread::GzipDecoder; use async_trait::async_trait; use futures::{io::BufReader, StreamExt}; @@ -79,7 +79,7 @@ impl LspAdapter for RustLspAdapter { .assets .iter() .find(|asset| asset.name == asset_name) - .ok_or_else(|| anyhow!("no asset found matching {:?}", asset_name))?; + .with_context(|| format!("no asset found matching `{asset_name:?}`"))?; Ok(Box::new(GitHubLspBinaryVersion { name: release.tag_name, url: asset.browser_download_url.clone(),