diff --git a/crates/extension/src/extension_lsp_adapter.rs b/crates/extension/src/extension_lsp_adapter.rs index f82b6c9e0e..d6125241f1 100644 --- a/crates/extension/src/extension_lsp_adapter.rs +++ b/crates/extension/src/extension_lsp_adapter.rs @@ -38,7 +38,7 @@ impl LspAdapter for ExtensionLspAdapter { fn get_language_server_command<'a>( self: Arc, - _: Arc, + _: Option>, delegate: Arc, _: futures::lock::MutexGuard<'a, Option>, _: &'a mut AsyncAppContext, diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 7901a49d00..309a67a1a9 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -208,7 +208,7 @@ impl CachedLspAdapter { pub async fn get_language_server_command( self: Arc, - container_dir: Arc, + container_dir: Option>, delegate: Arc, cx: &mut AsyncAppContext, ) -> Result { @@ -294,7 +294,7 @@ pub trait LspAdapter: 'static + Send + Sync { fn get_language_server_command<'a>( self: Arc, - container_dir: Arc, + container_dir: Option>, delegate: Arc, mut cached_binary: futures::lock::MutexGuard<'a, Option>, cx: &'a mut AsyncAppContext, @@ -325,6 +325,10 @@ pub trait LspAdapter: 'static + Send + Sync { return Ok(cached_binary.clone()); } + let Some(container_dir) = container_dir else { + anyhow::bail!("cannot download language servers for remotes (yet)") + }; + if !container_dir.exists() { smol::fs::create_dir_all(&container_dir) .await @@ -1664,7 +1668,7 @@ impl LspAdapter for FakeLspAdapter { fn get_language_server_command<'a>( self: Arc, - _: Arc, + _: Option>, _: Arc, _: futures::lock::MutexGuard<'a, Option>, _: &'a mut AsyncAppContext, diff --git a/crates/language/src/language_registry.rs b/crates/language/src/language_registry.rs index 918da4873f..17ebef50e8 100644 --- a/crates/language/src/language_registry.rs +++ b/crates/language/src/language_registry.rs @@ -869,12 +869,10 @@ impl LanguageRegistry { adapter.name.0 ); - let download_dir = &self - .language_server_download_dir - .clone() - .ok_or_else(|| anyhow!("language server download directory has not been assigned before starting server")) - .log_err()?; - let container_dir: Arc = Arc::from(download_dir.join(adapter.name.0.as_ref())); + let container_dir: Option> = self + .language_server_download_dir + .as_ref() + .map(|dir| Arc::from(dir.join(adapter.name.0.as_ref()))); let root_path = root_path.clone(); let this = Arc::downgrade(self); @@ -969,7 +967,7 @@ impl LanguageRegistry { Some(PendingLanguageServer { server_id, task, - container_dir: Some(container_dir), + container_dir, }) } diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 24852afd70..6dd528147b 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -4742,17 +4742,6 @@ impl LspStore { .reorder_language_servers(&language, enabled_lsp_adapters); } - /* - ssh client owns the lifecycle of the language servers - ssh host actually runs the binaries - - in the future: ssh client will use the local extensions to get the downloads etc. - and send them up over the ssh connection (but today) we'll just the static config - - languages::() <-- registers lsp adapters - on the ssh host we won't have adapters for the LSPs - */ - fn start_language_server_on_ssh_host( &mut self, worktree: &Model, diff --git a/crates/remote_server/src/headless_project.rs b/crates/remote_server/src/headless_project.rs index ec26bddfc3..bbd82281d8 100644 --- a/crates/remote_server/src/headless_project.rs +++ b/crates/remote_server/src/headless_project.rs @@ -42,11 +42,7 @@ impl HeadlessProject { } pub fn new(session: Arc, fs: Arc, cx: &mut ModelContext) -> Self { - let mut languages = LanguageRegistry::new(cx.background_executor().clone()); - languages - .set_language_server_download_dir(PathBuf::from("/Users/conrad/what-could-go-wrong")); - - let languages = Arc::new(languages); + let languages = Arc::new(LanguageRegistry::new(cx.background_executor().clone())); let worktree_store = cx.new_model(|_| WorktreeStore::new(true, fs.clone())); let buffer_store = cx.new_model(|cx| {