From 10f172ddacc582066fb006c98c0caed2acc2b26b Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Thu, 18 Sep 2025 14:45:02 -0400 Subject: [PATCH] python: Install basedpyright if the basedpyright-langserver binary is missing (#38426) Potential fix for #38377 Release Notes: - N/A --------- Co-authored-by: Peter Tripp --- crates/language/src/language.rs | 5 +---- crates/languages/src/python.rs | 24 ++++++++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 256f6d45734ec068f1e038fe0d07049bb732e34b..3cf39fa2bde3222fdfb0a07dd739d31b47d23304 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -57,7 +57,7 @@ use std::{ str, sync::{ Arc, LazyLock, - atomic::{AtomicU64, AtomicUsize, Ordering::SeqCst}, + atomic::{AtomicUsize, Ordering::SeqCst}, }, }; use syntax_map::{QueryCursorHandle, SyntaxSnapshot}; @@ -166,7 +166,6 @@ pub struct CachedLspAdapter { pub disk_based_diagnostics_progress_token: Option, language_ids: HashMap, pub adapter: Arc, - pub reinstall_attempt_count: AtomicU64, cached_binary: futures::lock::Mutex>, } @@ -183,7 +182,6 @@ impl Debug for CachedLspAdapter { &self.disk_based_diagnostics_progress_token, ) .field("language_ids", &self.language_ids) - .field("reinstall_attempt_count", &self.reinstall_attempt_count) .finish_non_exhaustive() } } @@ -202,7 +200,6 @@ impl CachedLspAdapter { language_ids, adapter, cached_binary: Default::default(), - reinstall_attempt_count: AtomicU64::new(0), }) } diff --git a/crates/languages/src/python.rs b/crates/languages/src/python.rs index ede46b38e5ada332e10db4feb72ae11767e839bd..2a8f087e1f5b1a03be36b7e49d2ca79fc13ff988 100644 --- a/crates/languages/src/python.rs +++ b/crates/languages/src/python.rs @@ -1181,6 +1181,10 @@ impl LspAdapter for PyLspAdapter { "pylsp-mypy installation failed" ); let pylsp = venv.join(BINARY_DIR).join("pylsp"); + delegate + .which(pylsp.as_os_str()) + .await + .context("pylsp installation was incomplete")?; Ok(LanguageServerBinary { path: pylsp, env: None, @@ -1195,6 +1199,7 @@ impl LspAdapter for PyLspAdapter { ) -> Option { let venv = self.base_venv(delegate).await.ok()?; let pylsp = venv.join(BINARY_DIR).join("pylsp"); + delegate.which(pylsp.as_os_str()).await?; Some(LanguageServerBinary { path: pylsp, env: None, @@ -1364,9 +1369,11 @@ impl BasedPyrightLspAdapter { .arg("venv") .arg("basedpyright-venv") .current_dir(work_dir) - .spawn()? + .spawn() + .context("spawning child")? .output() - .await?; + .await + .context("getting child output")?; } Ok(path.into()) @@ -1470,9 +1477,13 @@ impl LspAdapter for BasedPyrightLspAdapter { .success(), "basedpyright installation failed" ); - let pylsp = venv.join(BINARY_DIR).join(Self::BINARY_NAME); + let path = venv.join(BINARY_DIR).join(Self::BINARY_NAME); + delegate + .which(path.as_os_str()) + .await + .context("basedpyright installation was incomplete")?; Ok(LanguageServerBinary { - path: pylsp, + path, env: None, arguments: vec!["--stdio".into()], }) @@ -1484,9 +1495,10 @@ impl LspAdapter for BasedPyrightLspAdapter { delegate: &dyn LspAdapterDelegate, ) -> Option { let venv = self.base_venv(delegate).await.ok()?; - let pylsp = venv.join(BINARY_DIR).join(Self::BINARY_NAME); + let path = venv.join(BINARY_DIR).join(Self::BINARY_NAME); + delegate.which(path.as_os_str()).await?; Some(LanguageServerBinary { - path: pylsp, + path, env: None, arguments: vec!["--stdio".into()], })