Skip to content

Commit df7899e

Browse files
committed
Add unwrap block assist #4156
Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com>
1 parent dc34162 commit df7899e

File tree

1 file changed

+23
-46
lines changed

1 file changed

+23
-46
lines changed

crates/ra_assists/src/handlers/unwrap_block.rs

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

3-
use ast::LoopBodyOwner;
3+
use ast::{BlockExpr, Expr, LoopBodyOwner};
44
use ra_fmt::unwrap_trivial_block;
5-
use ra_syntax::{ast, AstNode};
5+
use ra_syntax::{ast, AstNode, TextRange};
66

77
// Assist: unwrap_block
88
//
@@ -26,24 +26,14 @@ pub(crate) fn unwrap_block(ctx: AssistCtx) -> Option<Assist> {
2626
// if expression
2727
let mut expr_to_unwrap: Option<ast::Expr> = None;
2828
for block_expr in if_expr.blocks() {
29-
if let Some(block) = block_expr.block() {
30-
let cursor_in_range =
31-
block.l_curly_token()?.text_range().contains_range(ctx.frange.range);
32-
33-
if cursor_in_range {
34-
let exprto = unwrap_trivial_block(block_expr);
35-
expr_to_unwrap = Some(exprto);
36-
break;
37-
}
29+
if let Some(expr) = excract_expr(ctx.frange.range, block_expr) {
30+
expr_to_unwrap = Some(expr);
31+
break;
3832
}
3933
}
4034
let expr_to_unwrap = expr_to_unwrap?;
4135
// Find if we are in a else if block
42-
let ancestor = ctx
43-
.sema
44-
.ancestors_with_macros(if_expr.syntax().clone())
45-
.skip(1)
46-
.find_map(ast::IfExpr::cast);
36+
let ancestor = if_expr.syntax().ancestors().skip(1).find_map(ast::IfExpr::cast);
4737

4838
if let Some(ancestor) = ancestor {
4939
Some((ast::Expr::IfExpr(ancestor), expr_to_unwrap))
@@ -53,42 +43,18 @@ pub(crate) fn unwrap_block(ctx: AssistCtx) -> Option<Assist> {
5343
} else if let Some(for_expr) = ctx.find_node_at_offset::<ast::ForExpr>() {
5444
// for expression
5545
let block_expr = for_expr.loop_body()?;
56-
let block = block_expr.block()?;
57-
let cursor_in_range = block.l_curly_token()?.text_range().contains_range(ctx.frange.range);
58-
59-
if cursor_in_range {
60-
let expr_to_unwrap = unwrap_trivial_block(block_expr);
61-
62-
Some((ast::Expr::ForExpr(for_expr), expr_to_unwrap))
63-
} else {
64-
None
65-
}
46+
excract_expr(ctx.frange.range, block_expr)
47+
.map(|expr_to_unwrap| (ast::Expr::ForExpr(for_expr), expr_to_unwrap))
6648
} else if let Some(while_expr) = ctx.find_node_at_offset::<ast::WhileExpr>() {
6749
// while expression
6850
let block_expr = while_expr.loop_body()?;
69-
let block = block_expr.block()?;
70-
let cursor_in_range = block.l_curly_token()?.text_range().contains_range(ctx.frange.range);
71-
72-
if cursor_in_range {
73-
let expr_to_unwrap = unwrap_trivial_block(block_expr);
74-
75-
Some((ast::Expr::WhileExpr(while_expr), expr_to_unwrap))
76-
} else {
77-
None
78-
}
51+
excract_expr(ctx.frange.range, block_expr)
52+
.map(|expr_to_unwrap| (ast::Expr::WhileExpr(while_expr), expr_to_unwrap))
7953
} else if let Some(loop_expr) = ctx.find_node_at_offset::<ast::LoopExpr>() {
8054
// loop expression
8155
let block_expr = loop_expr.loop_body()?;
82-
let block = block_expr.block()?;
83-
let cursor_in_range = block.l_curly_token()?.text_range().contains_range(ctx.frange.range);
84-
85-
if cursor_in_range {
86-
let expr_to_unwrap = unwrap_trivial_block(block_expr);
87-
88-
Some((ast::Expr::LoopExpr(loop_expr), expr_to_unwrap))
89-
} else {
90-
None
91-
}
56+
excract_expr(ctx.frange.range, block_expr)
57+
.map(|expr_to_unwrap| (ast::Expr::LoopExpr(loop_expr), expr_to_unwrap))
9258
} else {
9359
None
9460
};
@@ -114,6 +80,17 @@ pub(crate) fn unwrap_block(ctx: AssistCtx) -> Option<Assist> {
11480
})
11581
}
11682

83+
fn excract_expr(cursor_range: TextRange, block_expr: BlockExpr) -> Option<Expr> {
84+
let block = block_expr.block()?;
85+
let cursor_in_range = block.l_curly_token()?.text_range().contains_range(cursor_range);
86+
87+
if cursor_in_range {
88+
Some(unwrap_trivial_block(block_expr))
89+
} else {
90+
None
91+
}
92+
}
93+
11794
#[cfg(test)]
11895
mod tests {
11996
use crate::helpers::{check_assist, check_assist_not_applicable};

0 commit comments

Comments
 (0)