about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMathew Horner <matt@phylum.io>2024-05-28 23:05:27 -0500
committerMathew Horner <matt@phylum.io>2024-05-28 23:05:27 -0500
commitc07530c580d246441ff1f65de2b775f3d5631058 (patch)
treeb3741f8fa27eb4d0de3415798c467944e5213d79
parentc1b051602ce2f6844fd703cad0146ed5ea8185e6 (diff)
downloadrust-c07530c580d246441ff1f65de2b775f3d5631058.tar.gz
rust-c07530c580d246441ff1f65de2b775f3d5631058.zip
Add preference modifier for workspace-local crates when using auto import.
-rw-r--r--src/tools/rust-analyzer/crates/ide-assists/src/handlers/auto_import.rs47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/auto_import.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/auto_import.rs
index 3bd003a267a..4ae7ff4a33c 100644
--- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/auto_import.rs
+++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/auto_import.rs
@@ -272,8 +272,10 @@ fn module_distance_heuristic(db: &dyn HirDatabase, current: &Module, item: &Modu
     // cost of importing from another crate
     let crate_boundary_cost = if current.krate() == item.krate() {
         0
-    } else if item.krate().is_builtin(db) {
+    } else if item.krate().origin(db).is_local() {
         2
+    } else if item.krate().is_builtin(db) {
+        3
     } else {
         4
     };
@@ -366,6 +368,49 @@ pub struct HashMap;
     }
 
     #[test]
+    fn prefer_workspace() {
+        let before = r"
+//- /main.rs crate:main deps:foo,bar
+HashMap$0::new();
+
+//- /lib.rs crate:foo
+pub mod module {
+    pub struct HashMap;
+}
+
+//- /lib.rs crate:bar library
+pub struct HashMap;
+        ";
+
+        check_auto_import_order(before, &["Import `foo::module::HashMap`", "Import `bar::HashMap`"])
+    }
+
+    #[test]
+    fn prefer_non_local_over_long_path() {
+        let before = r"
+//- /main.rs crate:main deps:foo,bar
+HashMap$0::new();
+
+//- /lib.rs crate:foo
+pub mod deeply {
+    pub mod nested {
+        pub mod module {
+            pub struct HashMap;
+        }
+    }
+}
+
+//- /lib.rs crate:bar library
+pub struct HashMap;
+        ";
+
+        check_auto_import_order(
+            before,
+            &["Import `bar::HashMap`", "Import `foo::deeply::nested::module::HashMap`"],
+        )
+    }
+
+    #[test]
     fn not_applicable_if_scope_inside_macro() {
         check_assist_not_applicable(
             auto_import,