|
1 | 1 | use syntax::{ |
2 | | - AstNode, SyntaxKind, T, |
| 2 | + AstNode, Direction, SyntaxKind, T, |
| 3 | + algo::skip_trivia_token, |
3 | 4 | ast::{self, syntax_factory::SyntaxFactory}, |
4 | 5 | syntax_editor::Position, |
5 | 6 | }; |
@@ -33,6 +34,16 @@ pub(crate) fn remove_parentheses(acc: &mut Assists, ctx: &AssistContext<'_>) -> |
33 | 34 |
|
34 | 35 | let expr = parens.expr()?; |
35 | 36 |
|
| 37 | + if let ast::Expr::ReturnExpr(ret) = &expr |
| 38 | + && ret.expr().is_none() |
| 39 | + && let Some(r_paren) = parens.r_paren_token() |
| 40 | + && let Some(next) = r_paren.next_token().and_then(|t| skip_trivia_token(t, Direction::Next)) |
| 41 | + && next.kind() == T![||] |
| 42 | + { |
| 43 | + cov_mark::hit!(remove_parens_return_closure); |
| 44 | + return None; |
| 45 | + } |
| 46 | + |
36 | 47 | let parent = parens.syntax().parent()?; |
37 | 48 | if expr.needs_parens_in(&parent) { |
38 | 49 | return None; |
@@ -247,6 +258,24 @@ mod tests { |
247 | 258 | ); |
248 | 259 | } |
249 | 260 |
|
| 261 | + #[test] |
| 262 | + fn remove_parens_return_in_unary_not() { |
| 263 | + cov_mark::check!(remove_parens_return_closure); |
| 264 | + check_assist_not_applicable( |
| 265 | + remove_parentheses, |
| 266 | + r#"fn main() { let _x = true && !$0(return) || true; }"#, |
| 267 | + ); |
| 268 | + } |
| 269 | + |
| 270 | + #[test] |
| 271 | + fn remove_parens_return_in_disjunction_is_ok() { |
| 272 | + check_assist( |
| 273 | + remove_parentheses, |
| 274 | + r#"fn f() { let _ = true || $0(return); }"#, |
| 275 | + r#"fn f() { let _ = true || return; }"#, |
| 276 | + ); |
| 277 | + } |
| 278 | + |
250 | 279 | #[test] |
251 | 280 | fn remove_parens_double_paren_stmt() { |
252 | 281 | check_assist( |
|
0 commit comments