@@ -3,7 +3,7 @@ use ide_db::famous_defs::FamousDefs;
33use stdx:: format_to;
44use syntax:: {
55 AstNode ,
6- ast:: { self , HasArgList , HasLoopBody , edit_in_place:: Indent , make } ,
6+ ast:: { self , HasArgList , HasLoopBody , edit_in_place:: Indent , syntax_factory :: SyntaxFactory } ,
77} ;
88
99use crate :: { AssistContext , AssistId , Assists } ;
@@ -57,18 +57,22 @@ pub(crate) fn convert_iter_for_each_to_for(
5757 "Replace this `Iterator::for_each` with a for loop" ,
5858 range,
5959 |builder| {
60+ let make = SyntaxFactory :: with_mappings ( ) ;
6061 let indent =
6162 stmt. as_ref ( ) . map_or_else ( || method. indent_level ( ) , ast:: ExprStmt :: indent_level) ;
6263
6364 let block = match body {
64- ast:: Expr :: BlockExpr ( block) => block,
65- _ => make:: block_expr ( Vec :: new ( ) , Some ( body) ) ,
66- }
67- . clone_for_update ( ) ;
65+ ast:: Expr :: BlockExpr ( block) => block. clone_for_update ( ) ,
66+ _ => make. block_expr ( Vec :: new ( ) , Some ( body) ) ,
67+ } ;
6868 block. reindent_to ( indent) ;
6969
70- let expr_for_loop = make:: expr_for_loop ( param, receiver, block) ;
71- builder. replace ( range, expr_for_loop. to_string ( ) )
70+ let expr_for_loop = make. expr_for_loop ( param, receiver, block) ;
71+
72+ let target_node = stmt. as_ref ( ) . map_or ( method. syntax ( ) , AstNode :: syntax) ;
73+ let mut editor = builder. make_editor ( target_node) ;
74+ editor. replace ( target_node, expr_for_loop. syntax ( ) ) ;
75+ builder. add_file_edits ( ctx. vfs_file_id ( ) , editor) ;
7276 } ,
7377 )
7478}
0 commit comments