|
1 | 1 | use syntax::{
|
2 |
| - AstNode, |
3 |
| - ast::{self, make}, |
4 |
| - ted, |
| 2 | + AstNode, TextRange, |
| 3 | + algo::find_node_at_range, |
| 4 | + ast::{self, syntax_factory::SyntaxFactory}, |
5 | 5 | };
|
6 | 6 |
|
7 | 7 | use crate::{
|
@@ -66,33 +66,37 @@ pub(crate) fn pull_assignment_up(acc: &mut Assists, ctx: &AssistContext<'_>) ->
|
66 | 66 | return None;
|
67 | 67 | }
|
68 | 68 | }
|
69 |
| - |
| 69 | + let target = tgt.syntax().text_range(); |
70 | 70 | acc.add(
|
71 | 71 | AssistId::refactor_extract("pull_assignment_up"),
|
72 | 72 | "Pull assignment up",
|
73 |
| - tgt.syntax().text_range(), |
| 73 | + target, |
74 | 74 | move |edit| {
|
75 |
| - let assignments: Vec<_> = collector |
76 |
| - .assignments |
77 |
| - .into_iter() |
78 |
| - .map(|(stmt, rhs)| (edit.make_mut(stmt), rhs.clone_for_update())) |
79 |
| - .collect(); |
80 |
| - |
81 |
| - let tgt = edit.make_mut(tgt); |
82 |
| - |
83 |
| - for (stmt, rhs) in assignments { |
| 75 | + let mut editor = edit.make_editor(tgt.syntax()); |
| 76 | + let mut new_target_end = target.end(); |
| 77 | + for (stmt, rhs) in collector.assignments { |
84 | 78 | let mut stmt = stmt.syntax().clone();
|
85 | 79 | if let Some(parent) = stmt.parent() {
|
86 | 80 | if ast::ExprStmt::cast(parent.clone()).is_some() {
|
87 | 81 | stmt = parent.clone();
|
88 | 82 | }
|
89 | 83 | }
|
90 |
| - ted::replace(stmt, rhs.syntax()); |
| 84 | + let diff = stmt.text_range().len() - rhs.syntax().text_range().len(); |
| 85 | + new_target_end -= diff; |
| 86 | + editor.replace(stmt, rhs.syntax()); |
91 | 87 | }
|
92 |
| - let assign_expr = make::expr_assignment(collector.common_lhs, tgt.clone()); |
93 |
| - let assign_stmt = make::expr_stmt(assign_expr); |
94 |
| - |
95 |
| - ted::replace(tgt.syntax(), assign_stmt.syntax().clone_for_update()); |
| 88 | + let new_tgt_root = editor.finish().new_root().clone(); |
| 89 | + let new_target_range = TextRange::new(target.start(), new_target_end); |
| 90 | + let new_tgt = find_node_at_range::<ast::Expr>(&new_tgt_root, new_target_range).unwrap(); |
| 91 | + |
| 92 | + let make = SyntaxFactory::with_mappings(); |
| 93 | + let mut editor = edit.make_editor(tgt.syntax()); |
| 94 | + let assign_expr = make.expr_assignment(collector.common_lhs, new_tgt.clone()); |
| 95 | + let assign_stmt = make.expr_stmt(assign_expr.into()); |
| 96 | + |
| 97 | + editor.replace(tgt.syntax(), assign_stmt.syntax()); |
| 98 | + editor.add_mappings(make.finish_with_mappings()); |
| 99 | + edit.add_file_edits(ctx.vfs_file_id(), editor); |
96 | 100 | },
|
97 | 101 | )
|
98 | 102 | }
|
|
0 commit comments