diff --git a/crates/ide-assists/src/handlers/unmerge_use.rs b/crates/ide-assists/src/handlers/unmerge_use.rs index 52df30d9623f..8720edf49fe3 100644 --- a/crates/ide-assists/src/handlers/unmerge_use.rs +++ b/crates/ide-assists/src/handlers/unmerge_use.rs @@ -1,6 +1,6 @@ use syntax::{ - ast::{self, edit_in_place::Removable, make, HasVisibility}, - ted::{self, Position}, + ast::{self, edit_in_place::Removable, make, HasVisibility, syntax_factory::SyntaxFactory}, syntax_editor::SyntaxEditor, + syntax_editor::Position, AstNode, SyntaxKind, }; @@ -22,7 +22,7 @@ use crate::{ // use std::fmt::Display; // ``` pub(crate) fn unmerge_use(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> { - let tree: ast::UseTree = ctx.find_node_at_offset::()?.clone_for_update(); + let tree: ast::UseTree = ctx.find_node_at_offset::()?; let tree_list = tree.syntax().parent().and_then(ast::UseTreeList::cast)?; if tree_list.use_trees().count() < 2 { @@ -33,7 +33,6 @@ pub(crate) fn unmerge_use(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option< let use_: ast::Use = tree_list.syntax().ancestors().find_map(ast::Use::cast)?; let path = resolve_full_path(&tree)?; - let old_parent_range = use_.syntax().parent()?.text_range(); let new_parent = use_.syntax().parent()?; // If possible, explain what is going to be done. @@ -44,16 +43,23 @@ pub(crate) fn unmerge_use(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option< let target = tree.syntax().text_range(); acc.add(AssistId("unmerge_use", AssistKind::RefactorRewrite), label, target, |builder| { - let new_use = make::use_( + + let make = SyntaxFactory::new(); + + let mut editor = builder.make_editor(&new_parent); + + let new_use = make.use_( use_.visibility(), - make::use_tree(path, tree.use_tree_list(), tree.rename(), tree.star_token().is_some()), - ) - .clone_for_update(); + make.use_tree(path, tree.use_tree_list(), tree.rename(), tree.star_token().is_some()), + ); + + editor.delete(tree.syntax()); + editor.insert(Position::after(use_.syntax()), new_use.syntax()); - tree.remove(); - ted::insert(Position::after(use_.syntax()), new_use.syntax()); + // editor.replace(use_.syntax().parent().unwrap(), new_parent); - builder.replace(old_parent_range, new_parent.to_string()); + editor.add_mappings(make.finish_with_mappings()); + builder.add_file_edits(ctx.file_id(), editor); }) } diff --git a/crates/syntax/src/ast/syntax_factory/constructors.rs b/crates/syntax/src/ast/syntax_factory/constructors.rs index 9f88add0f787..af3180257f12 100644 --- a/crates/syntax/src/ast/syntax_factory/constructors.rs +++ b/crates/syntax/src/ast/syntax_factory/constructors.rs @@ -2,7 +2,7 @@ use itertools::Itertools; use crate::{ - ast::{self, make, HasName}, + ast::{self, make, HasName, HasVisibility, Use, UseTree}, syntax_editor::SyntaxMappingBuilder, AstNode, }; @@ -107,4 +107,12 @@ impl SyntaxFactory { ast } + + pub fn use_(&self, visibility: Option, use_tree: ast::UseTree) -> ast::Use { + make::use_(visibility, use_tree).clone_for_update() + } + + pub fn use_tree(&self, path: ast::Path, use_tree_list: Option, alias: Option, add_star: bool) -> ast::UseTree { + make::use_tree(path, use_tree_list, alias, add_star).clone_for_update() + } }