Check for comments in collapsible ifs

This commit is contained in:
Lukas Stevens 2018-10-16 22:20:27 +02:00
parent 1264bb6b7d
commit 8753e568bf
3 changed files with 71 additions and 1 deletions

View file

@ -112,9 +112,17 @@ fn check_if(cx: &EarlyContext<'_>, expr: &ast::Expr) {
}
}
fn block_starts_with_comment(cx: &EarlyContext<'_>, expr: &ast::Block) -> bool {
// The zeroth character in the trimmed block text is "{", which marks the beginning of the block.
// Therefore, we check if the first string after that is a comment, i.e. starts with //.
let trimmed_block_text = snippet_block(cx, expr.span, "..").trim_left().to_owned();
trimmed_block_text[1..trimmed_block_text.len()].trim_left().starts_with("//")
}
fn check_collapsible_maybe_if_let(cx: &EarlyContext<'_>, else_: &ast::Expr) {
if_chain! {
if let ast::ExprKind::Block(ref block, _) = else_.node;
if !block_starts_with_comment(cx, block);
if let Some(else_) = expr_block(block);
if !in_macro(else_.span);
then {
@ -135,6 +143,7 @@ fn check_collapsible_maybe_if_let(cx: &EarlyContext<'_>, else_: &ast::Expr) {
fn check_collapsible_no_if_let(cx: &EarlyContext<'_>, expr: &ast::Expr, check: &ast::Expr, then: &ast::Block) {
if_chain! {
if !block_starts_with_comment(cx, then);
if let Some(inner) = expr_block(then);
if let ast::ExprKind::If(ref check_inner, ref content, None) = inner.node;
then {

View file

@ -151,4 +151,49 @@ fn main() {
} else {
assert!(true); // assert! is just an `if`
}
// The following tests check for the fix of https://github.com/rust-lang-nursery/rust-clippy/issues/798
if x == "hello" {// Not collapsible
if y == "world" {
println!("Hello world!");
}
}
if x == "hello" { // Not collapsible
if y == "world" {
println!("Hello world!");
}
}
if x == "hello" {
// Not collapsible
if y == "world" {
println!("Hello world!");
}
}
if x == "hello" {
if y == "world" { // Collapsible
println!("Hello world!");
}
}
if x == "hello" {
print!("Hello ");
} else {
// Not collapsible
if y == "world" {
println!("world!")
}
}
if x == "hello" {
print!("Hello ");
} else {
// Not collapsible
if let Some(42) = Some(42) {
println!("world!")
}
}
}

View file

@ -240,5 +240,21 @@ help: try
122 | }
|
error: aborting due to 13 previous errors
error: this if statement can be collapsed
--> $DIR/collapsible_if.rs:176:5
|
176 | / if x == "hello" {
177 | | if y == "world" { // Collapsible
178 | | println!("Hello world!");
179 | | }
180 | | }
| |_____^
help: try
|
176 | if x == "hello" && y == "world" { // Collapsible
177 | println!("Hello world!");
178 | }
|
error: aborting due to 14 previous errors