@@ -259,16 +259,20 @@ impl<'a> UnitGenerator<'a, '_> {
259
259
} ;
260
260
let proposals = self . filter_targets ( filter, true , mode) ;
261
261
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" ) ;
272
276
let targets_elsewhere = self . get_targets_from_other_packages ( filter) ?;
273
277
let append_targets_elsewhere = |msg : & mut String | {
274
278
let mut available_msg = Vec :: new ( ) ;
@@ -315,8 +319,15 @@ impl<'a> UnitGenerator<'a, '_> {
315
319
append_targets_elsewhere ( & mut msg) ?;
316
320
} else if suggestion. is_empty ( ) && !targets. is_empty ( ) {
317
321
write ! ( msg, "\n help: 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
+ }
320
331
}
321
332
}
322
333
anyhow:: bail!( msg) ;
0 commit comments