From 37d0c722ef3d6b22fded312474db8520bd48126f Mon Sep 17 00:00:00 2001 From: hi-rustin Date: Tue, 15 Mar 2022 21:14:02 +0800 Subject: [PATCH 1/6] Complete associated consts in patterns Signed-off-by: hi-rustin --- .../ide_completion/src/completions/pattern.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/crates/ide_completion/src/completions/pattern.rs b/crates/ide_completion/src/completions/pattern.rs index 6c17da07d6..7926db8acf 100644 --- a/crates/ide_completion/src/completions/pattern.rs +++ b/crates/ide_completion/src/completions/pattern.rs @@ -165,12 +165,19 @@ fn pattern_path_completion( ctx.module, None, |item| { - // Note associated consts cannot be referenced in patterns - if let AssocItem::TypeAlias(ta) = item { - // We might iterate candidates of a trait multiple times here, so deduplicate them. - if seen.insert(item) { - acc.add_type_alias(ctx, ta); + match item { + AssocItem::TypeAlias(ta) => { + // We might iterate candidates of a trait multiple times here, so deduplicate them. + if seen.insert(item) { + acc.add_type_alias(ctx, ta); + } } + AssocItem::Const(c) => { + if seen.insert(item) { + acc.add_const(ctx, c); + } + } + _ => {} } None::<()> }, From a9aae250ed8034ab78a9c1b42df62ef9fc0df0e8 Mon Sep 17 00:00:00 2001 From: hi-rustin Date: Tue, 15 Mar 2022 21:54:45 +0800 Subject: [PATCH 2/6] Add completes_associated_const test Signed-off-by: hi-rustin --- crates/ide_completion/src/tests/pattern.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/crates/ide_completion/src/tests/pattern.rs b/crates/ide_completion/src/tests/pattern.rs index 50d5e01979..c1c73aaf61 100644 --- a/crates/ide_completion/src/tests/pattern.rs +++ b/crates/ide_completion/src/tests/pattern.rs @@ -444,3 +444,25 @@ fn foo() { expect![[r#""#]], ); } + +#[test] +fn completes_associated_const() { + check_empty( + r#" +#[derive(PartialEq, Eq)] +struct Ty(u8); + +impl Ty { + const ABC: Self = Self(0); +} + +fn f(t: Ty) { + match t { + Ty::$0 => {} + _ => {} + } +} +"#, + expect![[""]], + ) +} From c6ef4e830ecfeb5bd592d2604d46cc67b77dcdc5 Mon Sep 17 00:00:00 2001 From: hi-rustin Date: Wed, 16 Mar 2022 20:54:01 +0800 Subject: [PATCH 3/6] Fix the wrong path resolution Signed-off-by: hi-rustin --- crates/ide_completion/src/completions/pattern.rs | 7 ++++++- crates/ide_completion/src/tests/pattern.rs | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/ide_completion/src/completions/pattern.rs b/crates/ide_completion/src/completions/pattern.rs index 7926db8acf..4b5849dab5 100644 --- a/crates/ide_completion/src/completions/pattern.rs +++ b/crates/ide_completion/src/completions/pattern.rs @@ -143,10 +143,15 @@ fn pattern_path_completion( .into_iter() .for_each(|variant| acc.add_enum_variant(ctx, variant, None)); } - res @ (hir::PathResolution::TypeParam(_) | hir::PathResolution::SelfType(_)) => { + res @ (hir::PathResolution::TypeParam(_) + | hir::PathResolution::SelfType(_) + | hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Struct(_)))) => { let ty = match res { hir::PathResolution::TypeParam(param) => param.ty(ctx.db), hir::PathResolution::SelfType(impl_def) => impl_def.self_ty(ctx.db), + hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Struct(s))) => { + s.ty(ctx.db) + } _ => return, }; diff --git a/crates/ide_completion/src/tests/pattern.rs b/crates/ide_completion/src/tests/pattern.rs index c1c73aaf61..1dcb0a5531 100644 --- a/crates/ide_completion/src/tests/pattern.rs +++ b/crates/ide_completion/src/tests/pattern.rs @@ -463,6 +463,8 @@ fn f(t: Ty) { } } "#, - expect![[""]], + expect![[r#" + ct ABC const ABC: Self + "#]], ) } From 2bc545d9ef4ddd5f0679f0a6b6c8de7e8d946558 Mon Sep 17 00:00:00 2001 From: hi-rustin Date: Thu, 17 Mar 2022 21:18:52 +0800 Subject: [PATCH 4/6] Match the enum and union Signed-off-by: hi-rustin --- .../ide_completion/src/completions/pattern.rs | 26 +++++----- crates/ide_completion/src/tests/pattern.rs | 49 +++++++++++++++++++ 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/crates/ide_completion/src/completions/pattern.rs b/crates/ide_completion/src/completions/pattern.rs index 4b5849dab5..dac777a69b 100644 --- a/crates/ide_completion/src/completions/pattern.rs +++ b/crates/ide_completion/src/completions/pattern.rs @@ -137,30 +137,30 @@ fn pattern_path_completion( } } } - hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Enum(e))) => { - cov_mark::hit!(enum_plain_qualified_use_tree); - e.variants(ctx.db) - .into_iter() - .for_each(|variant| acc.add_enum_variant(ctx, variant, None)); - } res @ (hir::PathResolution::TypeParam(_) | hir::PathResolution::SelfType(_) - | hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Struct(_)))) => { + | hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Struct(_))) + | hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Enum(_))) + | hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Union(_)))) => { let ty = match res { hir::PathResolution::TypeParam(param) => param.ty(ctx.db), hir::PathResolution::SelfType(impl_def) => impl_def.self_ty(ctx.db), hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Struct(s))) => { s.ty(ctx.db) } + hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Enum(e))) => { + cov_mark::hit!(enum_plain_qualified_use_tree); + e.variants(ctx.db) + .into_iter() + .for_each(|variant| acc.add_enum_variant(ctx, variant, None)); + e.ty(ctx.db) + } + hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Union(u))) => { + u.ty(ctx.db) + } _ => return, }; - if let Some(hir::Adt::Enum(e)) = ty.as_adt() { - e.variants(ctx.db) - .into_iter() - .for_each(|variant| acc.add_enum_variant(ctx, variant, None)); - } - let traits_in_scope = ctx.scope.visible_traits(); let mut seen = FxHashSet::default(); ty.iterate_path_candidates( diff --git a/crates/ide_completion/src/tests/pattern.rs b/crates/ide_completion/src/tests/pattern.rs index 1dcb0a5531..2aef48153b 100644 --- a/crates/ide_completion/src/tests/pattern.rs +++ b/crates/ide_completion/src/tests/pattern.rs @@ -306,6 +306,7 @@ fn func() { ev TupleV(…) TupleV(u32) ev RecordV {…} RecordV { field: u32 } ev UnitV UnitV + ct ASSOC_CONST const ASSOC_CONST: () "#]], ); } @@ -466,5 +467,53 @@ fn f(t: Ty) { expect![[r#" ct ABC const ABC: Self "#]], + ); + + check_empty( + r#" +struct MyEnum; + +impl MyEnum { + pub const A: i32 = 123; + pub const B: i32 = 456; +} + +fn f(e: MyEnum) { + match e { + MyEnum::$0 => {} + _ => {} + } +} +"#, + expect![[r#" + ct A pub const A: i32 + ct B pub const B: i32 + "#]], + ); + + check_empty( + r#" +#[repr(C)] +union U { + i: i32, + f: f32, +} + +impl U { + pub const C: i32 = 123; + pub const D: i32 = 456; +} + +fn f(u: U) { + match u { + U::$0 => {} + _ => {} + } +} +"#, + expect![[r#" + ct C pub const C: i32 + ct D pub const D: i32 + "#]], ) } From bc8665e14d50fdf6decb2fa067562faaf53d96df Mon Sep 17 00:00:00 2001 From: hi-rustin Date: Thu, 17 Mar 2022 22:59:47 +0800 Subject: [PATCH 5/6] Fix typo Signed-off-by: hi-rustin --- crates/ide_completion/src/tests/pattern.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ide_completion/src/tests/pattern.rs b/crates/ide_completion/src/tests/pattern.rs index 2aef48153b..6099f517ae 100644 --- a/crates/ide_completion/src/tests/pattern.rs +++ b/crates/ide_completion/src/tests/pattern.rs @@ -471,7 +471,7 @@ fn f(t: Ty) { check_empty( r#" -struct MyEnum; +enum MyEnum; impl MyEnum { pub const A: i32 = 123; From e7564086f48f1fba23de080901b607eb9b13457f Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Fri, 18 Mar 2022 14:53:44 +0100 Subject: [PATCH 6/6] Update crates/ide_completion/src/tests/pattern.rs --- crates/ide_completion/src/tests/pattern.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ide_completion/src/tests/pattern.rs b/crates/ide_completion/src/tests/pattern.rs index 6099f517ae..b2740d26ce 100644 --- a/crates/ide_completion/src/tests/pattern.rs +++ b/crates/ide_completion/src/tests/pattern.rs @@ -471,7 +471,7 @@ fn f(t: Ty) { check_empty( r#" -enum MyEnum; +enum MyEnum {} impl MyEnum { pub const A: i32 = 123;