Skip to content

Commit b06e29c

Browse files
committed
fix(compile): Specify packages ambiguous targets come from
1 parent b20edd4 commit b06e29c

File tree

2 files changed

+27
-16
lines changed

2 files changed

+27
-16
lines changed

src/cargo/ops/cargo_compile/unit_generator.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -259,16 +259,20 @@ impl<'a> UnitGenerator<'a, '_> {
259259
};
260260
let proposals = self.filter_targets(filter, true, mode);
261261
if proposals.is_empty() {
262-
let targets = self
263-
.packages
264-
.iter()
265-
.flat_map(|pkg| {
266-
pkg.targets()
267-
.iter()
268-
.filter(|target| is_expected_kind(target))
269-
})
270-
.collect::<Vec<_>>();
271-
let suggestion = closest_msg(target_name, targets.iter(), |t| t.name(), "target");
262+
let mut targets = std::collections::BTreeMap::new();
263+
for (pkg, target) in self.packages.iter().flat_map(|pkg| {
264+
pkg.targets()
265+
.iter()
266+
.filter(|target| is_expected_kind(target))
267+
.map(move |t| (pkg, t))
268+
}) {
269+
targets
270+
.entry(target.name())
271+
.or_insert_with(Vec::new)
272+
.push((pkg, target));
273+
}
274+
275+
let suggestion = closest_msg(target_name, targets.keys(), |t| t, "target");
272276
let targets_elsewhere = self.get_targets_from_other_packages(filter)?;
273277
let append_targets_elsewhere = |msg: &mut String| {
274278
let mut available_msg = Vec::new();
@@ -315,8 +319,15 @@ impl<'a> UnitGenerator<'a, '_> {
315319
append_targets_elsewhere(&mut msg)?;
316320
} else if suggestion.is_empty() && !targets.is_empty() {
317321
write!(msg, "\nhelp: available {} targets:", target_desc)?;
318-
for target in targets {
319-
write!(msg, "\n {}", target.name())?;
322+
for (target_name, pkgs) in targets {
323+
if pkgs.len() == 1 {
324+
write!(msg, "\n {target_name}")?;
325+
} else {
326+
for (pkg, _) in pkgs {
327+
let pkg_name = pkg.name();
328+
write!(msg, "\n {target_name} in package {pkg_name}")?;
329+
}
330+
}
320331
}
321332
}
322333
anyhow::bail!(msg);

tests/testsuite/run.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -845,10 +845,10 @@ fn ambiguous_bin_name() {
845845
.with_stderr_data(str![[r#"
846846
[ERROR] no bin target named `crate1/ambiguous` in default-run packages
847847
[HELP] available bin targets:
848-
ambiguous
849-
ambiguous
850-
ambiguous
851-
ambiguous
848+
ambiguous in package crate1
849+
ambiguous in package crate2
850+
ambiguous in package crate3
851+
ambiguous in package crate4
852852
853853
"#]])
854854
.run();

0 commit comments

Comments
 (0)