]> git.lizzy.rs Git - rust.git/blobdiff - clippy_lints/src/attrs.rs
Suggest similar lint name on unknown_clippy_lints
[rust.git] / clippy_lints / src / attrs.rs
index 7b41acf392ecb7c4053de4ecb3c09179c88878c1..b618fcfd7b87aa5ae5c139dd8ddeb7aa2ef1f7c9 100644 (file)
@@ -18,6 +18,7 @@
 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! {
@@ -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,
+                            );
                         }
                     }
                 );