|
1 | 1 | use crate::methods::get_hint_if_single_char_arg;
|
2 | 2 | use clippy_utils::diagnostics::span_lint_and_sugg;
|
| 3 | +use if_chain::if_chain; |
3 | 4 | use rustc_errors::Applicability;
|
4 | 5 | use rustc_hir as hir;
|
5 | 6 | use rustc_lint::LateContext;
|
| 7 | +use rustc_middle::ty; |
| 8 | +use rustc_span::symbol::Symbol; |
6 | 9 |
|
7 | 10 | use super::SINGLE_CHAR_PATTERN;
|
8 | 11 |
|
9 | 12 | /// lint for length-1 `str`s for methods in `PATTERN_METHODS`
|
10 |
| -pub(super) fn check(cx: &LateContext<'_>, _expr: &hir::Expr<'_>, arg: &hir::Expr<'_>) { |
11 |
| - let mut applicability = Applicability::MachineApplicable; |
12 |
| - if let Some(hint) = get_hint_if_single_char_arg(cx, arg, &mut applicability) { |
13 |
| - span_lint_and_sugg( |
14 |
| - cx, |
15 |
| - SINGLE_CHAR_PATTERN, |
16 |
| - arg.span, |
17 |
| - "single-character string constant used as pattern", |
18 |
| - "try using a `char` instead", |
19 |
| - hint, |
20 |
| - applicability, |
21 |
| - ); |
| 13 | +pub(super) fn check(cx: &LateContext<'_>, _expr: &hir::Expr<'_>, method_name: Symbol, args: &[hir::Expr<'_>]) { |
| 14 | + for &(method, pos) in &crate::methods::PATTERN_METHODS { |
| 15 | + if_chain! { |
| 16 | + if let ty::Ref(_, ty, _) = cx.typeck_results().expr_ty_adjusted(&args[0]).kind(); |
| 17 | + if *ty.kind() == ty::Str; |
| 18 | + if method_name.as_str() == method && args.len() > pos; |
| 19 | + let arg = &args[pos]; |
| 20 | + let mut applicability = Applicability::MachineApplicable; |
| 21 | + if let Some(hint) = get_hint_if_single_char_arg(cx, arg, &mut applicability); |
| 22 | + then { |
| 23 | + span_lint_and_sugg( |
| 24 | + cx, |
| 25 | + SINGLE_CHAR_PATTERN, |
| 26 | + arg.span, |
| 27 | + "single-character string constant used as pattern", |
| 28 | + "try using a `char` instead", |
| 29 | + hint, |
| 30 | + applicability, |
| 31 | + ); |
| 32 | + } |
| 33 | + } |
22 | 34 | }
|
23 | 35 | }
|
0 commit comments