| use clippy_utils::diagnostics::span_lint; |
| use rustc_ast::PatKind; |
| use rustc_ast::visit::FnKind; |
| use rustc_data_structures::fx::FxHashMap; |
| use rustc_lint::EarlyContext; |
| use rustc_span::Span; |
| |
| use super::DUPLICATE_UNDERSCORE_ARGUMENT; |
| |
| pub(super) fn check(cx: &EarlyContext<'_>, fn_kind: FnKind<'_>) { |
| let mut registered_names: FxHashMap<String, Span> = FxHashMap::default(); |
| |
| for arg in &fn_kind.decl().inputs { |
| if let PatKind::Ident(_, ident, None) = arg.pat.kind { |
| let arg_name = ident.to_string(); |
| |
| if let Some(arg_name) = arg_name.strip_prefix('_') { |
| if let Some(correspondence) = registered_names.get(arg_name) { |
| span_lint( |
| cx, |
| DUPLICATE_UNDERSCORE_ARGUMENT, |
| *correspondence, |
| format!( |
| "`{arg_name}` already exists, having another argument having almost the same \ |
| name makes code comprehension and documentation more difficult" |
| ), |
| ); |
| } |
| } else { |
| registered_names.insert(arg_name, arg.pat.span); |
| } |
| } |
| } |
| } |