]> git.lizzy.rs Git - rust.git/blobdiff - crates/ide_assists/src/handlers/replace_qualified_name_with_use.rs
Use mutable syntax trees in `merge_imports`, `split_imports`
[rust.git] / crates / ide_assists / src / handlers / replace_qualified_name_with_use.rs
index 4a30b83b5a3d0849c0ed6ee4744f2ea3327ff610..6b196681cab0936d2e0491803fa111ad75e30df8 100644 (file)
@@ -54,12 +54,23 @@ pub(crate) fn replace_qualified_name_with_use(
         _ => return None,
     };
 
-    let scope = ImportScope::find_insert_use_container_with_macros(path.syntax(), &ctx.sema)?;
-    let path_to_qualifier = ctx.sema.scope(path.syntax()).module()?.find_use_path_prefixed(
-        ctx.sema.db,
-        module,
-        ctx.config.insert_use.prefix_kind,
-    )?;
+    let starts_with_name_ref = !matches!(
+        path.first_segment().and_then(|it| it.kind()),
+        Some(
+            ast::PathSegmentKind::CrateKw
+                | ast::PathSegmentKind::SuperKw
+                | ast::PathSegmentKind::SelfKw
+        )
+    );
+    let path_to_qualifier = starts_with_name_ref
+        .then(|| {
+            ctx.sema.scope(path.syntax()).module().and_then(|m| {
+                m.find_use_path_prefixed(ctx.sema.db, module, ctx.config.insert_use.prefix_kind)
+            })
+        })
+        .flatten();
+
+    let scope = ImportScope::find_insert_use_container(path.syntax(), &ctx.sema)?;
     let target = path.syntax().text_range();
     acc.add(
         AssistId("replace_qualified_name_with_use", AssistKind::RefactorRewrite),
@@ -74,7 +85,7 @@ pub(crate) fn replace_qualified_name_with_use(
                 ImportScope::Block(it) => ImportScope::Block(builder.make_mut(it)),
             };
             // stick the found import in front of the to be replaced path
-            let path = match mod_path_to_ast(&path_to_qualifier).qualifier() {
+            let path = match path_to_qualifier.and_then(|it| mod_path_to_ast(&it).qualifier()) {
                 Some(qualifier) => make::path_concat(qualifier, path),
                 None => path,
             };
@@ -130,10 +141,7 @@ fn path_eq_no_generics(lhs: ast::Path, rhs: ast::Path) -> bool {
                     && lhs
                         .name_ref()
                         .zip(rhs.name_ref())
-                        .map_or(false, |(lhs, rhs)| lhs.text() == rhs.text()) =>
-            {
-                ()
-            }
+                        .map_or(false, |(lhs, rhs)| lhs.text() == rhs.text()) => {}
             _ => return false,
         }
 
@@ -291,7 +299,7 @@ fn main() {
     ",
             r"
 mod std { pub mod fmt { pub trait Display {} } }
-use std::fmt::{self, Display};
+use std::fmt::{Display, self};
 
 fn main() {
     fmt;
@@ -323,7 +331,7 @@ fn replace_reuses_path_qualifier() {
             replace_qualified_name_with_use,
             r"
 pub mod foo {
-    struct Foo;
+    pub struct Foo;
 }
 
 mod bar {
@@ -338,7 +346,7 @@ fn main() {
 use foo::Foo;
 
 pub mod foo {
-    struct Foo;
+    pub struct Foo;
 }
 
 mod bar {