Extract common parts of match arms in convert_to_guarded_return assist.
This commit is contained in:
parent
91ab3f8760
commit
bc14f500a0
@ -3,9 +3,10 @@ use std::ops::RangeInclusive;
|
|||||||
use hir::db::HirDatabase;
|
use hir::db::HirDatabase;
|
||||||
use ra_syntax::{
|
use ra_syntax::{
|
||||||
algo::replace_children,
|
algo::replace_children,
|
||||||
ast::{self, edit::IndentLevel, make, Pat::TupleStructPat},
|
ast::{self, edit::IndentLevel, make, Block, Pat::TupleStructPat},
|
||||||
AstNode,
|
AstNode,
|
||||||
SyntaxKind::{FN_DEF, LOOP_EXPR, L_CURLY, R_CURLY, WHILE_EXPR, WHITESPACE},
|
SyntaxKind::{FN_DEF, LOOP_EXPR, L_CURLY, R_CURLY, WHILE_EXPR, WHITESPACE},
|
||||||
|
SyntaxNode,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@ -97,40 +98,30 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Opt
|
|||||||
None => {
|
None => {
|
||||||
// If.
|
// If.
|
||||||
let early_expression = &(early_expression.to_owned() + ";");
|
let early_expression = &(early_expression.to_owned() + ";");
|
||||||
let new_if_expr =
|
let new_expr =
|
||||||
if_indent_level.increase_indent(make::if_expression(&expr, early_expression));
|
if_indent_level.increase_indent(make::if_expression(&expr, early_expression));
|
||||||
let then_block_items = IndentLevel::from(1).decrease_indent(then_block.clone());
|
replace(new_expr, &then_block, &parent_block, &if_expr)
|
||||||
let end_of_then = then_block_items.syntax().last_child_or_token().unwrap();
|
|
||||||
let end_of_then =
|
|
||||||
if end_of_then.prev_sibling_or_token().map(|n| n.kind()) == Some(WHITESPACE) {
|
|
||||||
end_of_then.prev_sibling_or_token().unwrap()
|
|
||||||
} else {
|
|
||||||
end_of_then
|
|
||||||
};
|
|
||||||
let mut new_if_and_then_statements =
|
|
||||||
new_if_expr.syntax().children_with_tokens().chain(
|
|
||||||
then_block_items
|
|
||||||
.syntax()
|
|
||||||
.children_with_tokens()
|
|
||||||
.skip(1)
|
|
||||||
.take_while(|i| *i != end_of_then),
|
|
||||||
);
|
|
||||||
replace_children(
|
|
||||||
&parent_block.syntax(),
|
|
||||||
RangeInclusive::new(
|
|
||||||
if_expr.clone().syntax().clone().into(),
|
|
||||||
if_expr.syntax().clone().into(),
|
|
||||||
),
|
|
||||||
&mut new_if_and_then_statements,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
Some(if_let_ident) => {
|
Some(if_let_ident) => {
|
||||||
// If-let.
|
// If-let.
|
||||||
let new_match_expr = if_indent_level.increase_indent(make::let_match_early(
|
let new_expr = if_indent_level.increase_indent(make::let_match_early(
|
||||||
expr,
|
expr,
|
||||||
&if_let_ident,
|
&if_let_ident,
|
||||||
early_expression,
|
early_expression,
|
||||||
));
|
));
|
||||||
|
replace(new_expr, &then_block, &parent_block, &if_expr)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
edit.target(if_expr.syntax().text_range());
|
||||||
|
edit.replace_ast(parent_block, ast::Block::cast(new_block).unwrap());
|
||||||
|
edit.set_cursor(cursor_position);
|
||||||
|
|
||||||
|
fn replace(
|
||||||
|
new_expr: impl AstNode,
|
||||||
|
then_block: &Block,
|
||||||
|
parent_block: &Block,
|
||||||
|
if_expr: &ast::IfExpr,
|
||||||
|
) -> SyntaxNode {
|
||||||
let then_block_items = IndentLevel::from(1).decrease_indent(then_block.clone());
|
let then_block_items = IndentLevel::from(1).decrease_indent(then_block.clone());
|
||||||
let end_of_then = then_block_items.syntax().last_child_or_token().unwrap();
|
let end_of_then = then_block_items.syntax().last_child_or_token().unwrap();
|
||||||
let end_of_then =
|
let end_of_then =
|
||||||
@ -139,7 +130,7 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Opt
|
|||||||
} else {
|
} else {
|
||||||
end_of_then
|
end_of_then
|
||||||
};
|
};
|
||||||
let mut then_statements = new_match_expr.syntax().children_with_tokens().chain(
|
let mut then_statements = new_expr.syntax().children_with_tokens().chain(
|
||||||
then_block_items
|
then_block_items
|
||||||
.syntax()
|
.syntax()
|
||||||
.children_with_tokens()
|
.children_with_tokens()
|
||||||
@ -155,10 +146,6 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx<impl HirDatabase>) -> Opt
|
|||||||
&mut then_statements,
|
&mut then_statements,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
};
|
|
||||||
edit.target(if_expr.syntax().text_range());
|
|
||||||
edit.replace_ast(parent_block, ast::Block::cast(new_block).unwrap());
|
|
||||||
edit.set_cursor(cursor_position);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user