mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 22:01:37 +00:00
Merge #6960
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:
commit
ee06096b0c
2 changed files with 55 additions and 1 deletions
|
@ -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)
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue