@@ -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, "\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+ }
320331 }
321332 }
322333 anyhow:: bail!( msg) ;
0 commit comments