mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 05:15:04 +00:00
Merge #8768
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:
commit
18d026a2a6
1 changed files with 47 additions and 57 deletions
|
@ -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,75 +1415,65 @@ 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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SyntaxKind::FN
|
|
||||||
| SyntaxKind::CONST
|
|
||||||
| SyntaxKind::STATIC
|
|
||||||
| SyntaxKind::IMPL
|
|
||||||
| SyntaxKind::MODULE => {
|
|
||||||
if nested_scope.is_none() {
|
|
||||||
nested_scope = Some(e.clone());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
e
|
SyntaxKind::FN
|
||||||
}
|
| SyntaxKind::CONST
|
||||||
|
| SyntaxKind::STATIC
|
||||||
|
| SyntaxKind::IMPL
|
||||||
|
| SyntaxKind::MODULE => {
|
||||||
|
if nested_scope.is_none() {
|
||||||
|
nested_scope = Some(e.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
WalkEvent::Leave(e) => {
|
WalkEvent::Leave(e) => {
|
||||||
|
if nested_scope.is_none() {
|
||||||
|
if let Some(expr) = ast::Expr::cast(e.clone()) {
|
||||||
|
match expr {
|
||||||
|
ast::Expr::ReturnExpr(return_expr) if nested_scope.is_none() => {
|
||||||
|
let expr = return_expr.expr();
|
||||||
|
if let Some(replacement) = make_rewritten_flow(handler, expr) {
|
||||||
|
ted::replace(return_expr.syntax(), replacement.syntax())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ast::Expr::BreakExpr(break_expr) if nested_loop.is_none() => {
|
||||||
|
let expr = break_expr.expr();
|
||||||
|
if let Some(replacement) = make_rewritten_flow(handler, expr) {
|
||||||
|
ted::replace(break_expr.syntax(), replacement.syntax())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ast::Expr::ContinueExpr(continue_expr) if nested_loop.is_none() => {
|
||||||
|
if let Some(replacement) = make_rewritten_flow(handler, None) {
|
||||||
|
ted::replace(continue_expr.syntax(), replacement.syntax())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if nested_loop.as_ref() == Some(&e) {
|
if nested_loop.as_ref() == Some(&e) {
|
||||||
nested_loop = None;
|
nested_loop = None;
|
||||||
}
|
}
|
||||||
if nested_scope.as_ref() == Some(&e) {
|
if nested_scope.as_ref() == Some(&e) {
|
||||||
nested_scope = None;
|
nested_scope = None;
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if nested_scope.is_some() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
let expr = match ast::Expr::cast(node) {
|
|
||||||
Some(e) => e,
|
|
||||||
None => continue,
|
|
||||||
};
|
|
||||||
match expr {
|
|
||||||
ast::Expr::ReturnExpr(return_expr) if nested_scope.is_none() => {
|
|
||||||
let expr = return_expr.expr();
|
|
||||||
if let Some(replacement) = make_rewritten_flow(handler, expr) {
|
|
||||||
rewriter.replace_ast(&return_expr.into(), &replacement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ast::Expr::BreakExpr(break_expr) if nested_loop.is_none() => {
|
|
||||||
let expr = break_expr.expr();
|
|
||||||
if let Some(replacement) = make_rewritten_flow(handler, expr) {
|
|
||||||
rewriter.replace_ast(&break_expr.into(), &replacement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ast::Expr::ContinueExpr(continue_expr) if nested_loop.is_none() => {
|
|
||||||
if let Some(replacement) = make_rewritten_flow(handler, None) {
|
|
||||||
rewriter.replace_ast(&continue_expr.into(), &replacement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rewriter.rewrite(syntax)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue