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) { !is_iterator_used_after_while_let(cx, iter_expr) {
let iterator = snippet(cx, method_args[0].span, "_"); let iterator = snippet(cx, method_args[0].span, "_");
let loop_var = snippet(cx, pat_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, WHILE_LET_ON_ITERATOR,
expr.span, expr.span,
"this loop could be written as a `for` loop", "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| {
db.span_suggestion(expr.span, db.span_suggestion(expr.span,
"use the corresponding method", "use the corresponding method",
format!("for {} in {}.{}() {{...}}", format!("for {} in {}.{}() {{ .. }}",
snippet(cx, *pat_span, ".."), snippet(cx, *pat_span, ".."),
snippet(cx, arg_span, ".."), snippet(cx, arg_span, ".."),
kind)); kind));

View File

@ -8,15 +8,33 @@ fn main() {
let u: u32 = 42; 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 <= 0;
u <= Z; //~ERROR this comparison involving //~^ 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 //~| HELP using u == 0 instead
Z >= u; //~ERROR this comparison involving u <= Z;
Z > u; //~ERROR this comparison involving //~^ ERROR this comparison involving
u > std::u32::MAX; //~ERROR this comparison involving //~| HELP using u == Z instead
u >= std::u32::MAX; //~ERROR this comparison involving u < Z;
std::u32::MAX < u; //~ERROR this comparison involving //~^ ERROR this comparison involving
std::u32::MAX <= u; //~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; 1-1 > u;
//~^ ERROR this comparison involving //~^ 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 //~| 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; let i: i8 = 0;
i < -127 - 1; //~ERROR this comparison involving i < -127 - 1;
std::i8::MAX >= i; //~ERROR this comparison involving //~^ ERROR this comparison involving
3-7 < std::i32::MIN; //~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; let b = false;
b >= true; //~ERROR this comparison involving b >= true;
false > b; //~ERROR this comparison involving //~^ ERROR this comparison involving
//~| HELP using b == true instead
false > b;
//~^ ERROR this comparison involving
//~| HELP comparison is always false
u > 0; // ok u > 0; // ok

View File

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

View File

@ -5,13 +5,19 @@
fn main() { fn main() {
let x = "hello"; let x = "hello";
let y = "world"; 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" { if y == "world" {
println!("Hello 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" { if y == "world" || y == "hello" {
println!("Hello world!"); println!("Hello world!");
} }

View File

@ -200,11 +200,17 @@ fn main() {
} }
// testing that the empty range lint folds constants // 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); 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); println!("{}", i);
} }

View File

@ -100,28 +100,43 @@ fn single_match_know_enum() {
fn match_bool() { fn match_bool() {
let test: bool = true; 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, true => 0,
false => 42, false => 42,
}; };
let option = 1; 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, true => 1,
false => 0, 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 => (), true => (),
false => { 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!("Noooo!"); };
false => { 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!"); } false => { println!("Noooo!"); }
true => { println!("Yes!"); } true => { println!("Yes!"); }
}; };

View File

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