Add support for suggestion when using an expression
This commit is contained in:
parent
5ad37b1a4b
commit
88e40bc73d
@ -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,
|
||||
|
44
tests/ui/neg_multiply.fixed
Normal file
44
tests/ui/neg_multiply.fixed
Normal file
@ -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
|
||||
}
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user