]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/methods/is_digit_ascii_radix.rs
Auto merge of #99422 - Dylan-DPC:rollup-htjofm6, r=Dylan-DPC
[rust.git] / src / tools / clippy / clippy_lints / src / methods / is_digit_ascii_radix.rs
1 //! Lint for `c.is_digit(10)`
2
3 use super::IS_DIGIT_ASCII_RADIX;
4 use clippy_utils::{
5     consts::constant_full_int, consts::FullInt, diagnostics::span_lint_and_sugg, meets_msrv, msrvs,
6     source::snippet_with_applicability,
7 };
8 use rustc_errors::Applicability;
9 use rustc_hir::Expr;
10 use rustc_lint::LateContext;
11 use rustc_semver::RustcVersion;
12
13 pub(super) fn check<'tcx>(
14     cx: &LateContext<'tcx>,
15     expr: &'tcx Expr<'_>,
16     self_arg: &'tcx Expr<'_>,
17     radix: &'tcx Expr<'_>,
18     msrv: Option<RustcVersion>,
19 ) {
20     if !meets_msrv(msrv, msrvs::IS_ASCII_DIGIT) {
21         return;
22     }
23
24     if !cx.typeck_results().expr_ty_adjusted(self_arg).peel_refs().is_char() {
25         return;
26     }
27
28     if let Some(radix_val) = constant_full_int(cx, cx.typeck_results(), radix) {
29         let (num, replacement) = match radix_val {
30             FullInt::S(10) | FullInt::U(10) => (10, "is_ascii_digit"),
31             FullInt::S(16) | FullInt::U(16) => (16, "is_ascii_hexdigit"),
32             _ => return,
33         };
34         let mut applicability = Applicability::MachineApplicable;
35
36         span_lint_and_sugg(
37             cx,
38             IS_DIGIT_ASCII_RADIX,
39             expr.span,
40             &format!("use of `char::is_digit` with literal radix of {}", num),
41             "try",
42             format!(
43                 "{}.{}()",
44                 snippet_with_applicability(cx, self_arg.span, "..", &mut applicability),
45                 replacement
46             ),
47             applicability,
48         );
49     }
50 }