8768: internal: remove one more usage of SyntaxRewriter r=matklad a=matklad

bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2021-05-08 16:51:09 +00:00 committed by GitHub
commit 18d026a2a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -10,7 +10,6 @@ use ide_db::{
use itertools::Itertools; use itertools::Itertools;
use stdx::format_to; use stdx::format_to;
use syntax::{ use syntax::{
algo::SyntaxRewriter,
ast::{ ast::{
self, self,
edit::{AstNodeEdit, IndentLevel}, edit::{AstNodeEdit, IndentLevel},
@ -1362,7 +1361,8 @@ fn rewrite_body_segment(
syntax: &SyntaxNode, syntax: &SyntaxNode,
) -> SyntaxNode { ) -> SyntaxNode {
let syntax = fix_param_usages(ctx, params, syntax); let syntax = fix_param_usages(ctx, params, syntax);
update_external_control_flow(handler, &syntax) update_external_control_flow(handler, &syntax);
syntax
} }
/// change all usages to account for added `&`/`&mut` for some params /// change all usages to account for added `&`/`&mut` for some params
@ -1415,15 +1415,12 @@ fn fix_param_usages(ctx: &AssistContext, params: &[Param], syntax: &SyntaxNode)
res res
} }
fn update_external_control_flow(handler: &FlowHandler, syntax: &SyntaxNode) -> SyntaxNode { fn update_external_control_flow(handler: &FlowHandler, syntax: &SyntaxNode) {
let mut rewriter = SyntaxRewriter::default();
let mut nested_loop = None; let mut nested_loop = None;
let mut nested_scope = None; let mut nested_scope = None;
for event in syntax.preorder() { for event in syntax.preorder() {
let node = match event { match event {
WalkEvent::Enter(e) => { WalkEvent::Enter(e) => match e.kind() {
match e.kind() {
SyntaxKind::LOOP_EXPR | SyntaxKind::WHILE_EXPR | SyntaxKind::FOR_EXPR => { SyntaxKind::LOOP_EXPR | SyntaxKind::WHILE_EXPR | SyntaxKind::FOR_EXPR => {
if nested_loop.is_none() { if nested_loop.is_none() {
nested_loop = Some(e.clone()); nested_loop = Some(e.clone());
@ -1439,42 +1436,26 @@ fn update_external_control_flow(handler: &FlowHandler, syntax: &SyntaxNode) -> S
} }
} }
_ => {} _ => {}
} },
e
}
WalkEvent::Leave(e) => { WalkEvent::Leave(e) => {
if nested_loop.as_ref() == Some(&e) { if nested_scope.is_none() {
nested_loop = None; if let Some(expr) = ast::Expr::cast(e.clone()) {
}
if nested_scope.as_ref() == Some(&e) {
nested_scope = None;
}
continue;
}
};
if nested_scope.is_some() {
continue;
}
let expr = match ast::Expr::cast(node) {
Some(e) => e,
None => continue,
};
match expr { match expr {
ast::Expr::ReturnExpr(return_expr) if nested_scope.is_none() => { ast::Expr::ReturnExpr(return_expr) if nested_scope.is_none() => {
let expr = return_expr.expr(); let expr = return_expr.expr();
if let Some(replacement) = make_rewritten_flow(handler, expr) { if let Some(replacement) = make_rewritten_flow(handler, expr) {
rewriter.replace_ast(&return_expr.into(), &replacement); ted::replace(return_expr.syntax(), replacement.syntax())
} }
} }
ast::Expr::BreakExpr(break_expr) if nested_loop.is_none() => { ast::Expr::BreakExpr(break_expr) if nested_loop.is_none() => {
let expr = break_expr.expr(); let expr = break_expr.expr();
if let Some(replacement) = make_rewritten_flow(handler, expr) { if let Some(replacement) = make_rewritten_flow(handler, expr) {
rewriter.replace_ast(&break_expr.into(), &replacement); ted::replace(break_expr.syntax(), replacement.syntax())
} }
} }
ast::Expr::ContinueExpr(continue_expr) if nested_loop.is_none() => { ast::Expr::ContinueExpr(continue_expr) if nested_loop.is_none() => {
if let Some(replacement) = make_rewritten_flow(handler, None) { if let Some(replacement) = make_rewritten_flow(handler, None) {
rewriter.replace_ast(&continue_expr.into(), &replacement); ted::replace(continue_expr.syntax(), replacement.syntax())
} }
} }
_ => { _ => {
@ -1482,8 +1463,17 @@ fn update_external_control_flow(handler: &FlowHandler, syntax: &SyntaxNode) -> S
} }
} }
} }
}
rewriter.rewrite(syntax) if nested_loop.as_ref() == Some(&e) {
nested_loop = None;
}
if nested_scope.as_ref() == Some(&e) {
nested_scope = None;
}
}
};
}
} }
fn make_rewritten_flow(handler: &FlowHandler, arg_expr: Option<ast::Expr>) -> Option<ast::Expr> { fn make_rewritten_flow(handler: &FlowHandler, arg_expr: Option<ast::Expr>) -> Option<ast::Expr> {
@ -1502,7 +1492,7 @@ fn make_rewritten_flow(handler: &FlowHandler, arg_expr: Option<ast::Expr>) -> Op
make::expr_call(make::expr_path(make_path_from_text("Err")), args) make::expr_call(make::expr_path(make_path_from_text("Err")), args)
} }
}; };
Some(make::expr_return(Some(value))) Some(make::expr_return(Some(value)).clone_for_update())
} }
#[cfg(test)] #[cfg(test)]