about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOussama <abdelmoumenoussama@gmail.com>2021-12-21 22:00:14 +0100
committerOussama <abdelmoumenoussama@gmail.com>2021-12-21 22:00:14 +0100
commit88e40bc73db441b931372a11b99c308f4bf0427f (patch)
tree0fcfbe2eb8975675c8b57f7c0a2c35b4651a587b
parent5ad37b1a4b34af381b93f603e4c948928a8a6124 (diff)
downloadrust-88e40bc73db441b931372a11b99c308f4bf0427f.tar.gz
rust-88e40bc73db441b931372a11b99c308f4bf0427f.zip
Add support for suggestion when using an expression
-rw-r--r--clippy_lints/src/neg_multiply.rs13
-rw-r--r--tests/ui/neg_multiply.fixed44
-rw-r--r--tests/ui/neg_multiply.rs9
-rw-r--r--tests/ui/neg_multiply.stderr42
4 files changed, 96 insertions, 12 deletions
diff --git a/clippy_lints/src/neg_multiply.rs b/clippy_lints/src/neg_multiply.rs
index 78645e50bff..0d05c83ffe4 100644
--- a/clippy_lints/src/neg_multiply.rs
+++ b/clippy_lints/src/neg_multiply.rs
@@ -1,8 +1,9 @@
 use clippy_utils::consts::{self, Constant};
 use clippy_utils::diagnostics::span_lint_and_sugg;
+use clippy_utils::source::snippet_with_applicability;
 use if_chain::if_chain;
 use rustc_errors::Applicability;
-use rustc_hir::{BinOpKind, Expr, ExprKind, QPath, UnOp};
+use rustc_hir::{BinOpKind, Expr, ExprKind, UnOp};
 use rustc_lint::{LateContext, LateLintPass};
 use rustc_session::{declare_lint_pass, declare_tool_lint};
 use rustc_span::source_map::Span;
@@ -28,7 +29,7 @@ declare_clippy_lint! {
     #[clippy::version = "pre 1.29.0"]
     pub NEG_MULTIPLY,
     style,
-    "multiplying integers with `-1`"
+    "multiplying integers by `-1`"
 }
 
 declare_lint_pass!(NegMultiply => [NEG_MULTIPLY]);
@@ -54,17 +55,15 @@ fn check_mul(cx: &LateContext<'_>, span: Span, lit: &Expr<'_>, exp: &Expr<'_>) {
         if let ExprKind::Lit(ref l) = lit.kind;
         if consts::lit_to_constant(&l.node, cx.typeck_results().expr_ty_opt(lit)) == Constant::Int(1);
         if cx.typeck_results().expr_ty(exp).is_integral();
-        if let ExprKind::Path(QPath::Resolved(_, var_path)) = exp.kind;
 
         then {
-            let var_name = var_path.segments[0].ident.name.as_str();
-            let suggestion = format!("-{var}",var=var_name);
-            let applicability = Applicability::MachineApplicable;
+            let mut applicability = Applicability::MachineApplicable;
+            let suggestion = format!("-{}", snippet_with_applicability(cx, exp.span, "..", &mut applicability));
             span_lint_and_sugg(
                     cx,
                     NEG_MULTIPLY,
                     span,
-                    "this `multiplication with -1` can be written more succinctly",
+                    "this multiplication by -1 can be written more succinctly",
                     "consider using",
                     suggestion,
                     applicability,
diff --git a/tests/ui/neg_multiply.fixed b/tests/ui/neg_multiply.fixed
new file mode 100644
index 00000000000..8546173cfd5
--- /dev/null
+++ b/tests/ui/neg_multiply.fixed
@@ -0,0 +1,44 @@
+// run-rustfix
+#![warn(clippy::neg_multiply)]
+#![allow(clippy::no_effect, clippy::unnecessary_operation)]
+
+use std::ops::Mul;
+
+struct X;
+
+impl Mul<isize> for X {
+    type Output = X;
+
+    fn mul(self, _r: isize) -> Self {
+        self
+    }
+}
+
+impl Mul<X> for isize {
+    type Output = X;
+
+    fn mul(self, _r: X) -> X {
+        X
+    }
+}
+
+fn main() {
+    let x = 0;
+
+    -x;
+
+    -x;
+
+    100 + -x;
+
+    -(100 + x);
+
+    -17;
+
+    0xcafe | -0xff00;
+
+    -1 * -1; // should be ok
+
+    X * -1; // should be ok
+    -1 * X; // should also be ok
+}
diff --git a/tests/ui/neg_multiply.rs b/tests/ui/neg_multiply.rs
index d4a20ce9db1..9f48e4d9c12 100644
--- a/tests/ui/neg_multiply.rs
+++ b/tests/ui/neg_multiply.rs
@@ -1,3 +1,4 @@
+// run-rustfix
 #![warn(clippy::neg_multiply)]
 #![allow(clippy::no_effect, clippy::unnecessary_operation)]
 
@@ -28,6 +29,14 @@ fn main() {
 
     -1 * x;
 
+    100 + x * -1;
+
+    (100 + x) * -1;
+
+    -1 * 17;
+
+    0xcafe | 0xff00 * -1;
+
     -1 * -1; // should be ok
 
     X * -1; // should be ok
diff --git a/tests/ui/neg_multiply.stderr b/tests/ui/neg_multiply.stderr
index ce5f46fca56..0a4bc074295 100644
--- a/tests/ui/neg_multiply.stderr
+++ b/tests/ui/neg_multiply.stderr
@@ -1,16 +1,48 @@
-error: this `multiplication with -1` can be written more succinctly
-  --> $DIR/neg_multiply.rs:27:5
+error: operator precedence can trip the unwary
+  --> $DIR/neg_multiply.rs:38:5
+   |
+LL |     0xcafe | 0xff00 * -1;
+   |     ^^^^^^^^^^^^^^^^^^^^ help: consider parenthesizing your expression: `0xcafe | (0xff00 * -1)`
+   |
+   = note: `-D clippy::precedence` implied by `-D warnings`
+
+error: this multiplication by -1 can be written more succinctly
+  --> $DIR/neg_multiply.rs:28:5
    |
 LL |     x * -1;
    |     ^^^^^^ help: consider using: `-x`
    |
    = note: `-D clippy::neg-multiply` implied by `-D warnings`
 
-error: this `multiplication with -1` can be written more succinctly
-  --> $DIR/neg_multiply.rs:29:5
+error: this multiplication by -1 can be written more succinctly
+  --> $DIR/neg_multiply.rs:30:5
    |
 LL |     -1 * x;
    |     ^^^^^^ help: consider using: `-x`
 
-error: aborting due to 2 previous errors
+error: this multiplication by -1 can be written more succinctly
+  --> $DIR/neg_multiply.rs:32:11
+   |
+LL |     100 + x * -1;
+   |           ^^^^^^ help: consider using: `-x`
+
+error: this multiplication by -1 can be written more succinctly
+  --> $DIR/neg_multiply.rs:34:5
+   |
+LL |     (100 + x) * -1;
+   |     ^^^^^^^^^^^^^^ help: consider using: `-(100 + x)`
+
+error: this multiplication by -1 can be written more succinctly
+  --> $DIR/neg_multiply.rs:36:5
+   |
+LL |     -1 * 17;
+   |     ^^^^^^^ help: consider using: `-17`
+
+error: this multiplication by -1 can be written more succinctly
+  --> $DIR/neg_multiply.rs:38:14
+   |
+LL |     0xcafe | 0xff00 * -1;
+   |              ^^^^^^^^^^^ help: consider using: `-0xff00`
+
+error: aborting due to 7 previous errors