@@ -10,7 +10,6 @@ use ide_db::{
1010use itertools:: Itertools ;
1111use stdx:: format_to;
1212use syntax:: {
13- algo:: SyntaxRewriter ,
1413 ast:: {
1514 self ,
1615 edit:: { AstNodeEdit , IndentLevel } ,
@@ -1362,7 +1361,8 @@ fn rewrite_body_segment(
13621361 syntax : & SyntaxNode ,
13631362) -> SyntaxNode {
13641363 let syntax = fix_param_usages ( ctx, params, syntax) ;
1365- update_external_control_flow ( handler, & syntax)
1364+ update_external_control_flow ( handler, & syntax) ;
1365+ syntax
13661366}
13671367
13681368/// 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)
14151415 res
14161416}
14171417
1418- fn update_external_control_flow ( handler : & FlowHandler , syntax : & SyntaxNode ) -> SyntaxNode {
1419- let mut rewriter = SyntaxRewriter :: default ( ) ;
1420-
1418+ fn update_external_control_flow ( handler : & FlowHandler , syntax : & SyntaxNode ) {
14211419 let mut nested_loop = None ;
14221420 let mut nested_scope = None ;
14231421 for event in syntax. preorder ( ) {
1424- let node = match event {
1425- WalkEvent :: Enter ( e) => {
1426- match e. kind ( ) {
1427- SyntaxKind :: LOOP_EXPR | SyntaxKind :: WHILE_EXPR | SyntaxKind :: FOR_EXPR => {
1428- if nested_loop. is_none ( ) {
1429- nested_loop = Some ( e. clone ( ) ) ;
1430- }
1422+ match event {
1423+ WalkEvent :: Enter ( e) => match e. kind ( ) {
1424+ SyntaxKind :: LOOP_EXPR | SyntaxKind :: WHILE_EXPR | SyntaxKind :: FOR_EXPR => {
1425+ if nested_loop. is_none ( ) {
1426+ nested_loop = Some ( e. clone ( ) ) ;
14311427 }
1432- SyntaxKind :: FN
1433- | SyntaxKind :: CONST
1434- | SyntaxKind :: STATIC
1435- | SyntaxKind :: IMPL
1436- | SyntaxKind :: MODULE => {
1437- if nested_scope . is_none ( ) {
1438- nested_scope = Some ( e . clone ( ) ) ;
1439- }
1428+ }
1429+ SyntaxKind :: FN
1430+ | SyntaxKind :: CONST
1431+ | SyntaxKind :: STATIC
1432+ | SyntaxKind :: IMPL
1433+ | SyntaxKind :: MODULE => {
1434+ if nested_scope. is_none ( ) {
1435+ nested_scope = Some ( e . clone ( ) ) ;
14401436 }
1441- _ => { }
14421437 }
1443- e
1444- }
1438+ _ => { }
1439+ } ,
14451440 WalkEvent :: Leave ( e) => {
1441+ if nested_scope. is_none ( ) {
1442+ if let Some ( expr) = ast:: Expr :: cast ( e. clone ( ) ) {
1443+ match expr {
1444+ ast:: Expr :: ReturnExpr ( return_expr) if nested_scope. is_none ( ) => {
1445+ let expr = return_expr. expr ( ) ;
1446+ if let Some ( replacement) = make_rewritten_flow ( handler, expr) {
1447+ ted:: replace ( return_expr. syntax ( ) , replacement. syntax ( ) )
1448+ }
1449+ }
1450+ ast:: Expr :: BreakExpr ( break_expr) if nested_loop. is_none ( ) => {
1451+ let expr = break_expr. expr ( ) ;
1452+ if let Some ( replacement) = make_rewritten_flow ( handler, expr) {
1453+ ted:: replace ( break_expr. syntax ( ) , replacement. syntax ( ) )
1454+ }
1455+ }
1456+ ast:: Expr :: ContinueExpr ( continue_expr) if nested_loop. is_none ( ) => {
1457+ if let Some ( replacement) = make_rewritten_flow ( handler, None ) {
1458+ ted:: replace ( continue_expr. syntax ( ) , replacement. syntax ( ) )
1459+ }
1460+ }
1461+ _ => {
1462+ // do nothing
1463+ }
1464+ }
1465+ }
1466+ }
1467+
14461468 if nested_loop. as_ref ( ) == Some ( & e) {
14471469 nested_loop = None ;
14481470 }
14491471 if nested_scope. as_ref ( ) == Some ( & e) {
14501472 nested_scope = None ;
14511473 }
1452- continue ;
14531474 }
14541475 } ;
1455- if nested_scope. is_some ( ) {
1456- continue ;
1457- }
1458- let expr = match ast:: Expr :: cast ( node) {
1459- Some ( e) => e,
1460- None => continue ,
1461- } ;
1462- match expr {
1463- ast:: Expr :: ReturnExpr ( return_expr) if nested_scope. is_none ( ) => {
1464- let expr = return_expr. expr ( ) ;
1465- if let Some ( replacement) = make_rewritten_flow ( handler, expr) {
1466- rewriter. replace_ast ( & return_expr. into ( ) , & replacement) ;
1467- }
1468- }
1469- ast:: Expr :: BreakExpr ( break_expr) if nested_loop. is_none ( ) => {
1470- let expr = break_expr. expr ( ) ;
1471- if let Some ( replacement) = make_rewritten_flow ( handler, expr) {
1472- rewriter. replace_ast ( & break_expr. into ( ) , & replacement) ;
1473- }
1474- }
1475- ast:: Expr :: ContinueExpr ( continue_expr) if nested_loop. is_none ( ) => {
1476- if let Some ( replacement) = make_rewritten_flow ( handler, None ) {
1477- rewriter. replace_ast ( & continue_expr. into ( ) , & replacement) ;
1478- }
1479- }
1480- _ => {
1481- // do nothing
1482- }
1483- }
14841476 }
1485-
1486- rewriter. rewrite ( syntax)
14871477}
14881478
14891479fn 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
15021492 make:: expr_call ( make:: expr_path ( make_path_from_text ( "Err" ) ) , args)
15031493 }
15041494 } ;
1505- Some ( make:: expr_return ( Some ( value) ) )
1495+ Some ( make:: expr_return ( Some ( value) ) . clone_for_update ( ) )
15061496}
15071497
15081498#[ cfg( test) ]
0 commit comments