|
1 | 1 | use ide_db::helpers::FamousDefs; |
2 | 2 | use syntax::{ |
3 | | - ast::{self, edit::AstNodeEdit, make, ArgListOwner}, |
| 3 | + ast::{self, edit_in_place::Indent, make, ArgListOwner}, |
4 | 4 | AstNode, |
5 | 5 | }; |
6 | 6 |
|
@@ -46,24 +46,25 @@ pub(crate) fn convert_iter_for_each_to_for(acc: &mut Assists, ctx: &AssistContex |
46 | 46 | let body = closure.body()?; |
47 | 47 |
|
48 | 48 | let stmt = method.syntax().parent().and_then(ast::ExprStmt::cast); |
49 | | - let syntax = stmt.as_ref().map_or(method.syntax(), |stmt| stmt.syntax()); |
| 49 | + let range = stmt.as_ref().map_or_else(|| method.syntax(), AstNode::syntax).text_range(); |
50 | 50 |
|
51 | 51 | acc.add( |
52 | 52 | AssistId("convert_iter_for_each_to_for", AssistKind::RefactorRewrite), |
53 | 53 | "Replace this `Iterator::for_each` with a for loop", |
54 | | - syntax.text_range(), |
| 54 | + range, |
55 | 55 | |builder| { |
56 | | - let indent = stmt.as_ref().map_or(method.indent_level(), |stmt| stmt.indent_level()); |
| 56 | + let indent = |
| 57 | + stmt.as_ref().map_or_else(|| method.indent_level(), ast::ExprStmt::indent_level); |
57 | 58 |
|
58 | 59 | let block = match body { |
59 | 60 | ast::Expr::BlockExpr(block) => block, |
60 | 61 | _ => make::block_expr(Vec::new(), Some(body)), |
61 | 62 | } |
62 | | - .reset_indent() |
63 | | - .indent(indent); |
| 63 | + .clone_for_update(); |
| 64 | + block.reset_indent().indent(indent); |
64 | 65 |
|
65 | 66 | let expr_for_loop = make::expr_for_loop(param, receiver, block); |
66 | | - builder.replace(syntax.text_range(), expr_for_loop.syntax().text()) |
| 67 | + builder.replace(range, expr_for_loop.to_string()) |
67 | 68 | }, |
68 | 69 | ) |
69 | 70 | } |
|
0 commit comments