diff --git a/integrations/rust-project/src/cli/develop.rs b/integrations/rust-project/src/cli/develop.rs index 3d7aa797e407..0407a5fe43a6 100644 --- a/integrations/rust-project/src/cli/develop.rs +++ b/integrations/rust-project/src/cli/develop.rs @@ -127,13 +127,7 @@ impl Develop { /// For every Rust file, return the relevant buck targets that should be used to configure rust-analyzer. pub(crate) fn related_targets(&self, files: &[PathBuf]) -> Result, anyhow::Error> { // We always want the targets that directly own these Rust files. - let direct_owning_targets = dedupe_unittest(&dedupe_targets( - &self - .resolve_file_owners(files) - .into_values() - .flatten() - .collect::>(), - )); + let direct_owning_targets = dedupe_unittest(&self.resolve_file_targets(files)); let unique_owning_targets = direct_owning_targets .iter() @@ -168,34 +162,57 @@ impl Develop { Ok(targets) } + fn resolve_file_targets(&self, files: &[PathBuf]) -> Vec { + let file_targets = match self.buck.query_owner(files) { + Ok(targets) => { + for (file, targets) in targets.iter() { + if targets.is_empty() { + warn!(file = ?file, "Buck returned zero targets for this file."); + } + } + + targets.into_values().flatten().collect::>() + } + Err(_) => { + let mut file_targets = vec![]; + for file in files { + match self.buck.query_owner(&[file.to_path_buf()]) { + Ok(targets) => { + file_targets.extend(targets.into_values().flatten()); + } + Err(e) => { + warn!(file = ?file, "Could not find a target that owns this file: {:#}", e); + } + } + } + + file_targets + } + }; + + dedupe_targets(&file_targets) + } + pub fn resolve_file_owners(&self, files: &[PathBuf]) -> FxHashMap> { - let owners = match self.buck.query_owner(&files) { + match self.buck.query_owning_buildfile(&files) { Ok(owners) => owners, Err(_) => { let mut owners = FxHashMap::default(); for file in files { - match self.buck.query_owner(&[file.to_path_buf()]) { + match self.buck.query_owning_buildfile(&[file.to_path_buf()]) { Ok(file_owners) => { owners.extend(file_owners.into_iter()); } Err(e) => { - warn!(file = ?file, "Could not find a target that owns this file: {:#}", e); + warn!(file = ?file, "Could not find a target that owns this file: {}", e); } } } owners } - }; - - for (file, targets) in owners.iter() { - if targets.is_empty() { - warn!(file = ?file, "Buck returned zero targets for this file."); - } } - - owners } pub(crate) fn run(&self, targets: Vec) -> Result {