Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/reorder_impl_items.rs')
-rw-r--r--crates/ide-assists/src/handlers/reorder_impl_items.rs21
1 files changed, 14 insertions, 7 deletions
diff --git a/crates/ide-assists/src/handlers/reorder_impl_items.rs b/crates/ide-assists/src/handlers/reorder_impl_items.rs
index ada89ce7c4..d7fa882612 100644
--- a/crates/ide-assists/src/handlers/reorder_impl_items.rs
+++ b/crates/ide-assists/src/handlers/reorder_impl_items.rs
@@ -3,7 +3,7 @@ use ide_db::{FxHashMap, RootDatabase};
use itertools::Itertools;
use syntax::{
ast::{self, HasName},
- ted, AstNode,
+ AstNode, SyntaxElement,
};
use crate::{AssistContext, AssistId, AssistKind, Assists};
@@ -46,6 +46,11 @@ pub(crate) fn reorder_impl_items(acc: &mut Assists, ctx: &AssistContext<'_>) ->
let impl_ast = ctx.find_node_at_offset::<ast::Impl>()?;
let items = impl_ast.assoc_item_list()?;
+ let parent_node = match ctx.covering_element() {
+ SyntaxElement::Node(n) => n,
+ SyntaxElement::Token(t) => t.parent()?,
+ };
+
// restrict the range
// if cursor is in assoc_items, abort
let assoc_range = items.syntax().text_range();
@@ -94,12 +99,14 @@ pub(crate) fn reorder_impl_items(acc: &mut Assists, ctx: &AssistContext<'_>) ->
"Sort items by trait definition",
target,
|builder| {
- let assoc_items =
- assoc_items.into_iter().map(|item| builder.make_mut(item)).collect::<Vec<_>>();
- assoc_items
- .into_iter()
- .zip(sorted)
- .for_each(|(old, new)| ted::replace(old.syntax(), new.clone_for_update().syntax()));
+ let mut editor = builder.make_editor(&parent_node);
+
+ assoc_items.into_iter().zip(sorted).for_each(|(old, new)| {
+ // FIXME: remove `clone_for_update` when `SyntaxEditor` handles it for us
+ editor.replace(old.syntax(), new.clone_for_update().syntax())
+ });
+
+ builder.add_file_edits(ctx.file_id(), editor);
},
)
}