Use `span_suggestion` for `WHILE_LET_ON_ITERATOR`

This commit is contained in:
mcarton 2016-06-07 18:32:26 +02:00
parent 3df32cc723
commit dd3fd41a03
No known key found for this signature in database
GPG Key ID: 5E427C794CBA45E8
7 changed files with 102 additions and 36 deletions

View File

@ -290,11 +290,15 @@ impl LateLintPass for LoopsPass {
!is_iterator_used_after_while_let(cx, iter_expr) {
let iterator = snippet(cx, method_args[0].span, "_");
let loop_var = snippet(cx, pat_args[0].span, "_");
span_help_and_lint(cx,
span_lint_and_then(cx,
WHILE_LET_ON_ITERATOR,
expr.span,
"this loop could be written as a `for` loop",
&format!("try\nfor {} in {} {{...}}", loop_var, iterator));
|db| {
db.span_suggestion(expr.span,
"try",
format!("for {} in {} {{ .. }}", loop_var, iterator));
});
}
}
}
@ -598,7 +602,7 @@ fn check_for_loop_over_map_kv(cx: &LateContext, pat: &Pat, arg: &Expr, body: &Ex
|db| {
db.span_suggestion(expr.span,
"use the corresponding method",
format!("for {} in {}.{}() {{...}}",
format!("for {} in {}.{}() {{ .. }}",
snippet(cx, *pat_span, ".."),
snippet(cx, arg_span, ".."),
kind));

View File

@ -8,15 +8,33 @@ fn main() {
let u: u32 = 42;
u <= 0; //~ERROR this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
u <= Z; //~ERROR this comparison involving
u < Z; //~ERROR this comparison involving
Z >= u; //~ERROR this comparison involving
Z > u; //~ERROR this comparison involving
u > std::u32::MAX; //~ERROR this comparison involving
u >= std::u32::MAX; //~ERROR this comparison involving
std::u32::MAX < u; //~ERROR this comparison involving
std::u32::MAX <= u; //~ERROR this comparison involving
u <= 0;
//~^ ERROR this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
//~| HELP using u == 0 instead
u <= Z;
//~^ ERROR this comparison involving
//~| HELP using u == Z instead
u < Z;
//~^ ERROR this comparison involving
//~| HELP comparison is always false
Z >= u;
//~^ ERROR this comparison involving
//~| HELP using Z == u instead
Z > u;
//~^ ERROR this comparison involving
//~| HELP comparison is always false
u > std::u32::MAX;
//~^ ERROR this comparison involving
//~| HELP comparison is always false
u >= std::u32::MAX;
//~^ ERROR this comparison involving
//~| HELP using u == std::u32::MAX instead
std::u32::MAX < u;
//~^ ERROR this comparison involving
//~| HELP comparison is always false
std::u32::MAX <= u;
//~^ ERROR this comparison involving
//~| HELP using std::u32::MAX == u instead
1-1 > u;
//~^ ERROR this comparison involving
@ -29,13 +47,23 @@ fn main() {
//~| HELP because 12 - 2*6 is the minimum value for this type, the case where the two sides are not equal never occurs, consider using u == 12 - 2*6 instead
let i: i8 = 0;
i < -127 - 1; //~ERROR this comparison involving
std::i8::MAX >= i; //~ERROR this comparison involving
3-7 < std::i32::MIN; //~ERROR this comparison involving
i < -127 - 1;
//~^ ERROR this comparison involving
//~| HELP comparison is always false
std::i8::MAX >= i;
//~^ ERROR this comparison involving
//~| HELP comparison is always true
3-7 < std::i32::MIN;
//~^ ERROR this comparison involving
//~| HELP comparison is always false
let b = false;
b >= true; //~ERROR this comparison involving
false > b; //~ERROR this comparison involving
b >= true;
//~^ ERROR this comparison involving
//~| HELP using b == true instead
false > b;
//~^ ERROR this comparison involving
//~| HELP comparison is always false
u > 0; // ok

View File

@ -52,29 +52,37 @@ fn equality_stuff() {
let c: i32 = unimplemented!();
let d: i32 = unimplemented!();
let e: i32 = unimplemented!();
let _ = a == b && a != b; //~ ERROR this boolean expression contains a logic bug
let _ = a == b && a != b;
//~^ ERROR this boolean expression contains a logic bug
//~| HELP this expression can be optimized out
//~| HELP it would look like the following
//~| SUGGESTION let _ = false;
let _ = a == b && c == 5 && a == b; //~ ERROR this boolean expression can be simplified
//~| HELP try
//~| SUGGESTION let _ = a == b && c == 5;
let _ = a == b && c == 5 && b == a; //~ ERROR this boolean expression can be simplified
let _ = a == b && c == 5 && a == b;
//~^ ERROR this boolean expression can be simplified
//~| HELP try
//~| SUGGESTION let _ = a == b && c == 5;
//~| HELP try
//~| SUGGESTION let _ = !(c != 5 || a != b);
let _ = a < b && a >= b; //~ ERROR this boolean expression contains a logic bug
let _ = a == b && c == 5 && b == a;
//~^ ERROR this boolean expression can be simplified
//~| HELP try
//~| SUGGESTION let _ = a == b && c == 5;
//~| HELP try
//~| SUGGESTION let _ = !(c != 5 || a != b);
let _ = a < b && a >= b;
//~^ ERROR this boolean expression contains a logic bug
//~| HELP this expression can be optimized out
//~| HELP it would look like the following
//~| SUGGESTION let _ = false;
let _ = a > b && a <= b; //~ ERROR this boolean expression contains a logic bug
let _ = a > b && a <= b;
//~^ ERROR this boolean expression contains a logic bug
//~| HELP this expression can be optimized out
//~| HELP it would look like the following
//~| SUGGESTION let _ = false;
let _ = a > b && a == b;
let _ = a != b || !(a != b || c == d); //~ ERROR this boolean expression can be simplified
let _ = a != b || !(a != b || c == d);
//~^ ERROR this boolean expression can be simplified
//~| HELP try
//~| SUGGESTION let _ = c != d || a != b;
//~| HELP try

View File

@ -5,13 +5,19 @@
fn main() {
let x = "hello";
let y = "world";
if x == "hello" { //~ERROR this if statement can be collapsed
if x == "hello" {
//~^ ERROR this if statement can be collapsed
//~| HELP try
//~| SUGGESTION if x == "hello" && y == "world" {
if y == "world" {
println!("Hello world!");
}
}
if x == "hello" || x == "world" { //~ERROR this if statement can be collapsed
if x == "hello" || x == "world" {
//~^ ERROR this if statement can be collapsed
//~| HELP try
//~| SUGGESTION if (x == "hello" || x == "world") && (y == "world" || y == "hello") {
if y == "world" || y == "hello" {
println!("Hello world!");
}

View File

@ -200,11 +200,17 @@ fn main() {
}
// testing that the empty range lint folds constants
for i in 10..5+4 { //~ERROR this range is empty so this for loop will never run
for i in 10..5+4 {
//~^ ERROR this range is empty so this for loop will never run
//~| HELP if you are attempting to iterate over this range in reverse
//~| SUGGESTION for i in (5+4..10).rev() {
println!("{}", i);
}
for i in (5+2)..(3-1) { //~ERROR this range is empty so this for loop will never run
for i in (5+2)..(3-1) {
//~^ ERROR this range is empty so this for loop will never run
//~| HELP if you are attempting to iterate over this range in reverse
//~| SUGGESTION for i in ((3-1)..(5+2)).rev() {
println!("{}", i);
}

View File

@ -100,28 +100,43 @@ fn single_match_know_enum() {
fn match_bool() {
let test: bool = true;
match test { //~ ERROR you seem to be trying to match on a boolean expression
match test {
//~^ ERROR you seem to be trying to match on a boolean expression
//~| HELP try
//~| SUGGESTION if test { 0 } else { 42 };
true => 0,
false => 42,
};
let option = 1;
match option == 1 { //~ ERROR you seem to be trying to match on a boolean expression
match option == 1 {
//~^ ERROR you seem to be trying to match on a boolean expression
//~| HELP try
//~| SUGGESTION if option == 1 { 1 } else { 0 };
true => 1,
false => 0,
};
match test { //~ ERROR you seem to be trying to match on a boolean expression
match test {
//~^ ERROR you seem to be trying to match on a boolean expression
//~| HELP try
//~^^ SUGGESTION if !test { println!("Noooo!"); };
true => (),
false => { println!("Noooo!"); }
};
match test { //~ ERROR you seem to be trying to match on a boolean expression
match test {
//~^ ERROR you seem to be trying to match on a boolean expression
//~| HELP try
//~^^ SUGGESTION if !test { println!("Noooo!"); };
false => { println!("Noooo!"); }
_ => (),
};
match test { //~ ERROR you seem to be trying to match on a boolean expression
match test {
//~^ ERROR you seem to be trying to match on a boolean expression
//~| HELP try
//~| SUGGESTION if test { println!("Yes!"); } else { println!("Noooo!"); };
false => { println!("Noooo!"); }
true => { println!("Yes!"); }
};
@ -216,7 +231,7 @@ fn overlapping() {
11 ... 50 => println!("0 ... 10"),
_ => (),
}
if let None = Some(42) {
// nothing
} else if let None = Some(42) {

View File

@ -40,5 +40,4 @@ fn main() {
let mut z = mut_ptr!(&mut 3u32);
//~^ NOTE in this expansion of mut_ptr!
//~| NOTE in this expansion of mut_ptr!
}