@@ -212,6 +212,7 @@ fn parse_diagnostics(message: &str, group: u64) -> Option<FileDiagnostic> {
212
212
let rls_span = primary_span. rls_span ( ) . zero_indexed ( ) ;
213
213
let suggestions = make_suggestions ( & message. children , & rls_span. file ) ;
214
214
215
+ let mut source = "rustc" ;
215
216
let diagnostic = {
216
217
let mut primary_message = diagnostic_msg. clone ( ) ;
217
218
if let Some ( ref primary_label) = primary_span. label {
@@ -224,14 +225,20 @@ fn parse_diagnostics(message: &str, group: u64) -> Option<FileDiagnostic> {
224
225
primary_message. push_str ( & format ! ( "\n \n {}" , notes) ) ;
225
226
}
226
227
228
+ // A diagnostic source is quite likely to be clippy if it contains
229
+ // the further information link to the rust-clippy project.
230
+ if primary_message. contains ( "rust-clippy" ) {
231
+ source = "clippy"
232
+ }
233
+
227
234
Diagnostic {
228
235
range : ls_util:: rls_to_range ( rls_span. range ) ,
229
236
severity : Some ( severity ( & message. level ) ) ,
230
237
code : Some ( NumberOrString :: String ( match message. code {
231
238
Some ( ref c) => c. code . clone ( ) ,
232
239
None => String :: new ( ) ,
233
240
} ) ) ,
234
- source : Some ( "rustc" . into ( ) ) ,
241
+ source : Some ( source . to_owned ( ) ) ,
235
242
message : primary_message. trim ( ) . to_owned ( ) ,
236
243
group : if message. spans . iter ( ) . any ( |x| !x. is_primary ) {
237
244
Some ( group)
@@ -268,7 +275,7 @@ fn parse_diagnostics(message: &str, group: u64) -> Option<FileDiagnostic> {
268
275
Some ( ref c) => c. code . clone ( ) ,
269
276
None => String :: new ( ) ,
270
277
} ) ) ,
271
- source : Some ( "rustc" . into ( ) ) ,
278
+ source : Some ( source . to_owned ( ) ) ,
272
279
message : secondary_message. trim ( ) . to_owned ( ) ,
273
280
group : Some ( group) ,
274
281
}
@@ -376,12 +383,24 @@ impl IsWithin for DiagnosticSpan {
376
383
mod diagnostic_message_test {
377
384
use super :: * ;
378
385
379
- /// Returns (primary message, secondary messages)
380
- fn parsed_message ( compiler_message : & str ) -> ( String , Vec < String > ) {
386
+ fn parse_compiler_message ( compiler_message : & str ) -> FileDiagnostic {
381
387
let _ = :: env_logger:: try_init ( ) ;
382
- let parsed = parse_diagnostics ( compiler_message, 0 )
383
- . expect ( "failed to parse compiler message" ) ;
384
- ( parsed. diagnostic . message , parsed. secondaries . into_iter ( ) . map ( |s| s. message ) . collect ( ) )
388
+ parse_diagnostics ( compiler_message, 0 )
389
+ . expect ( "failed to parse compiler message" )
390
+ }
391
+
392
+ trait FileDiagnosticTestExt {
393
+ /// Returns (primary message, secondary messages)
394
+ fn to_messages ( & self ) -> ( String , Vec < String > ) ;
395
+ }
396
+
397
+ impl FileDiagnosticTestExt for FileDiagnostic {
398
+ fn to_messages ( & self ) -> ( String , Vec < String > ) {
399
+ (
400
+ self . diagnostic . message . clone ( ) ,
401
+ self . secondaries . iter ( ) . map ( |d| d. message . clone ( ) ) . collect ( )
402
+ )
403
+ }
385
404
}
386
405
387
406
/// ```
@@ -393,9 +412,16 @@ mod diagnostic_message_test {
393
412
/// ```
394
413
#[ test]
395
414
fn message_use_after_move ( ) {
396
- let ( msg , others ) = parsed_message (
415
+ let diag = parse_compiler_message (
397
416
include_str ! ( "../../test_data/compiler_message/use-after-move.json" )
398
417
) ;
418
+
419
+ assert_eq ! ( diag. diagnostic. source, Some ( "rustc" . into( ) ) ) ;
420
+ for source in diag. secondaries . iter ( ) . map ( |d| d. source . as_ref ( ) ) {
421
+ assert_eq ! ( source, Some ( & "rustc" . into( ) ) ) ;
422
+ }
423
+
424
+ let ( msg, others) = diag. to_messages ( ) ;
399
425
assert_eq ! (
400
426
msg,
401
427
"use of moved value: `s`\n \n \
@@ -416,9 +442,9 @@ mod diagnostic_message_test {
416
442
/// ```
417
443
#[ test]
418
444
fn message_type_annotations_needed ( ) {
419
- let ( msg, others) = parsed_message (
445
+ let ( msg, others) = parse_compiler_message (
420
446
include_str ! ( "../../test_data/compiler_message/type-annotations-needed.json" )
421
- ) ;
447
+ ) . to_messages ( ) ;
422
448
assert_eq ! (
423
449
msg,
424
450
"type annotations needed\n \n \
@@ -438,9 +464,9 @@ mod diagnostic_message_test {
438
464
/// ```
439
465
#[ test]
440
466
fn message_mismatched_types ( ) {
441
- let ( msg, others) = parsed_message (
467
+ let ( msg, others) = parse_compiler_message (
442
468
include_str ! ( "../../test_data/compiler_message/mismatched-types.json" )
443
- ) ;
469
+ ) . to_messages ( ) ;
444
470
assert_eq ! (
445
471
msg,
446
472
"mismatched types\n \n \
@@ -461,9 +487,9 @@ mod diagnostic_message_test {
461
487
/// ```
462
488
#[ test]
463
489
fn message_not_mutable ( ) {
464
- let ( msg, others) = parsed_message (
490
+ let ( msg, others) = parse_compiler_message (
465
491
include_str ! ( "../../test_data/compiler_message/not-mut.json" )
466
- ) ;
492
+ ) . to_messages ( ) ;
467
493
assert_eq ! (
468
494
msg,
469
495
"cannot borrow immutable local variable `string` as mutable\n \n \
@@ -485,9 +511,9 @@ mod diagnostic_message_test {
485
511
/// ```
486
512
#[ test]
487
513
fn message_consider_borrowing ( ) {
488
- let ( msg, others) = parsed_message (
514
+ let ( msg, others) = parse_compiler_message (
489
515
include_str ! ( "../../test_data/compiler_message/consider-borrowing.json" )
490
- ) ;
516
+ ) . to_messages ( ) ;
491
517
assert_eq ! (
492
518
msg,
493
519
r#"mismatched types
@@ -512,9 +538,9 @@ help: consider borrowing here: `&string`"#,
512
538
/// ```
513
539
#[ test]
514
540
fn message_move_out_of_borrow ( ) {
515
- let ( msg, others) = parsed_message (
541
+ let ( msg, others) = parse_compiler_message (
516
542
include_str ! ( "../../test_data/compiler_message/move-out-of-borrow.json" )
517
- ) ;
543
+ ) . to_messages ( ) ;
518
544
assert_eq ! ( msg, "cannot move out of borrowed content" ) ;
519
545
520
546
assert_eq ! ( others, vec![ "hint: to prevent move, use `ref string` or `ref mut string`" ] ) ;
@@ -525,9 +551,9 @@ help: consider borrowing here: `&string`"#,
525
551
/// ```
526
552
#[ test]
527
553
fn message_unused_use ( ) {
528
- let ( msg, others) = parsed_message (
554
+ let ( msg, others) = parse_compiler_message (
529
555
include_str ! ( "../../test_data/compiler_message/unused-use.json" )
530
- ) ;
556
+ ) . to_messages ( ) ;
531
557
assert_eq ! ( msg, "unused import: `std::borrow::Cow`\n \n \
532
558
note: #[warn(unused_imports)] on by default") ;
533
559
@@ -536,12 +562,45 @@ help: consider borrowing here: `&string`"#,
536
562
537
563
#[ test]
538
564
fn message_cannot_find_type ( ) {
539
- let ( msg, others) = parsed_message (
565
+ let ( msg, others) = parse_compiler_message (
540
566
include_str ! ( "../../test_data/compiler_message/cannot-find-type.json" )
541
- ) ;
567
+ ) . to_messages ( ) ;
542
568
assert_eq ! ( msg, "cannot find type `HashSet` in this scope\n \n \
543
569
not found in this scope") ;
544
570
545
571
assert ! ( others. is_empty( ) , "{:?}" , others) ;
546
572
}
573
+
574
+ /// ```
575
+ /// let _s = 1 / 1;
576
+ /// ```
577
+ #[ test]
578
+ fn message_clippy_identity_op ( ) {
579
+ let diag = parse_compiler_message (
580
+ include_str ! ( "../../test_data/compiler_message/clippy-identity-op.json" )
581
+ ) ;
582
+
583
+ assert_eq ! ( diag. diagnostic. source, Some ( "clippy" . into( ) ) ) ;
584
+ for source in diag. secondaries . iter ( ) . map ( |d| d. source . as_ref ( ) ) {
585
+ assert_eq ! ( source, Some ( & "clippy" . into( ) ) ) ;
586
+ }
587
+
588
+ let ( msg, others) = diag. to_messages ( ) ;
589
+ println ! ( "\n ---message---\n {}\n ---" , msg) ;
590
+
591
+ let link = {
592
+ let link_index = msg. find ( "https://rust-lang-nursery.github.io/rust-clippy/" )
593
+ . expect ( "no clippy link found in message" ) ;
594
+ & msg[ link_index..]
595
+ } ;
596
+
597
+ assert_eq ! (
598
+ msg,
599
+ "the operation is ineffective. Consider reducing it to `1`\n \n \
600
+ note: #[warn(identity_op)] implied by #[warn(clippy)]\n \
601
+ help: for further information visit ". to_owned( ) + link
602
+ ) ;
603
+
604
+ assert ! ( others. is_empty( ) , "{:?}" , others) ;
605
+ }
547
606
}
0 commit comments