| use clippy_utils::diagnostics::span_lint_and_then; | |
| use clippy_utils::source::SpanRangeExt; | |
| use rustc_errors::Applicability; | |
| use rustc_hir::{BinOpKind, Expr, ExprKind}; | |
| use rustc_lint::LateContext; | |
| use super::NEEDLESS_BITWISE_BOOL; | |
| pub(super) fn check(cx: &LateContext<'_>, e: &Expr<'_>, op: BinOpKind, lhs: &Expr<'_>, rhs: &Expr<'_>) { | |
| let op_str = match op { | |
| BinOpKind::BitAnd => "&&", | |
| BinOpKind::BitOr => "||", | |
| _ => return, | |
| }; | |
| if matches!( | |
| rhs.kind, | |
| ExprKind::Call(..) | ExprKind::MethodCall(..) | ExprKind::Binary(..) | ExprKind::Unary(..) | |
| ) && cx.typeck_results().expr_ty(e).is_bool() | |
| && !rhs.can_have_side_effects() | |
| { | |
| span_lint_and_then( | |
| cx, | |
| NEEDLESS_BITWISE_BOOL, | |
| e.span, | |
| "use of bitwise operator instead of lazy operator between booleans", | |
| |diag| { | |
| if let Some(lhs_snip) = lhs.span.get_source_text(cx) | |
| && let Some(rhs_snip) = rhs.span.get_source_text(cx) | |
| { | |
| let sugg = format!("{lhs_snip} {op_str} {rhs_snip}"); | |
| diag.span_suggestion(e.span, "try", sugg, Applicability::MachineApplicable); | |
| } | |
| }, | |
| ); | |
| } | |
| } |