diff --git a/crates/languages/src/python.rs b/crates/languages/src/python.rs index a70137f3c2b1cc3fcfc8f5fbe98dd7aa52359a2a..cca06f09a55a538490c49c59a3671b3842ea1bf4 100644 --- a/crates/languages/src/python.rs +++ b/crates/languages/src/python.rs @@ -1008,6 +1008,16 @@ fn get_venv_parent_dir(env: &PythonEnvironment) -> Option { venv.parent().map(|parent| parent.to_path_buf()) } +fn wr_distance(wr: &PathBuf, venv: Option<&PathBuf>) -> usize { + if let Some(venv) = venv + && let Ok(p) = venv.strip_prefix(wr) + { + p.components().count() + } else { + usize::MAX + } +} + #[async_trait] impl ToolchainLister for PythonToolchainProvider { async fn list( @@ -1069,12 +1079,7 @@ impl ToolchainLister for PythonToolchainProvider { let proj_ordering = || { let lhs_project = lhs.project.clone().or_else(|| get_venv_parent_dir(lhs)); let rhs_project = rhs.project.clone().or_else(|| get_venv_parent_dir(rhs)); - match (&lhs_project, &rhs_project) { - (Some(l), Some(r)) => (r == &wr).cmp(&(l == &wr)), - (Some(l), None) if l == &wr => Ordering::Less, - (None, Some(r)) if r == &wr => Ordering::Greater, - _ => Ordering::Equal, - } + wr_distance(&wr, lhs_project.as_ref()).cmp(&wr_distance(&wr, rhs_project.as_ref())) }; // Compare environment priorities