about summary refs log tree commit diff
path: root/src/tools/rust-analyzer
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-09-11 10:04:56 +0000
committerbors <bors@rust-lang.org>2024-09-11 10:04:56 +0000
commit0233b774993fd39ae3a95d5485b61ef37bf25975 (patch)
treee293f167b94eb7900652013ab0efc7cdd8ea1ec5 /src/tools/rust-analyzer
parent7d8c5ad5e6f6f3252528a3f4e9a1403edd9aaa98 (diff)
parent38514bade22c673cadc244c0f264917104998294 (diff)
downloadrust-0233b774993fd39ae3a95d5485b61ef37bf25975.tar.gz
rust-0233b774993fd39ae3a95d5485b61ef37bf25975.zip
Auto merge of #18050 - rust-lang:davidbarsky/push-uyvtlsvoqrxw, r=Veykril
assist: ensure `replace_qualified_name_with_use` applies to the first path segment

This change helps a bit with the discoverability of `replace_qualified_name_with_use`. Specifically, it ensures that a cursor on the first path segment (e.g., `$0std::fmt::Debug`, where `$0` is the cursor) would result in an import along the lines of `use std::fmt;` and `fmt::Debug;` at the usage sites.
Diffstat (limited to 'src/tools/rust-analyzer')
-rw-r--r--src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
index 65330b34c4a..1101c20f1b7 100644
--- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
+++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
@@ -29,7 +29,7 @@ pub(crate) fn replace_qualified_name_with_use(
     acc: &mut Assists,
     ctx: &AssistContext<'_>,
 ) -> Option<()> {
-    let original_path: ast::Path = ctx.find_node_at_offset()?;
+    let mut original_path: ast::Path = ctx.find_node_at_offset()?;
     // We don't want to mess with use statements
     if original_path.syntax().ancestors().find_map(ast::UseTree::cast).is_some() {
         cov_mark::hit!(not_applicable_in_use);
@@ -37,8 +37,7 @@ pub(crate) fn replace_qualified_name_with_use(
     }
 
     if original_path.qualifier().is_none() {
-        cov_mark::hit!(dont_import_trivial_paths);
-        return None;
+        original_path = original_path.parent_path()?;
     }
 
     // only offer replacement for non assoc items
@@ -237,12 +236,6 @@ fs::Path
     }
 
     #[test]
-    fn dont_import_trivial_paths() {
-        cov_mark::check!(dont_import_trivial_paths);
-        check_assist_not_applicable(replace_qualified_name_with_use, r"impl foo$0 for () {}");
-    }
-
-    #[test]
     fn test_replace_not_applicable_in_use() {
         cov_mark::check!(not_applicable_in_use);
         check_assist_not_applicable(replace_qualified_name_with_use, r"use std::fmt$0;");
@@ -272,6 +265,29 @@ fn main() {
     }
 
     #[test]
+    fn assist_runs_on_first_segment() {
+        check_assist(
+            replace_qualified_name_with_use,
+            r"
+mod std { pub mod fmt { pub trait Debug {} } }
+fn main() {
+    $0std::fmt::Debug;
+    let x: std::fmt::Debug = std::fmt::Debug;
+}
+    ",
+            r"
+use std::fmt;
+
+mod std { pub mod fmt { pub trait Debug {} } }
+fn main() {
+    fmt::Debug;
+    let x: fmt::Debug = fmt::Debug;
+}
+    ",
+        );
+    }
+
+    #[test]
     fn does_not_replace_in_submodules() {
         check_assist(
             replace_qualified_name_with_use,