Unnamed repository; edit this file 'description' to name the repository.
Don't show assoc. type binding completions when invalid
Jonas Schievink 2022-05-09
parent ab55805 · commit 5a2398d
-rw-r--r--crates/ide-completion/src/completions/type.rs20
-rw-r--r--crates/ide-completion/src/tests/type_pos.rs32
2 files changed, 43 insertions, 9 deletions
diff --git a/crates/ide-completion/src/completions/type.rs b/crates/ide-completion/src/completions/type.rs
index 034a229702..91414c8bf6 100644
--- a/crates/ide-completion/src/completions/type.rs
+++ b/crates/ide-completion/src/completions/type.rs
@@ -165,15 +165,17 @@ pub(crate) fn complete_type_path(acc: &mut Completions, ctx: &CompletionContext)
if let Some(ImmediateLocation::GenericArgList(arg_list)) = &ctx.completion_location {
if let Some(path_seg) = arg_list.syntax().parent().and_then(ast::PathSegment::cast)
{
- if let Some(hir::PathResolution::Def(hir::ModuleDef::Trait(trait_))) =
- ctx.sema.resolve_path(&path_seg.parent_path())
- {
- trait_.items_with_supertraits(ctx.sema.db).into_iter().for_each(|it| {
- if let hir::AssocItem::TypeAlias(alias) = it {
- cov_mark::hit!(complete_assoc_type_in_generics_list);
- acc.add_type_alias_with_eq(ctx, alias)
- }
- });
+ if path_seg.syntax().ancestors().find_map(ast::TypeBound::cast).is_some() {
+ if let Some(hir::PathResolution::Def(hir::ModuleDef::Trait(trait_))) =
+ ctx.sema.resolve_path(&path_seg.parent_path())
+ {
+ trait_.items_with_supertraits(ctx.sema.db).into_iter().for_each(|it| {
+ if let hir::AssocItem::TypeAlias(alias) = it {
+ cov_mark::hit!(complete_assoc_type_in_generics_list);
+ acc.add_type_alias_with_eq(ctx, alias)
+ }
+ });
+ }
}
}
}
diff --git a/crates/ide-completion/src/tests/type_pos.rs b/crates/ide-completion/src/tests/type_pos.rs
index 1e1b3f3efb..1e5e86eef5 100644
--- a/crates/ide-completion/src/tests/type_pos.rs
+++ b/crates/ide-completion/src/tests/type_pos.rs
@@ -394,6 +394,38 @@ fn foo<'lt, T: Trait2<self::$0>, const CONST_PARAM: usize>(_: T) {}
}
#[test]
+fn no_assoc_completion_outside_type_bounds() {
+ check(
+ r#"
+struct S;
+trait Tr<T> {
+ type Ty;
+}
+
+impl Tr<$0
+ "#,
+ expect![[r#"
+ ct CONST
+ en Enum
+ ma makro!(…) macro_rules! makro
+ md module
+ sp Self
+ st Record
+ st S
+ st Tuple
+ st Unit
+ tt Tr
+ tt Trait
+ un Union
+ bt u32
+ kw crate::
+ kw self::
+ kw super::
+ "#]],
+ );
+}
+
+#[test]
fn enum_qualified() {
check(
r#"