diff --git a/crates/ruff_workspace/src/resolver.rs b/crates/ruff_workspace/src/resolver.rs index cf5a873b83..f82cdd1e77 100644 --- a/crates/ruff_workspace/src/resolver.rs +++ b/crates/ruff_workspace/src/resolver.rs @@ -12,9 +12,8 @@ use globset::{Candidate, GlobSet}; use ignore::{WalkBuilder, WalkState}; use itertools::Itertools; use log::debug; -use matchit::Router; +use matchit::{InsertError, Router}; use path_absolutize::path_dedot; -use radix_trie::{Trie, TrieCommon}; use rustc_hash::{FxHashMap, FxHashSet}; use ruff_linter::fs; @@ -97,13 +96,22 @@ impl Relativity { #[derive(Default)] pub struct Resolver { - router: Trie, + settings: Vec, + router: Router, } impl Resolver { /// Add a resolved [`Settings`] under a given [`PathBuf`] scope. - fn add(&mut self, path: PathBuf, settings: Settings) -> () { - self.router.insert(path, settings); + fn add(&mut self, path: PathBuf, settings: Settings) -> Result<()> { + self.settings.push(settings); + match self.router.insert( + format!("{}/*filepath", path.to_string_lossy()), + self.settings.len() - 1, + ) { + Ok(()) => Ok(()), + Err(InsertError::Conflict { .. }) => Ok(()), + Err(err) => Err(anyhow!("Failed to insert path into router: {err}")), + } } /// Return the appropriate [`Settings`] for a given [`Path`]. @@ -116,8 +124,8 @@ impl Resolver { PyprojectDiscoveryStrategy::Fixed => &pyproject_config.settings, PyprojectDiscoveryStrategy::Hierarchical => self .router - .get_ancestor(path) - .and_then(|subtrie| subtrie.value()) + .at(&path.to_string_lossy()) + .map(|match_| &self.settings[*match_.value]) .unwrap_or(&pyproject_config.settings), } } @@ -162,7 +170,7 @@ impl Resolver { /// Return an iterator over the resolved [`Settings`] in this [`Resolver`]. pub fn settings(&self) -> impl Iterator { - std::iter::empty() + self.settings.iter() } } @@ -292,7 +300,7 @@ pub fn python_files_in_path( if let Some(pyproject) = settings_toml(ancestor)? { let (root, settings) = resolve_scoped_settings(&pyproject, Relativity::Parent, transformer)?; - resolver.add(root, settings); + resolver.add(root, settings)?; break; } } @@ -373,7 +381,13 @@ pub fn python_files_in_path( transformer, ) { Ok((root, settings)) => { - resolver.write().unwrap().add(root, settings); + match resolver.write().unwrap().add(root, settings) { + Ok(()) => {} + Err(err) => { + *error.lock().unwrap() = Err(err); + return WalkState::Quit; + } + } } Err(err) => { *error.lock().unwrap() = Err(err); @@ -493,7 +507,7 @@ pub fn python_file_at_path( if let Some(pyproject) = settings_toml(ancestor)? { let (root, settings) = resolve_scoped_settings(&pyproject, Relativity::Parent, transformer)?; - resolver.add(root, settings); + resolver.add(root, settings)?; break; } }