diff options
| author | bors <bors@rust-lang.org> | 2022-05-09 16:12:47 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-05-09 16:12:47 +0000 |
| commit | ad6df5b12e61cb7779bfc92c08f1ff0ee37c4f2d (patch) | |
| tree | c83ea7b413c5a55285b0e40d5fc0e79320e0c2e6 | |
| parent | ab558053f5459be7977ce0a6ae479218d4b76841 (diff) | |
| parent | 5a2398d77537573da32e4ec3b210081e2aea07a3 (diff) | |
| download | rust-ad6df5b12e61cb7779bfc92c08f1ff0ee37c4f2d.tar.gz rust-ad6df5b12e61cb7779bfc92c08f1ff0ee37c4f2d.zip | |
Auto merge of #12199 - jonas-schievink:no-invalid-assoc-ty-completions, r=jonas-schievink
fix: Don't show assoc. type binding completions when invalid Fixes https://github.com/rust-lang/rust-analyzer/issues/12165
| -rw-r--r-- | crates/ide-completion/src/completions/type.rs | 20 | ||||
| -rw-r--r-- | crates/ide-completion/src/tests/type_pos.rs | 32 |
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 034a229702b..91414c8bf6a 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 1e1b3f3efb9..1e5e86eef59 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#" |
