mirror of
https://github.com/rust-lang/rust-clippy
synced 2025-02-17 14:38:46 +00:00
#8214 cmp_owned suggestion flips the comparison
This commit is contained in:
parent
27845a9205
commit
5b6ec8c57d
4 changed files with 96 additions and 3 deletions
|
@ -548,6 +548,7 @@ fn is_array(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||||
matches!(&cx.typeck_results().expr_ty(expr).peel_refs().kind(), ty::Array(_, _))
|
matches!(&cx.typeck_results().expr_ty(expr).peel_refs().kind(), ty::Array(_, _))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_lines)]
|
||||||
fn check_to_owned(cx: &LateContext<'_>, expr: &Expr<'_>, other: &Expr<'_>, left: bool) {
|
fn check_to_owned(cx: &LateContext<'_>, expr: &Expr<'_>, other: &Expr<'_>, left: bool) {
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct EqImpl {
|
struct EqImpl {
|
||||||
|
@ -644,10 +645,26 @@ fn check_to_owned(cx: &LateContext<'_>, expr: &Expr<'_>, other: &Expr<'_>, left:
|
||||||
hint = expr_snip;
|
hint = expr_snip;
|
||||||
} else {
|
} else {
|
||||||
span = expr.span.to(other.span);
|
span = expr.span.to(other.span);
|
||||||
if eq_impl.ty_eq_other {
|
|
||||||
hint = format!("{} == {}", expr_snip, snippet(cx, other.span, ".."));
|
let cmp_span = if other.span < expr.span {
|
||||||
|
other.span.between(expr.span)
|
||||||
} else {
|
} else {
|
||||||
hint = format!("{} == {}", snippet(cx, other.span, ".."), expr_snip);
|
expr.span.between(other.span)
|
||||||
|
};
|
||||||
|
if eq_impl.ty_eq_other {
|
||||||
|
hint = format!(
|
||||||
|
"{}{}{}",
|
||||||
|
expr_snip,
|
||||||
|
snippet(cx, cmp_span, ".."),
|
||||||
|
snippet(cx, other.span, "..")
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
hint = format!(
|
||||||
|
"{}{}{}",
|
||||||
|
snippet(cx, other.span, ".."),
|
||||||
|
snippet(cx, cmp_span, ".."),
|
||||||
|
expr_snip
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
29
tests/ui/cmp_owned/comparison_flip.fixed
Normal file
29
tests/ui/cmp_owned/comparison_flip.fixed
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
use std::fmt::{self, Display};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let a = Foo;
|
||||||
|
|
||||||
|
if a != "bar" {
|
||||||
|
println!("foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
if a != "bar" {
|
||||||
|
println!("foo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
|
||||||
|
impl Display for Foo {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "foo")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq<&str> for Foo {
|
||||||
|
fn eq(&self, other: &&str) -> bool {
|
||||||
|
"foo" == *other
|
||||||
|
}
|
||||||
|
}
|
29
tests/ui/cmp_owned/comparison_flip.rs
Normal file
29
tests/ui/cmp_owned/comparison_flip.rs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
use std::fmt::{self, Display};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let a = Foo;
|
||||||
|
|
||||||
|
if a.to_string() != "bar" {
|
||||||
|
println!("foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
if "bar" != a.to_string() {
|
||||||
|
println!("foo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
|
||||||
|
impl Display for Foo {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "foo")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq<&str> for Foo {
|
||||||
|
fn eq(&self, other: &&str) -> bool {
|
||||||
|
"foo" == *other
|
||||||
|
}
|
||||||
|
}
|
18
tests/ui/cmp_owned/comparison_flip.stderr
Normal file
18
tests/ui/cmp_owned/comparison_flip.stderr
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
error: this creates an owned instance just for comparison
|
||||||
|
--> $DIR/comparison_flip.rs:8:8
|
||||||
|
|
|
||||||
|
LL | if a.to_string() != "bar" {
|
||||||
|
| ^^^^^^^^^^^^^ help: try: `a`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::cmp-owned` implied by `-D warnings`
|
||||||
|
|
||||||
|
error: this creates an owned instance just for comparison
|
||||||
|
--> $DIR/comparison_flip.rs:12:17
|
||||||
|
|
|
||||||
|
LL | if "bar" != a.to_string() {
|
||||||
|
| ---------^^^^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| help: try: `a != "bar"`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
Loading…
Add table
Reference in a new issue