diff --git a/src/closures.rs b/src/closures.rs index 1f59fbc2960..bdd08bc2d35 100644 --- a/src/closures.rs +++ b/src/closures.rs @@ -108,7 +108,7 @@ fn get_inner_expr<'a>( if !needs_block(block, prefix, context) { // block.stmts.len() == 1 except with `|| {{}}`; // https://github.com/rust-lang/rustfmt/issues/3844 - if let Some(expr) = block.stmts.first().and_then(stmt_expr) { + if let Some(expr) = iter_stmts_without_empty(&block).next().and_then(stmt_expr) { return get_inner_expr(expr, prefix, context); } } @@ -117,6 +117,13 @@ fn get_inner_expr<'a>( expr } +fn iter_stmts_without_empty(block: &ast::Block) -> impl Iterator { + block + .stmts + .iter() + .filter(|stmt| !matches!(stmt.kind, ast::StmtKind::Empty)) +} + // Figure out if a block is necessary. fn needs_block(block: &ast::Block, prefix: &str, context: &RewriteContext<'_>) -> bool { let has_attributes = block.stmts.first().map_or(false, |first_stmt| { @@ -124,7 +131,7 @@ fn needs_block(block: &ast::Block, prefix: &str, context: &RewriteContext<'_>) - }); is_unsafe_block(block) - || block.stmts.len() > 1 + || iter_stmts_without_empty(&block).count() > 1 || has_attributes || block_contains_comment(context, block) || prefix.contains('\n') diff --git a/tests/source/issue-6116/main.rs b/tests/source/issue-6116/main.rs new file mode 100644 index 00000000000..910131a4761 --- /dev/null +++ b/tests/source/issue-6116/main.rs @@ -0,0 +1,7 @@ +fn foo() -> fn(i32) -> i32 { + |a| { + ; + a + } +} + diff --git a/tests/source/issue-6116/main2.rs b/tests/source/issue-6116/main2.rs new file mode 100644 index 00000000000..1114fb1c461 --- /dev/null +++ b/tests/source/issue-6116/main2.rs @@ -0,0 +1,8 @@ +fn bar() -> fn(i32) -> i32 { + |a| { + ; + a; + b + } +} + diff --git a/tests/source/issue-6116/main3.rs b/tests/source/issue-6116/main3.rs new file mode 100644 index 00000000000..dbba9d96164 --- /dev/null +++ b/tests/source/issue-6116/main3.rs @@ -0,0 +1,8 @@ +fn foo() -> fn(i32) -> i32 { + |a| { + ; + ; + ;;;; + a + } +} diff --git a/tests/source/issue-6116/main4.rs b/tests/source/issue-6116/main4.rs new file mode 100644 index 00000000000..754aed66e72 --- /dev/null +++ b/tests/source/issue-6116/main4.rs @@ -0,0 +1,7 @@ +fn foo() -> fn(i32) -> i32 { + |a| { + /*comment before empty statement */; + a + } +} + diff --git a/tests/target/issue-6116/main.rs b/tests/target/issue-6116/main.rs new file mode 100644 index 00000000000..dc0e48f1bfe --- /dev/null +++ b/tests/target/issue-6116/main.rs @@ -0,0 +1,3 @@ +fn foo() -> fn(i32) -> i32 { + |a| a +} diff --git a/tests/target/issue-6116/main2.rs b/tests/target/issue-6116/main2.rs new file mode 100644 index 00000000000..89679587ebc --- /dev/null +++ b/tests/target/issue-6116/main2.rs @@ -0,0 +1,6 @@ +fn bar() -> fn(i32) -> i32 { + |a| { + a; + b + } +} diff --git a/tests/target/issue-6116/main3.rs b/tests/target/issue-6116/main3.rs new file mode 100644 index 00000000000..dc0e48f1bfe --- /dev/null +++ b/tests/target/issue-6116/main3.rs @@ -0,0 +1,3 @@ +fn foo() -> fn(i32) -> i32 { + |a| a +} diff --git a/tests/target/issue-6116/main4.rs b/tests/target/issue-6116/main4.rs new file mode 100644 index 00000000000..e2eef35ef7b --- /dev/null +++ b/tests/target/issue-6116/main4.rs @@ -0,0 +1,6 @@ +fn foo() -> fn(i32) -> i32 { + |a| { + /*comment before empty statement */ + a + } +}