about summary refs log tree commit diff
path: root/clippy_lints/src/methods/single_char_pattern.rs
blob: 3983f0c0cabd4cebc9731a64e7c724790346b925 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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",
                "try using a `char` instead",
                hint,
                applicability,
            );
        }
    }
}