6960: Show enum variant on Self qualified paths r=matklad a=Veykril

Fixes first part of #6549
Fixes #6550

Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
bors[bot] 2020-12-23 09:48:04 +00:00 committed by GitHub
commit ee06096b0c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 1 deletions

View file

@ -118,6 +118,12 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
_ => return, _ => return,
}; };
if let Some(Adt::Enum(e)) = ty.as_adt() {
for variant in e.variants(ctx.db) {
acc.add_enum_variant(ctx, variant, None);
}
}
let traits_in_scope = ctx.scope.traits_in_scope(); let traits_in_scope = ctx.scope.traits_in_scope();
let mut seen = FxHashSet::default(); let mut seen = FxHashSet::default();
ty.iterate_path_candidates(ctx.db, krate, &traits_in_scope, None, |_ty, item| { ty.iterate_path_candidates(ctx.db, krate, &traits_in_scope, None, |_ty, item| {
@ -752,4 +758,27 @@ fn main() {
"#]], "#]],
); );
} }
#[test]
fn completes_self_enum() {
check(
r#"
enum Foo {
Bar,
Baz,
}
impl Foo {
fn foo(self) {
Self::<|>
}
}
"#,
expect![[r#"
ev Bar ()
ev Baz ()
me foo() fn foo(self)
"#]],
);
}
} }

View file

@ -1,5 +1,7 @@
//! Completion of names from the current scope, e.g. locals and imported items. //! Completion of names from the current scope, e.g. locals and imported items.
use std::iter;
use either::Either; use either::Either;
use hir::{Adt, ModPath, ModuleDef, ScopeDef, Type}; use hir::{Adt, ModPath, ModuleDef, ScopeDef, Type};
use ide_db::helpers::insert_use::ImportScope; use ide_db::helpers::insert_use::ImportScope;
@ -50,7 +52,9 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
} }
fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &Type) { fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &Type) {
if let Some(Adt::Enum(enum_data)) = ty.as_adt() { if let Some(Adt::Enum(enum_data)) =
iter::successors(Some(ty.clone()), |ty| ty.remove_ref()).last().and_then(|ty| ty.as_adt())
{
let variants = enum_data.variants(ctx.db); let variants = enum_data.variants(ctx.db);
let module = if let Some(module) = ctx.scope.module() { let module = if let Some(module) = ctx.scope.module() {
@ -701,6 +705,7 @@ fn main() { <|> }
"#]], "#]],
); );
} }
#[test] #[test]
fn completes_enum_variant_matcharm() { fn completes_enum_variant_matcharm() {
check( check(
@ -721,6 +726,26 @@ fn main() {
) )
} }
#[test]
fn completes_enum_variant_matcharm_ref() {
check(
r#"
enum Foo { Bar, Baz, Quux }
fn main() {
let foo = Foo::Quux;
match &foo { Qu<|> }
}
"#,
expect![[r#"
ev Foo::Bar ()
ev Foo::Baz ()
ev Foo::Quux ()
en Foo
"#]],
)
}
#[test] #[test]
fn completes_enum_variant_iflet() { fn completes_enum_variant_iflet() {
check( check(