]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/methods/single_char_pattern.rs
Auto merge of #107843 - bjorn3:sync_cg_clif-2023-02-09, r=bjorn3
[rust.git] / src / tools / clippy / clippy_lints / src / methods / single_char_pattern.rs
1 use super::utils::get_hint_if_single_char_arg;
2 use clippy_utils::diagnostics::span_lint_and_sugg;
3 use if_chain::if_chain;
4 use rustc_errors::Applicability;
5 use rustc_hir as hir;
6 use rustc_lint::LateContext;
7 use rustc_middle::ty;
8 use rustc_span::symbol::Symbol;
9
10 use super::SINGLE_CHAR_PATTERN;
11
12 const PATTERN_METHODS: [(&str, usize); 24] = [
13     ("contains", 0),
14     ("starts_with", 0),
15     ("ends_with", 0),
16     ("find", 0),
17     ("rfind", 0),
18     ("split", 0),
19     ("split_inclusive", 0),
20     ("rsplit", 0),
21     ("split_terminator", 0),
22     ("rsplit_terminator", 0),
23     ("splitn", 1),
24     ("rsplitn", 1),
25     ("split_once", 0),
26     ("rsplit_once", 0),
27     ("matches", 0),
28     ("rmatches", 0),
29     ("match_indices", 0),
30     ("rmatch_indices", 0),
31     ("strip_prefix", 0),
32     ("strip_suffix", 0),
33     ("trim_start_matches", 0),
34     ("trim_end_matches", 0),
35     ("replace", 0),
36     ("replacen", 0),
37 ];
38
39 /// lint for length-1 `str`s for methods in `PATTERN_METHODS`
40 pub(super) fn check(
41     cx: &LateContext<'_>,
42     _expr: &hir::Expr<'_>,
43     method_name: Symbol,
44     receiver: &hir::Expr<'_>,
45     args: &[hir::Expr<'_>],
46 ) {
47     for &(method, pos) in &PATTERN_METHODS {
48         if_chain! {
49             if let ty::Ref(_, ty, _) = cx.typeck_results().expr_ty_adjusted(receiver).kind();
50             if *ty.kind() == ty::Str;
51             if method_name.as_str() == method && args.len() > pos;
52             let arg = &args[pos];
53             let mut applicability = Applicability::MachineApplicable;
54             if let Some(hint) = get_hint_if_single_char_arg(cx, arg, &mut applicability);
55             then {
56                 span_lint_and_sugg(
57                     cx,
58                     SINGLE_CHAR_PATTERN,
59                     arg.span,
60                     "single-character string constant used as pattern",
61                     "try using a `char` instead",
62                     hint,
63                     applicability,
64                 );
65             }
66         }
67     }
68 }