3 ast::{self, edit::AstNodeEdit, VisibilityOwner},
8 assist_context::{AssistContext, Assists},
12 // Assist: unmerge_use
14 // Extracts single use item from use list.
17 // use std::fmt::{Debug, Display$0};
21 // use std::fmt::{Debug};
22 // use std::fmt::Display;
24 pub(crate) fn unmerge_use(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
25 let tree: ast::UseTree = ctx.find_node_at_offset()?;
27 let tree_list = tree.syntax().parent().and_then(ast::UseTreeList::cast)?;
28 if tree_list.use_trees().count() < 2 {
29 cov_mark::hit!(skip_single_use_item);
33 let use_: ast::Use = tree_list.syntax().ancestors().find_map(ast::Use::cast)?;
34 let path = resolve_full_path(&tree)?;
36 let target = tree.syntax().text_range();
38 AssistId("unmerge_use", AssistKind::RefactorRewrite),
42 let new_use = ast::make::use_(
48 tree.star_token().is_some(),
52 let mut rewriter = SyntaxRewriter::default();
53 rewriter += tree.remove();
54 rewriter.insert_after(use_.syntax(), &ast::make::tokens::single_newline());
55 if let ident_level @ 1..=usize::MAX = use_.indent_level().0 as usize {
56 rewriter.insert_after(
58 &ast::make::tokens::whitespace(&" ".repeat(4 * ident_level)),
61 rewriter.insert_after(use_.syntax(), new_use.syntax());
63 builder.rewrite(rewriter);
68 fn resolve_full_path(tree: &ast::UseTree) -> Option<ast::Path> {
72 .take_while(|n| n.kind() != SyntaxKind::USE_KW)
73 .filter_map(ast::UseTree::cast)
74 .filter_map(|t| t.path());
76 let mut final_path = paths.next()?;
78 final_path = ast::make::path_concat(path, final_path)
85 use crate::tests::{check_assist, check_assist_not_applicable};
90 fn skip_single_use_item() {
91 cov_mark::check!(skip_single_use_item);
92 check_assist_not_applicable(
95 use std::fmt::Debug$0;
98 check_assist_not_applicable(
101 use std::fmt::{Debug$0};
104 check_assist_not_applicable(
107 use std::fmt::Debug as Dbg$0;
113 fn skip_single_glob_import() {
114 check_assist_not_applicable(
123 fn unmerge_use_item() {
127 use std::fmt::{Debug, Display$0};
130 use std::fmt::{Debug};
131 use std::fmt::Display;
138 use std::fmt::{Debug, format$0, Display};
141 use std::fmt::{Debug, Display};
142 use std::fmt::format;
148 fn unmerge_glob_import() {
152 use std::fmt::{*$0, Display};
155 use std::fmt::{Display};
162 fn unmerge_renamed_use_item() {
166 use std::fmt::{Debug, Display as Disp$0};
169 use std::fmt::{Debug};
170 use std::fmt::Display as Disp;
176 fn unmerge_indented_use_item() {
181 use std::fmt::{Debug, Display$0 as Disp, format};
186 use std::fmt::{Debug, format};
187 use std::fmt::Display as Disp;
194 fn unmerge_nested_use_item() {
198 use foo::bar::{baz::{qux$0, foobar}, barbaz};
201 use foo::bar::{baz::{foobar}, barbaz};
202 use foo::bar::baz::qux;
208 use foo::bar::{baz$0::{qux, foobar}, barbaz};
211 use foo::bar::{barbaz};
212 use foo::bar::baz::{qux, foobar};
218 fn unmerge_use_item_with_visibility() {
222 pub use std::fmt::{Debug, Display$0};
225 pub use std::fmt::{Debug};
226 pub use std::fmt::Display;