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! {
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,
+ );
}
}
);