| use super::utils::get_hint_if_single_char_arg; |
| use clippy_utils::diagnostics::span_lint_and_sugg; |
| use rustc_errors::Applicability; |
| use rustc_hir as hir; |
| use rustc_lint::LateContext; |
| use rustc_middle::ty; |
| use rustc_span::symbol::Symbol; |
| |
| use super::SINGLE_CHAR_PATTERN; |
| |
| const PATTERN_METHODS: [(&str, usize); 24] = [ |
| ("contains", 0), |
| ("starts_with", 0), |
| ("ends_with", 0), |
| ("find", 0), |
| ("rfind", 0), |
| ("split", 0), |
| ("split_inclusive", 0), |
| ("rsplit", 0), |
| ("split_terminator", 0), |
| ("rsplit_terminator", 0), |
| ("splitn", 1), |
| ("rsplitn", 1), |
| ("split_once", 0), |
| ("rsplit_once", 0), |
| ("matches", 0), |
| ("rmatches", 0), |
| ("match_indices", 0), |
| ("rmatch_indices", 0), |
| ("strip_prefix", 0), |
| ("strip_suffix", 0), |
| ("trim_start_matches", 0), |
| ("trim_end_matches", 0), |
| ("replace", 0), |
| ("replacen", 0), |
| ]; |
| |
| /// lint for length-1 `str`s for methods in `PATTERN_METHODS` |
| pub(super) fn check( |
| cx: &LateContext<'_>, |
| _expr: &hir::Expr<'_>, |
| method_name: Symbol, |
| receiver: &hir::Expr<'_>, |
| args: &[hir::Expr<'_>], |
| ) { |
| for &(method, pos) in &PATTERN_METHODS { |
| if let ty::Ref(_, ty, _) = cx.typeck_results().expr_ty_adjusted(receiver).kind() |
| && ty.is_str() |
| && method_name.as_str() == method |
| && args.len() > pos |
| && let arg = &args[pos] |
| && let mut applicability = Applicability::MachineApplicable |
| && let Some(hint) = get_hint_if_single_char_arg(cx, arg, &mut applicability) |
| { |
| span_lint_and_sugg( |
| cx, |
| SINGLE_CHAR_PATTERN, |
| arg.span, |
| "single-character string constant used as pattern", |
| "consider using a `char`", |
| hint, |
| applicability, |
| ); |
| } |
| } |
| } |