use clippy_utils::consts::{self, Constant};
use clippy_utils::diagnostics::span_lint_and_sugg;
use clippy_utils::source::snippet_with_applicability;
+use clippy_utils::sugg::has_enclosing_paren;
use if_chain::if_chain;
+use rustc_ast::util::parser::PREC_PREFIX;
use rustc_errors::Applicability;
use rustc_hir::{BinOpKind, Expr, ExprKind, UnOp};
use rustc_lint::{LateContext, LateLintPass};
/// This only catches integers (for now).
///
/// ### Example
- /// ```ignore
- /// // Bad
+ /// ```rust,ignore
/// let a = x * -1;
+ /// ```
///
- /// // Good
- /// let b = -x;
+ /// Use instead:
+ /// ```rust,ignore
+ /// let a = -x;
/// ```
#[clippy::version = "pre 1.29.0"]
pub NEG_MULTIPLY,
declare_lint_pass!(NegMultiply => [NEG_MULTIPLY]);
-#[allow(clippy::match_same_arms)]
impl<'tcx> LateLintPass<'tcx> for NegMultiply {
fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) {
if let ExprKind::Binary(ref op, left, right) = e.kind {
then {
let mut applicability = Applicability::MachineApplicable;
- let suggestion = format!("-{}", snippet_with_applicability(cx, exp.span, "..", &mut applicability));
+ let snip = snippet_with_applicability(cx, exp.span, "..", &mut applicability);
+ let suggestion = if exp.precedence().order() < PREC_PREFIX && !has_enclosing_paren(&snip) {
+ format!("-({})", snip)
+ } else {
+ format!("-{}", snip)
+ };
span_lint_and_sugg(
cx,
NEG_MULTIPLY,