about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-03-22 21:44:06 +0000
committerGitHub <noreply@github.com>2022-03-22 21:44:06 +0000
commitc2ea378920aa82d13ba12dbf04807f4cd7975897 (patch)
tree279398a28c5f595a6d17c1a302b56a2a1e01b382
parent1a92ee5db57abcbe294c83a9669098e3bcdd2f06 (diff)
parent4e4c9ea4ac9827c3e6b099c262418ba172910df3 (diff)
downloadrust-c2ea378920aa82d13ba12dbf04807f4cd7975897.tar.gz
rust-c2ea378920aa82d13ba12dbf04807f4cd7975897.zip
Merge #11795
11795: fix: Correctly suggest auto importing traits from aliases r=Veykril a=unexge

Fixes https://github.com/rust-analyzer/rust-analyzer/issues/11506

Co-authored-by: unexge <unexge@gmail.com>
-rw-r--r--crates/ide_completion/src/tests/flyimport.rs41
-rw-r--r--crates/ide_db/src/imports/import_assets.rs11
2 files changed, 52 insertions, 0 deletions
diff --git a/crates/ide_completion/src/tests/flyimport.rs b/crates/ide_completion/src/tests/flyimport.rs
index 4a0fcf34429..b47a7100065 100644
--- a/crates/ide_completion/src/tests/flyimport.rs
+++ b/crates/ide_completion/src/tests/flyimport.rs
@@ -298,6 +298,47 @@ fn main() {
 }
 
 #[test]
+fn trait_method_from_alias() {
+    let fixture = r#"
+//- /lib.rs crate:dep
+pub mod test_mod {
+    pub trait TestTrait {
+        fn random_method();
+    }
+    pub struct TestStruct {}
+    impl TestTrait for TestStruct {
+        fn random_method() {}
+    }
+    pub type TestAlias = TestStruct;
+}
+
+//- /main.rs crate:main deps:dep
+fn main() {
+    dep::test_mod::TestAlias::ran$0
+}
+"#;
+
+    check(
+        fixture,
+        expect![[r#"
+                fn random_method() (use dep::test_mod::TestTrait) fn()
+            "#]],
+    );
+
+    check_edit(
+        "random_method",
+        fixture,
+        r#"
+use dep::test_mod::TestTrait;
+
+fn main() {
+    dep::test_mod::TestAlias::random_method()$0
+}
+"#,
+    );
+}
+
+#[test]
 fn no_trait_type_fuzzy_completion() {
     check(
         r#"
diff --git a/crates/ide_db/src/imports/import_assets.rs b/crates/ide_db/src/imports/import_assets.rs
index 3963d4d79a8..d6246c7ad64 100644
--- a/crates/ide_db/src/imports/import_assets.rs
+++ b/crates/ide_db/src/imports/import_assets.rs
@@ -639,6 +639,17 @@ fn path_import_candidate(
                     assoc_item_name: name,
                 })
             }
+            Some(PathResolution::Def(ModuleDef::TypeAlias(alias))) => {
+                let ty = alias.ty(sema.db);
+                if ty.as_adt().is_some() {
+                    ImportCandidate::TraitAssocItem(TraitImportCandidate {
+                        receiver_ty: ty,
+                        assoc_item_name: name,
+                    })
+                } else {
+                    return None;
+                }
+            }
             Some(_) => return None,
         },
         None => ImportCandidate::Path(PathImportCandidate { qualifier: None, name }),