Skip to content

Commit d745022

Browse files
committed
Simplify
1 parent 580c5a9 commit d745022

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

crates/ra_assists/src/handlers/unwrap_block.rs

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::{Assist, AssistCtx, AssistId};
22

3-
use ast::{BlockExpr, Expr, ForExpr, IfExpr, LoopBodyOwner, LoopExpr, WhileExpr};
3+
use ast::LoopBodyOwner;
44
use ra_fmt::unwrap_trivial_block;
5-
use ra_syntax::{ast, AstNode, TextRange, T};
5+
use ra_syntax::{ast, match_ast, AstNode, TextRange, T};
66

77
// Assist: unwrap_block
88
//
@@ -23,37 +23,38 @@ use ra_syntax::{ast, AstNode, TextRange, T};
2323
// ```
2424
pub(crate) fn unwrap_block(ctx: AssistCtx) -> Option<Assist> {
2525
let l_curly_token = ctx.find_token_at_offset(T!['{'])?;
26-
27-
let (expr, expr_to_unwrap) = if let Some(if_expr) =
28-
l_curly_token.ancestors().find_map(IfExpr::cast)
29-
{
30-
// if expression
31-
let expr_to_unwrap = if_expr.blocks().find_map(|expr| extract_expr(ctx.frange.range, expr));
32-
let expr_to_unwrap = expr_to_unwrap?;
33-
// Find if we are in a else if block
34-
let ancestor = if_expr.syntax().ancestors().skip(1).find_map(ast::IfExpr::cast);
35-
36-
match ancestor {
37-
None => (ast::Expr::IfExpr(if_expr), expr_to_unwrap),
38-
Some(ancestor) => (ast::Expr::IfExpr(ancestor), expr_to_unwrap),
26+
let block = ast::BlockExpr::cast(l_curly_token.parent())?;
27+
let parent = block.syntax().parent()?;
28+
let (expr, expr_to_unwrap) = match_ast! {
29+
match parent {
30+
ast::IfExpr(if_expr) => {
31+
let expr_to_unwrap = if_expr.blocks().find_map(|expr| extract_expr(ctx.frange.range, expr));
32+
let expr_to_unwrap = expr_to_unwrap?;
33+
// Find if we are in a else if block
34+
let ancestor = if_expr.syntax().parent().and_then(ast::IfExpr::cast);
35+
36+
match ancestor {
37+
None => (ast::Expr::IfExpr(if_expr), expr_to_unwrap),
38+
Some(ancestor) => (ast::Expr::IfExpr(ancestor), expr_to_unwrap),
39+
}
40+
},
41+
ast::ForExpr(for_expr) => {
42+
let block_expr = for_expr.loop_body()?;
43+
let expr_to_unwrap = extract_expr(ctx.frange.range, block_expr)?;
44+
(ast::Expr::ForExpr(for_expr), expr_to_unwrap)
45+
},
46+
ast::WhileExpr(while_expr) => {
47+
let block_expr = while_expr.loop_body()?;
48+
let expr_to_unwrap = extract_expr(ctx.frange.range, block_expr)?;
49+
(ast::Expr::WhileExpr(while_expr), expr_to_unwrap)
50+
},
51+
ast::LoopExpr(loop_expr) => {
52+
let block_expr = loop_expr.loop_body()?;
53+
let expr_to_unwrap = extract_expr(ctx.frange.range, block_expr)?;
54+
(ast::Expr::LoopExpr(loop_expr), expr_to_unwrap)
55+
},
56+
_ => return None,
3957
}
40-
} else if let Some(for_expr) = l_curly_token.ancestors().find_map(ForExpr::cast) {
41-
// for expression
42-
let block_expr = for_expr.loop_body()?;
43-
let expr_to_unwrap = extract_expr(ctx.frange.range, block_expr)?;
44-
(ast::Expr::ForExpr(for_expr), expr_to_unwrap)
45-
} else if let Some(while_expr) = l_curly_token.ancestors().find_map(WhileExpr::cast) {
46-
// while expression
47-
let block_expr = while_expr.loop_body()?;
48-
let expr_to_unwrap = extract_expr(ctx.frange.range, block_expr)?;
49-
(ast::Expr::WhileExpr(while_expr), expr_to_unwrap)
50-
} else if let Some(loop_expr) = l_curly_token.ancestors().find_map(LoopExpr::cast) {
51-
// loop expression
52-
let block_expr = loop_expr.loop_body()?;
53-
let expr_to_unwrap = extract_expr(ctx.frange.range, block_expr)?;
54-
(ast::Expr::LoopExpr(loop_expr), expr_to_unwrap)
55-
} else {
56-
return None;
5758
};
5859

5960
ctx.add_assist(AssistId("unwrap_block"), "Unwrap block", |edit| {
@@ -76,7 +77,7 @@ pub(crate) fn unwrap_block(ctx: AssistCtx) -> Option<Assist> {
7677
})
7778
}
7879

79-
fn extract_expr(cursor_range: TextRange, block: BlockExpr) -> Option<Expr> {
80+
fn extract_expr(cursor_range: TextRange, block: ast::BlockExpr) -> Option<ast::Expr> {
8081
let cursor_in_range = block.l_curly_token()?.text_range().contains_range(cursor_range);
8182

8283
if cursor_in_range {

0 commit comments

Comments
 (0)