Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-completion/src/completions/type.rs10
-rw-r--r--crates/ide-completion/src/tests/type_pos.rs18
2 files changed, 28 insertions, 0 deletions
diff --git a/crates/ide-completion/src/completions/type.rs b/crates/ide-completion/src/completions/type.rs
index e6a4335c3f..eca17bb7c7 100644
--- a/crates/ide-completion/src/completions/type.rs
+++ b/crates/ide-completion/src/completions/type.rs
@@ -184,6 +184,16 @@ pub(crate) fn complete_type_path(
}
}
}
+ TypeLocation::ImplTrait => {
+ acc.add_nameref_keywords_with_colon(ctx);
+ ctx.process_all_names(&mut |name, def, doc_aliases| {
+ let is_trait = matches!(def, ScopeDef::ModuleDef(hir::ModuleDef::Trait(_)));
+ if is_trait {
+ acc.add_path_resolution(ctx, path_ctx, name, def, doc_aliases);
+ }
+ });
+ return;
+ }
_ => {}
};
diff --git a/crates/ide-completion/src/tests/type_pos.rs b/crates/ide-completion/src/tests/type_pos.rs
index c7161f82ce..656592ebfd 100644
--- a/crates/ide-completion/src/tests/type_pos.rs
+++ b/crates/ide-completion/src/tests/type_pos.rs
@@ -989,3 +989,21 @@ fn foo<'a>() { S::<'static, F$0, _, _>; }
"#]],
);
}
+
+#[test]
+fn complete_traits_on_impl_trait_block() {
+ check(
+ r#"
+trait Foo {}
+
+struct Bar;
+
+impl $0 for Bar { }"#,
+ expect![[r#"
+ tt Foo
+ tt Trait
+ kw crate::
+ kw self::
+ "#]],
+ );
+}