Skip to content

Commit

Permalink
Auto merge of #4963 - JohnTitor:unknown-clippy-lint, r=phansch
Browse files Browse the repository at this point in the history
Suggest similar lint name on `unknown_clippy_lints`

Suggest a similar lint name with Levenshtein distance on `unknown_clippy_lints`.
And lowercase suggestion behavior is also changed.

changelog: Suggest similar lint name on `unknown_clippy_lints`
  • Loading branch information
bors committed Dec 27, 2019
2 parents 0fcb530 + 6e525fc commit 0fec590
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 24 deletions.
43 changes: 25 additions & 18 deletions clippy_lints/src/attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use rustc_session::declare_tool_lint;
use semver::Version;
use syntax::ast::{AttrKind, AttrStyle, Attribute, Lit, LitKind, MetaItemKind, NestedMetaItem};
use syntax::source_map::Span;
use syntax::util::lev_distance::find_best_match_for_name;
use syntax_pos::symbol::Symbol;

declare_clippy_lint! {
Expand Down Expand Up @@ -329,24 +330,30 @@ fn check_clippy_lint_names(cx: &LateContext<'_, '_>, items: &[NestedMetaItem]) {
lint.span(),
&format!("unknown clippy lint: clippy::{}", name),
|db| {
if name.as_str().chars().any(char::is_uppercase) {
let name_lower = name.as_str().to_lowercase();
match lint_store.check_lint_name(
&name_lower,
Some(tool_name.name)
) {
// FIXME: can we suggest similar lint names here?
// https://github.com/rust-lang/rust/pull/56992
CheckLintNameResult::NoLint(None) => (),
_ => {
db.span_suggestion(
lint.span(),
"lowercase the lint name",
name_lower,
Applicability::MaybeIncorrect,
);
}
}
let name_lower = name.as_str().to_lowercase();
let symbols = lint_store.get_lints().iter().map(
|l| Symbol::intern(&l.name_lower())
).collect::<Vec<_>>();
let sugg = find_best_match_for_name(
symbols.iter(),
&format!("clippy::{}", name_lower),
None,
);
if name.as_str().chars().any(char::is_uppercase)
&& lint_store.find_lints(&format!("clippy::{}", name_lower)).is_ok() {
db.span_suggestion(
lint.span(),
"lowercase the lint name",
format!("clippy::{}", name_lower),
Applicability::MachineApplicable,
);
} else if let Some(sugg) = sugg {
db.span_suggestion(
lint.span(),
"did you mean",
sugg.to_string(),
Applicability::MachineApplicable,
);
}
}
);
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/unknown_clippy_lints.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// run-rustfix

#![warn(clippy::pedantic)]
// Should suggest lowercase
#![allow(clippy::all)]
#![warn(clippy::cmp_nan)]

// Should suggest similar clippy lint name
#[warn(clippy::if_not_else)]
#[warn(clippy::unnecessary_cast)]
#[warn(clippy::useless_transmute)]
// Shouldn't suggest rustc lint name(`dead_code`)
#[warn(clippy::drop_copy)]
// Shouldn't suggest removed/deprecated clippy lint name(`unused_collect`)
#[warn(clippy::unused_self)]
// Shouldn't suggest renamed clippy lint name(`const_static_lifetime`)
#[warn(clippy::redundant_static_lifetimes)]
fn main() {}
15 changes: 14 additions & 1 deletion tests/ui/unknown_clippy_lints.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
#![allow(clippy::All)]
// run-rustfix

#![warn(clippy::pedantic)]
// Should suggest lowercase
#![allow(clippy::All)]
#![warn(clippy::CMP_NAN)]

// Should suggest similar clippy lint name
#[warn(clippy::if_not_els)]
#[warn(clippy::UNNecsaRy_cAst)]
#[warn(clippy::useles_transute)]
// Shouldn't suggest rustc lint name(`dead_code`)
#[warn(clippy::dead_cod)]
// Shouldn't suggest removed/deprecated clippy lint name(`unused_collect`)
#[warn(clippy::unused_colle)]
// Shouldn't suggest renamed clippy lint name(`const_static_lifetime`)
#[warn(clippy::const_static_lifetim)]
fn main() {}
46 changes: 41 additions & 5 deletions tests/ui/unknown_clippy_lints.stderr
Original file line number Diff line number Diff line change
@@ -1,16 +1,52 @@
error: unknown clippy lint: clippy::if_not_els
--> $DIR/unknown_clippy_lints.rs:4:8
--> $DIR/unknown_clippy_lints.rs:9:8
|
LL | #[warn(clippy::if_not_els)]
| ^^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^^^^^^^^^ help: did you mean: `clippy::if_not_else`
|
= note: `-D clippy::unknown-clippy-lints` implied by `-D warnings`

error: unknown clippy lint: clippy::UNNecsaRy_cAst
--> $DIR/unknown_clippy_lints.rs:10:8
|
LL | #[warn(clippy::UNNecsaRy_cAst)]
| ^^^^^^^^^^^^^^^^^^^^^^ help: did you mean: `clippy::unnecessary_cast`

error: unknown clippy lint: clippy::useles_transute
--> $DIR/unknown_clippy_lints.rs:11:8
|
LL | #[warn(clippy::useles_transute)]
| ^^^^^^^^^^^^^^^^^^^^^^^ help: did you mean: `clippy::useless_transmute`

error: unknown clippy lint: clippy::dead_cod
--> $DIR/unknown_clippy_lints.rs:13:8
|
LL | #[warn(clippy::dead_cod)]
| ^^^^^^^^^^^^^^^^ help: did you mean: `clippy::drop_copy`

error: unknown clippy lint: clippy::unused_colle
--> $DIR/unknown_clippy_lints.rs:15:8
|
LL | #[warn(clippy::unused_colle)]
| ^^^^^^^^^^^^^^^^^^^^ help: did you mean: `clippy::unused_self`

error: unknown clippy lint: clippy::const_static_lifetim
--> $DIR/unknown_clippy_lints.rs:17:8
|
LL | #[warn(clippy::const_static_lifetim)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: did you mean: `clippy::redundant_static_lifetimes`

error: unknown clippy lint: clippy::All
--> $DIR/unknown_clippy_lints.rs:1:10
--> $DIR/unknown_clippy_lints.rs:5:10
|
LL | #![allow(clippy::All)]
| ^^^^^^^^^^^ help: lowercase the lint name: `all`
| ^^^^^^^^^^^ help: lowercase the lint name: `clippy::all`

error: unknown clippy lint: clippy::CMP_NAN
--> $DIR/unknown_clippy_lints.rs:6:9
|
LL | #![warn(clippy::CMP_NAN)]
| ^^^^^^^^^^^^^^^ help: lowercase the lint name: `clippy::cmp_nan`

error: aborting due to 2 previous errors
error: aborting due to 8 previous errors

0 comments on commit 0fec590

Please sign in to comment.