@@ -311,98 +311,96 @@ impl<'a> Context<'a> {
311
311
& None => String :: new ( ) ,
312
312
& Some ( ref r) => format ! ( " which `{}` depends on" , r. ident) ,
313
313
} ;
314
+ let mut msg = "the following crate versions were found:" . to_string ( ) ;
314
315
let mut err = if !self . rejected_via_hash . is_empty ( ) {
315
- struct_span_err ! ( self . sess,
316
- self . span,
317
- E0460 ,
318
- "found possibly newer version of crate `{}`{}" ,
319
- self . ident,
320
- add)
321
- } else if !self . rejected_via_triple . is_empty ( ) {
322
- struct_span_err ! ( self . sess,
323
- self . span,
324
- E0461 ,
325
- "couldn't find crate `{}` with expected target triple {}{}" ,
326
- self . ident,
327
- self . triple,
328
- add)
329
- } else if !self . rejected_via_kind . is_empty ( ) {
330
- struct_span_err ! ( self . sess,
331
- self . span,
332
- E0462 ,
333
- "found staticlib `{}` instead of rlib or dylib{}" ,
334
- self . ident,
335
- add)
336
- } else if !self . rejected_via_version . is_empty ( ) {
337
- struct_span_err ! ( self . sess,
338
- self . span,
339
- E0514 ,
340
- "found crate `{}` compiled by an incompatible version of rustc{}" ,
341
- self . ident,
342
- add)
343
- } else {
344
316
let mut err = struct_span_err ! ( self . sess,
345
317
self . span,
346
- E0463 ,
347
- "can't find crate for `{}`{}" ,
318
+ E0460 ,
319
+ "found possibly newer version of crate `{}`{}" ,
348
320
self . ident,
349
321
add) ;
350
-
351
- if ( self . ident == "std" || self . ident == "core" )
352
- && self . triple != config:: host_triple ( ) {
353
- err. note ( & format ! ( "the `{}` target may not be installed" , self . triple) ) ;
354
- }
355
- err. span_label ( self . span , "can't find crate" ) ;
356
- err
357
- } ;
358
-
359
- if !self . rejected_via_triple . is_empty ( ) {
360
- let mismatches = self . rejected_via_triple . iter ( ) ;
361
- for ( i, & CrateMismatch { ref path, ref got } ) in mismatches. enumerate ( ) {
362
- err. note ( & format ! ( "crate `{}`, path #{}, triple {}: {}" ,
363
- self . ident,
364
- i + 1 ,
365
- got,
366
- path. display( ) ) ) ;
367
- }
368
- }
369
- if !self . rejected_via_hash . is_empty ( ) {
370
322
err. note ( "perhaps that crate needs to be recompiled?" ) ;
371
323
let mismatches = self . rejected_via_hash . iter ( ) ;
372
- for ( i , & CrateMismatch { ref path, .. } ) in mismatches. enumerate ( ) {
373
- err . note ( & format ! ( "crate `{}` path #{} : {}" , self . ident, i + 1 , path. display( ) ) ) ;
324
+ for & CrateMismatch { ref path, .. } in mismatches {
325
+ msg . push_str ( & format ! ( "\n crate `{}`: {}" , self . ident, path. display( ) ) ) ;
374
326
}
375
327
match self . root {
376
328
& None => { }
377
329
& Some ( ref r) => {
378
- for ( i, path) in r. paths ( ) . iter ( ) . enumerate ( ) {
379
- err. note ( & format ! ( "crate `{}` path #{}: {}" ,
380
- r. ident,
381
- i + 1 ,
382
- path. display( ) ) ) ;
330
+ for path in r. paths ( ) . iter ( ) {
331
+ msg. push_str ( & format ! ( "\n crate `{}`: {}" , r. ident, path. display( ) ) ) ;
383
332
}
384
333
}
385
334
}
386
- }
387
- if !self . rejected_via_kind . is_empty ( ) {
335
+ err. note ( & msg) ;
336
+ err
337
+ } else if !self . rejected_via_triple . is_empty ( ) {
338
+ let mut err = struct_span_err ! ( self . sess,
339
+ self . span,
340
+ E0461 ,
341
+ "couldn't find crate `{}` \
342
+ with expected target triple {}{}",
343
+ self . ident,
344
+ self . triple,
345
+ add) ;
346
+ let mismatches = self . rejected_via_triple . iter ( ) ;
347
+ for & CrateMismatch { ref path, ref got } in mismatches {
348
+ msg. push_str ( & format ! ( "\n crate `{}`, target triple {}: {}" ,
349
+ self . ident,
350
+ got,
351
+ path. display( ) ) ) ;
352
+ }
353
+ err. note ( & msg) ;
354
+ err
355
+ } else if !self . rejected_via_kind . is_empty ( ) {
356
+ let mut err = struct_span_err ! ( self . sess,
357
+ self . span,
358
+ E0462 ,
359
+ "found staticlib `{}` instead of rlib or dylib{}" ,
360
+ self . ident,
361
+ add) ;
388
362
err. help ( "please recompile that crate using --crate-type lib" ) ;
389
363
let mismatches = self . rejected_via_kind . iter ( ) ;
390
- for ( i , & CrateMismatch { ref path, .. } ) in mismatches. enumerate ( ) {
391
- err . note ( & format ! ( "crate `{}` path #{} : {}" , self . ident, i + 1 , path. display( ) ) ) ;
364
+ for & CrateMismatch { ref path, .. } in mismatches {
365
+ msg . push_str ( & format ! ( "\n crate `{}`: {}" , self . ident, path. display( ) ) ) ;
392
366
}
393
- }
394
- if !self . rejected_via_version . is_empty ( ) {
367
+ err. note ( & msg) ;
368
+ err
369
+ } else if !self . rejected_via_version . is_empty ( ) {
370
+ let mut err = struct_span_err ! ( self . sess,
371
+ self . span,
372
+ E0514 ,
373
+ "found crate `{}` compiled by an incompatible version \
374
+ of rustc{}",
375
+ self . ident,
376
+ add) ;
395
377
err. help ( & format ! ( "please recompile that crate using this compiler ({})" ,
396
378
rustc_version( ) ) ) ;
397
379
let mismatches = self . rejected_via_version . iter ( ) ;
398
- for ( i, & CrateMismatch { ref path, ref got } ) in mismatches. enumerate ( ) {
399
- err. note ( & format ! ( "crate `{}` path #{}: {} compiled by {:?}" ,
400
- self . ident,
401
- i + 1 ,
402
- path. display( ) ,
403
- got) ) ;
380
+ for & CrateMismatch { ref path, ref got } in mismatches {
381
+ msg. push_str ( & format ! ( "\n crate `{}` compiled by {}: {}" ,
382
+ self . ident,
383
+ got,
384
+ path. display( ) ) ) ;
404
385
}
405
- }
386
+ err. note ( & msg) ;
387
+ err
388
+ } else {
389
+ let mut err = struct_span_err ! ( self . sess,
390
+ self . span,
391
+ E0463 ,
392
+ "can't find crate for `{}`{}" ,
393
+ self . ident,
394
+ add) ;
395
+
396
+ if ( self . ident == "std" || self . ident == "core" )
397
+ && self . triple != config:: host_triple ( ) {
398
+ err. note ( & format ! ( "the `{}` target may not be installed" , self . triple) ) ;
399
+ }
400
+ err. span_label ( self . span , "can't find crate" ) ;
401
+ err
402
+ } ;
403
+
406
404
if !self . rejected_via_filename . is_empty ( ) {
407
405
let dylibname = self . dylibname ( ) ;
408
406
let mismatches = self . rejected_via_filename . iter ( ) ;
@@ -534,16 +532,23 @@ impl<'a> Context<'a> {
534
532
E0464 ,
535
533
"multiple matching crates for `{}`" ,
536
534
self . crate_name) ;
537
- err. note ( "candidates:" ) ;
538
- for ( _, lib) in libraries {
539
- if let Some ( ( ref p, _) ) = lib. dylib {
540
- err. note ( & format ! ( "path: {}" , p. display( ) ) ) ;
541
- }
542
- if let Some ( ( ref p, _) ) = lib. rlib {
543
- err. note ( & format ! ( "path: {}" , p. display( ) ) ) ;
535
+ let candidates = libraries. iter ( ) . filter_map ( |( _, lib) | {
536
+ let crate_name = & lib. metadata . get_root ( ) . name . as_str ( ) ;
537
+ match & ( & lib. dylib , & lib. rlib ) {
538
+ & ( & Some ( ( ref pd, _) ) , & Some ( ( ref pr, _) ) ) => {
539
+ Some ( format ! ( "\n crate `{}`: {}\n {:>padding$}" ,
540
+ crate_name,
541
+ pd. display( ) ,
542
+ pr. display( ) ,
543
+ padding=8 + crate_name. len( ) ) )
544
+ }
545
+ & ( & Some ( ( ref p, _) ) , & None ) | & ( & None , & Some ( ( ref p, _) ) ) => {
546
+ Some ( format ! ( "\n crate `{}`: {}" , crate_name, p. display( ) ) )
547
+ }
548
+ & ( & None , & None ) => None ,
544
549
}
545
- note_crate_name ( & mut err , & lib . metadata . get_root ( ) . name . as_str ( ) ) ;
546
- }
550
+ } ) . collect :: < String > ( ) ;
551
+ err . note ( & format ! ( "candidates:{}" , candidates ) ) ;
547
552
err. emit ( ) ;
548
553
None
549
554
}
@@ -815,10 +820,6 @@ impl<'a> Context<'a> {
815
820
}
816
821
}
817
822
818
- pub fn note_crate_name ( err : & mut DiagnosticBuilder , name : & str ) {
819
- err. note ( & format ! ( "crate name: {}" , name) ) ;
820
- }
821
-
822
823
// Just a small wrapper to time how long reading metadata takes.
823
824
fn get_metadata_section ( target : & Target ,
824
825
flavor : CrateFlavor ,
0 commit comments