From 5e3df4266aa31a688ac0909a0a7845bca7e563c0 Mon Sep 17 00:00:00 2001 From: flip1995 Date: Sat, 16 Jan 2021 17:11:26 +0100 Subject: [PATCH] More advanced unknown lint suggestion This copies the unknown_lints code clippy uses for its unknown_clippy_lints lint to rustc. The unknown_clippy_lints code is more advanced, because it doesn't suggest renamed or removed lints and correctly suggest lower casing lints. --- compiler/rustc_lint/src/context.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_lint/src/context.rs b/compiler/rustc_lint/src/context.rs index c4df0acbbb0..3971a309982 100644 --- a/compiler/rustc_lint/src/context.rs +++ b/compiler/rustc_lint/src/context.rs @@ -412,12 +412,18 @@ impl LintStore { } fn no_lint_suggestion(&self, lint_name: &str) -> CheckLintNameResult<'_> { - let symbols = self.by_name.keys().map(|name| Symbol::intern(&name)).collect::>(); + let name_lower = lint_name.to_lowercase(); + let symbols = + self.get_lints().iter().map(|l| Symbol::intern(&l.name_lower())).collect::>(); - let suggestion = - find_best_match_for_name(&symbols, Symbol::intern(&lint_name.to_lowercase()), None); - - CheckLintNameResult::NoLint(suggestion) + if lint_name.chars().any(char::is_uppercase) && self.find_lints(&name_lower).is_ok() { + // First check if the lint name is (partly) in upper case instead of lower case... + CheckLintNameResult::NoLint(Some(Symbol::intern(&name_lower))) + } else { + // ...if not, search for lints with a similar name + let suggestion = find_best_match_for_name(&symbols, Symbol::intern(&name_lower), None); + CheckLintNameResult::NoLint(suggestion) + } } fn check_tool_name_for_backwards_compat(