Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.

Commit 52f5348

Browse files
authored
Merge pull request #705 from alexheretic/clippy-source
Detect clippy diagnostic source
2 parents d8998b6 + 3aae14e commit 52f5348

File tree

4 files changed

+151
-26
lines changed

4 files changed

+151
-26
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ rls-rustc = "0.2.1"
2626
rls-span = { version = "0.4", features = ["serialize-serde"] }
2727
rls-vfs = { version = "0.4", features = ["racer-impls"] }
2828
rustfmt-nightly = { version = "0.3.8", optional = true }
29-
clippy_lints = { version = "0.0.185", optional = true }
29+
clippy_lints = { version = "0.0.186", optional = true }
3030
serde = "1.0"
3131
serde_json = "1.0"
3232
serde_derive = "1.0"

src/actions/post_build.rs

Lines changed: 81 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ fn parse_diagnostics(message: &str, group: u64) -> Option<FileDiagnostic> {
212212
let rls_span = primary_span.rls_span().zero_indexed();
213213
let suggestions = make_suggestions(&message.children, &rls_span.file);
214214

215+
let mut source = "rustc";
215216
let diagnostic = {
216217
let mut primary_message = diagnostic_msg.clone();
217218
if let Some(ref primary_label) = primary_span.label {
@@ -224,14 +225,20 @@ fn parse_diagnostics(message: &str, group: u64) -> Option<FileDiagnostic> {
224225
primary_message.push_str(&format!("\n\n{}", notes));
225226
}
226227

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+
227234
Diagnostic {
228235
range: ls_util::rls_to_range(rls_span.range),
229236
severity: Some(severity(&message.level)),
230237
code: Some(NumberOrString::String(match message.code {
231238
Some(ref c) => c.code.clone(),
232239
None => String::new(),
233240
})),
234-
source: Some("rustc".into()),
241+
source: Some(source.to_owned()),
235242
message: primary_message.trim().to_owned(),
236243
group: if message.spans.iter().any(|x| !x.is_primary) {
237244
Some(group)
@@ -268,7 +275,7 @@ fn parse_diagnostics(message: &str, group: u64) -> Option<FileDiagnostic> {
268275
Some(ref c) => c.code.clone(),
269276
None => String::new(),
270277
})),
271-
source: Some("rustc".into()),
278+
source: Some(source.to_owned()),
272279
message: secondary_message.trim().to_owned(),
273280
group: Some(group),
274281
}
@@ -376,12 +383,24 @@ impl IsWithin for DiagnosticSpan {
376383
mod diagnostic_message_test {
377384
use super::*;
378385

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 {
381387
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+
}
385404
}
386405

387406
/// ```
@@ -393,9 +412,16 @@ mod diagnostic_message_test {
393412
/// ```
394413
#[test]
395414
fn message_use_after_move() {
396-
let (msg, others) = parsed_message(
415+
let diag = parse_compiler_message(
397416
include_str!("../../test_data/compiler_message/use-after-move.json")
398417
);
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();
399425
assert_eq!(
400426
msg,
401427
"use of moved value: `s`\n\n\
@@ -416,9 +442,9 @@ mod diagnostic_message_test {
416442
/// ```
417443
#[test]
418444
fn message_type_annotations_needed() {
419-
let (msg, others) = parsed_message(
445+
let (msg, others) = parse_compiler_message(
420446
include_str!("../../test_data/compiler_message/type-annotations-needed.json")
421-
);
447+
).to_messages();
422448
assert_eq!(
423449
msg,
424450
"type annotations needed\n\n\
@@ -438,9 +464,9 @@ mod diagnostic_message_test {
438464
/// ```
439465
#[test]
440466
fn message_mismatched_types() {
441-
let (msg, others) = parsed_message(
467+
let (msg, others) = parse_compiler_message(
442468
include_str!("../../test_data/compiler_message/mismatched-types.json")
443-
);
469+
).to_messages();
444470
assert_eq!(
445471
msg,
446472
"mismatched types\n\n\
@@ -461,9 +487,9 @@ mod diagnostic_message_test {
461487
/// ```
462488
#[test]
463489
fn message_not_mutable() {
464-
let (msg, others) = parsed_message(
490+
let (msg, others) = parse_compiler_message(
465491
include_str!("../../test_data/compiler_message/not-mut.json")
466-
);
492+
).to_messages();
467493
assert_eq!(
468494
msg,
469495
"cannot borrow immutable local variable `string` as mutable\n\n\
@@ -485,9 +511,9 @@ mod diagnostic_message_test {
485511
/// ```
486512
#[test]
487513
fn message_consider_borrowing() {
488-
let (msg, others) = parsed_message(
514+
let (msg, others) = parse_compiler_message(
489515
include_str!("../../test_data/compiler_message/consider-borrowing.json")
490-
);
516+
).to_messages();
491517
assert_eq!(
492518
msg,
493519
r#"mismatched types
@@ -512,9 +538,9 @@ help: consider borrowing here: `&string`"#,
512538
/// ```
513539
#[test]
514540
fn message_move_out_of_borrow() {
515-
let (msg, others) = parsed_message(
541+
let (msg, others) = parse_compiler_message(
516542
include_str!("../../test_data/compiler_message/move-out-of-borrow.json")
517-
);
543+
).to_messages();
518544
assert_eq!(msg, "cannot move out of borrowed content");
519545

520546
assert_eq!(others, vec!["hint: to prevent move, use `ref string` or `ref mut string`"]);
@@ -525,9 +551,9 @@ help: consider borrowing here: `&string`"#,
525551
/// ```
526552
#[test]
527553
fn message_unused_use() {
528-
let (msg, others) = parsed_message(
554+
let (msg, others) = parse_compiler_message(
529555
include_str!("../../test_data/compiler_message/unused-use.json")
530-
);
556+
).to_messages();
531557
assert_eq!(msg, "unused import: `std::borrow::Cow`\n\n\
532558
note: #[warn(unused_imports)] on by default");
533559

@@ -536,12 +562,45 @@ help: consider borrowing here: `&string`"#,
536562

537563
#[test]
538564
fn message_cannot_find_type() {
539-
let (msg, others) = parsed_message(
565+
let (msg, others) = parse_compiler_message(
540566
include_str!("../../test_data/compiler_message/cannot-find-type.json")
541-
);
567+
).to_messages();
542568
assert_eq!(msg, "cannot find type `HashSet` in this scope\n\n\
543569
not found in this scope");
544570

545571
assert!(others.is_empty(), "{:?}", others);
546572
}
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+
}
547606
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
{
2+
"children": [{
3+
"children": [],
4+
"code": null,
5+
"level": "note",
6+
"message": "lint level defined here",
7+
"rendered": null,
8+
"spans": [{
9+
"byte_end": 39,
10+
"byte_start": 33,
11+
"column_end": 15,
12+
"column_start": 9,
13+
"expansion": null,
14+
"file_name": "src/main.rs",
15+
"is_primary": true,
16+
"label": null,
17+
"line_end": 2,
18+
"line_start": 2,
19+
"suggested_replacement": null,
20+
"text": [{
21+
"highlight_end": 15,
22+
"highlight_start": 9,
23+
"text": "#![warn(clippy)]"
24+
}]
25+
}]
26+
}, {
27+
"children": [],
28+
"code": null,
29+
"level": "note",
30+
"message": "#[warn(identity_op)] implied by #[warn(clippy)]",
31+
"rendered": null,
32+
"spans": []
33+
}, {
34+
"children": [],
35+
"code": null,
36+
"level": "help",
37+
"message": "for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.186/index.html#identity_op",
38+
"rendered": null,
39+
"spans": []
40+
}],
41+
"code": {
42+
"code": "identity_op",
43+
"explanation": null
44+
},
45+
"level": "warning",
46+
"message": "the operation is ineffective. Consider reducing it to `1`",
47+
"rendered": "warning: the operation is ineffective. Consider reducing it to `1`\n --> src/main.rs:5:14\n |\n5 | let _s = 1 / 1;\n | ^^^^^\n |\nnote: lint level defined here\n --> src/main.rs:2:9\n |\n2 | #![warn(clippy)]\n | ^^^^^^\n = note: #[warn(identity_op)] implied by #[warn(clippy)]\n = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.186/index.html#identity_op\n\n",
48+
"spans": [{
49+
"byte_end": 73,
50+
"byte_start": 68,
51+
"column_end": 19,
52+
"column_start": 14,
53+
"expansion": null,
54+
"file_name": "src/main.rs",
55+
"is_primary": true,
56+
"label": null,
57+
"line_end": 5,
58+
"line_start": 5,
59+
"suggested_replacement": null,
60+
"text": [{
61+
"highlight_end": 19,
62+
"highlight_start": 14,
63+
"text": " let _s = 1 / 1;"
64+
}]
65+
}]
66+
}

0 commit comments

Comments
 (0)