mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Create new nodes only when applying changes
This commit is contained in:
parent
a3a722de9f
commit
c303014f39
1 changed files with 31 additions and 16 deletions
|
@ -32,28 +32,33 @@ 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 use_: ast::Use = tree_list.syntax().ancestors().find_map(ast::Use::cast)?;
|
||||||
let path = resolve_full_path(&tree)?;
|
let path = resolve_full_path(&tree)?;
|
||||||
|
|
||||||
let new_use = ast::make::use_(
|
|
||||||
use_.visibility(),
|
|
||||||
ast::make::use_tree(path, None, tree.rename(), tree.star_token().is_some()),
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut rewriter = SyntaxRewriter::default();
|
|
||||||
rewriter += tree.remove();
|
|
||||||
rewriter.insert_after(use_.syntax(), &ast::make::tokens::single_newline());
|
|
||||||
if let ident_level @ 1..=usize::MAX = use_.indent_level().0 as usize {
|
|
||||||
rewriter.insert_after(
|
|
||||||
use_.syntax(),
|
|
||||||
&ast::make::tokens::whitespace(&" ".repeat(4 * ident_level)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
rewriter.insert_after(use_.syntax(), new_use.syntax());
|
|
||||||
|
|
||||||
let target = tree.syntax().text_range();
|
let target = tree.syntax().text_range();
|
||||||
acc.add(
|
acc.add(
|
||||||
AssistId("unmerge_use", AssistKind::RefactorRewrite),
|
AssistId("unmerge_use", AssistKind::RefactorRewrite),
|
||||||
"Unmerge use",
|
"Unmerge use",
|
||||||
target,
|
target,
|
||||||
|builder| {
|
|builder| {
|
||||||
|
let new_use = ast::make::use_(
|
||||||
|
use_.visibility(),
|
||||||
|
ast::make::use_tree(
|
||||||
|
path,
|
||||||
|
tree.use_tree_list(),
|
||||||
|
tree.rename(),
|
||||||
|
tree.star_token().is_some(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut rewriter = SyntaxRewriter::default();
|
||||||
|
rewriter += tree.remove();
|
||||||
|
rewriter.insert_after(use_.syntax(), &ast::make::tokens::single_newline());
|
||||||
|
if let ident_level @ 1..=usize::MAX = use_.indent_level().0 as usize {
|
||||||
|
rewriter.insert_after(
|
||||||
|
use_.syntax(),
|
||||||
|
&ast::make::tokens::whitespace(&" ".repeat(4 * ident_level)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
rewriter.insert_after(use_.syntax(), new_use.syntax());
|
||||||
|
|
||||||
builder.rewrite(rewriter);
|
builder.rewrite(rewriter);
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -193,6 +198,16 @@ use foo::bar::{baz::{qux$0, foobar}, barbaz};
|
||||||
r"
|
r"
|
||||||
use foo::bar::{baz::{foobar}, barbaz};
|
use foo::bar::{baz::{foobar}, barbaz};
|
||||||
use foo::bar::baz::qux;
|
use foo::bar::baz::qux;
|
||||||
|
",
|
||||||
|
);
|
||||||
|
check_assist(
|
||||||
|
unmerge_use,
|
||||||
|
r"
|
||||||
|
use foo::bar::{baz$0::{qux, foobar}, barbaz};
|
||||||
|
",
|
||||||
|
r"
|
||||||
|
use foo::bar::{barbaz};
|
||||||
|
use foo::bar::baz::{qux, foobar};
|
||||||
",
|
",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue