aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/assists
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/assists')
-rw-r--r--crates/ra_assists/src/assists/early_return.rs39
1 files changed, 20 insertions, 19 deletions
diff --git a/crates/ra_assists/src/assists/early_return.rs b/crates/ra_assists/src/assists/early_return.rs
index 570a07a20..f44610001 100644
--- a/crates/ra_assists/src/assists/early_return.rs
+++ b/crates/ra_assists/src/assists/early_return.rs
@@ -38,27 +38,27 @@ use crate::{
38// ``` 38// ```
39pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { 39pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
40 let if_expr: ast::IfExpr = ctx.find_node_at_offset()?; 40 let if_expr: ast::IfExpr = ctx.find_node_at_offset()?;
41 if if_expr.else_branch().is_some() {
42 return None;
43 }
44
41 let cond = if_expr.condition()?; 45 let cond = if_expr.condition()?;
42 let mut if_let_ident: Option<String> = None;
43 46
44 // Check if there is an IfLet that we can handle. 47 // Check if there is an IfLet that we can handle.
45 match cond.pat() { 48 let if_let_ident = match cond.pat() {
46 None => {} // No IfLet, supported. 49 None => None, // No IfLet, supported.
47 Some(TupleStructPat(ref pat)) if pat.args().count() == 1usize => match &pat.path() { 50 Some(TupleStructPat(pat)) if pat.args().count() == 1 => {
48 Some(p) => match p.qualifier() { 51 let path = pat.path()?;
49 None => if_let_ident = Some(p.syntax().text().to_string()), 52 match path.qualifier() {
50 _ => return None, 53 None => Some(path.syntax().to_string()),
51 }, 54 Some(_) => return None,
52 _ => return None, 55 }
53 }, 56 }
54 _ => return None, // Unsupported IfLet. 57 Some(_) => return None, // Unsupported IfLet.
55 }; 58 };
56 59
57 let expr = cond.expr()?; 60 let expr = cond.expr()?;
58 let then_block = if_expr.then_branch()?.block()?; 61 let then_block = if_expr.then_branch()?.block()?;
59 if if_expr.else_branch().is_some() {
60 return None;
61 }
62 62
63 let parent_block = if_expr.syntax().parent()?.ancestors().find_map(ast::Block::cast)?; 63 let parent_block = if_expr.syntax().parent()?.ancestors().find_map(ast::Block::cast)?;
64 64
@@ -100,7 +100,7 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Opt
100 let early_expression = &(early_expression.to_owned() + ";"); 100 let early_expression = &(early_expression.to_owned() + ";");
101 let new_expr = 101 let new_expr =
102 if_indent_level.increase_indent(make::if_expression(&expr, early_expression)); 102 if_indent_level.increase_indent(make::if_expression(&expr, early_expression));
103 replace(new_expr, &then_block, &parent_block, &if_expr) 103 replace(new_expr.syntax(), &then_block, &parent_block, &if_expr)
104 } 104 }
105 Some(if_let_ident) => { 105 Some(if_let_ident) => {
106 // If-let. 106 // If-let.
@@ -109,7 +109,7 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Opt
109 &if_let_ident, 109 &if_let_ident,
110 early_expression, 110 early_expression,
111 )); 111 ));
112 replace(new_expr, &then_block, &parent_block, &if_expr) 112 replace(new_expr.syntax(), &then_block, &parent_block, &if_expr)
113 } 113 }
114 }; 114 };
115 edit.target(if_expr.syntax().text_range()); 115 edit.target(if_expr.syntax().text_range());
@@ -117,7 +117,7 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Opt
117 edit.set_cursor(cursor_position); 117 edit.set_cursor(cursor_position);
118 118
119 fn replace( 119 fn replace(
120 new_expr: impl AstNode, 120 new_expr: &SyntaxNode,
121 then_block: &Block, 121 then_block: &Block,
122 parent_block: &Block, 122 parent_block: &Block,
123 if_expr: &ast::IfExpr, 123 if_expr: &ast::IfExpr,
@@ -130,7 +130,7 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Opt
130 } else { 130 } else {
131 end_of_then 131 end_of_then
132 }; 132 };
133 let mut then_statements = new_expr.syntax().children_with_tokens().chain( 133 let mut then_statements = new_expr.children_with_tokens().chain(
134 then_block_items 134 then_block_items
135 .syntax() 135 .syntax()
136 .children_with_tokens() 136 .children_with_tokens()
@@ -151,9 +151,10 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Opt
151 151
152#[cfg(test)] 152#[cfg(test)]
153mod tests { 153mod tests {
154 use super::*;
155 use crate::helpers::{check_assist, check_assist_not_applicable}; 154 use crate::helpers::{check_assist, check_assist_not_applicable};
156 155
156 use super::*;
157
157 #[test] 158 #[test]
158 fn convert_inside_fn() { 159 fn convert_inside_fn() {
159 check_assist( 160 check_assist(