]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/operators/verbose_bit_mask.rs
Rollup merge of #103305 - c410-f3r:moar-errors, r=petrochenkov
[rust.git] / src / tools / clippy / clippy_lints / src / operators / verbose_bit_mask.rs
1 use clippy_utils::diagnostics::span_lint_and_then;
2 use clippy_utils::sugg::Sugg;
3 use rustc_ast::ast::LitKind;
4 use rustc_errors::Applicability;
5 use rustc_hir::{BinOpKind, Expr, ExprKind};
6 use rustc_lint::LateContext;
7
8 use super::VERBOSE_BIT_MASK;
9
10 pub(super) fn check<'tcx>(
11     cx: &LateContext<'tcx>,
12     e: &'tcx Expr<'_>,
13     op: BinOpKind,
14     left: &'tcx Expr<'_>,
15     right: &'tcx Expr<'_>,
16     threshold: u64,
17 ) {
18     if BinOpKind::Eq == op
19         && let ExprKind::Binary(op1, left1, right1) = &left.kind
20         && BinOpKind::BitAnd == op1.node
21         && let ExprKind::Lit(lit) = &right1.kind
22         && let LitKind::Int(n, _) = lit.node
23         && let ExprKind::Lit(lit1) = &right.kind
24         && let LitKind::Int(0, _) = lit1.node
25         && n.leading_zeros() == n.count_zeros()
26         && n > u128::from(threshold)
27     {
28         span_lint_and_then(
29             cx,
30             VERBOSE_BIT_MASK,
31             e.span,
32             "bit mask could be simplified with a call to `trailing_zeros`",
33             |diag| {
34                 let sugg = Sugg::hir(cx, left1, "...").maybe_par();
35                 diag.span_suggestion(
36                     e.span,
37                     "try",
38                     format!("{sugg}.trailing_zeros() >= {}", n.count_ones()),
39                     Applicability::MaybeIncorrect,
40                 );
41             },
42         );
43     }
44 }