]>
Commit | Line | Data |
---|---|---|
04454e1e FG |
1 | //! Lint for `c.is_digit(10)` |
2 | ||
3 | use super::IS_DIGIT_ASCII_RADIX; | |
487cf647 | 4 | use clippy_utils::msrvs::{self, Msrv}; |
04454e1e | 5 | use clippy_utils::{ |
487cf647 | 6 | consts::constant_full_int, consts::FullInt, diagnostics::span_lint_and_sugg, source::snippet_with_applicability, |
04454e1e FG |
7 | }; |
8 | use rustc_errors::Applicability; | |
9 | use rustc_hir::Expr; | |
10 | use rustc_lint::LateContext; | |
04454e1e FG |
11 | |
12 | pub(super) fn check<'tcx>( | |
13 | cx: &LateContext<'tcx>, | |
14 | expr: &'tcx Expr<'_>, | |
15 | self_arg: &'tcx Expr<'_>, | |
16 | radix: &'tcx Expr<'_>, | |
487cf647 | 17 | msrv: &Msrv, |
04454e1e | 18 | ) { |
487cf647 | 19 | if !msrv.meets(msrvs::IS_ASCII_DIGIT) { |
04454e1e FG |
20 | return; |
21 | } | |
22 | ||
23 | if !cx.typeck_results().expr_ty_adjusted(self_arg).peel_refs().is_char() { | |
24 | return; | |
25 | } | |
26 | ||
27 | if let Some(radix_val) = constant_full_int(cx, cx.typeck_results(), radix) { | |
28 | let (num, replacement) = match radix_val { | |
29 | FullInt::S(10) | FullInt::U(10) => (10, "is_ascii_digit"), | |
30 | FullInt::S(16) | FullInt::U(16) => (16, "is_ascii_hexdigit"), | |
31 | _ => return, | |
32 | }; | |
33 | let mut applicability = Applicability::MachineApplicable; | |
34 | ||
35 | span_lint_and_sugg( | |
36 | cx, | |
37 | IS_DIGIT_ASCII_RADIX, | |
38 | expr.span, | |
2b03887a | 39 | &format!("use of `char::is_digit` with literal radix of {num}"), |
04454e1e FG |
40 | "try", |
41 | format!( | |
2b03887a FG |
42 | "{}.{replacement}()", |
43 | snippet_with_applicability(cx, self_arg.span, "..", &mut applicability) | |
04454e1e FG |
44 | ), |
45 | applicability, | |
46 | ); | |
47 | } | |
48 | } |