diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-12-23 09:48:04 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-12-23 09:48:04 +0000 |
commit | ee06096b0c40f4eba5ecd3c3e80f7951587d8047 (patch) | |
tree | 9977054269fe85f2901b92f795b567eb13221839 /crates/completion/src | |
parent | 85a28751611e564eb4cdde28ca953407f551b696 (diff) | |
parent | 15a52f69d9522442866307254cc712a308688516 (diff) |
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 <[email protected]>
Diffstat (limited to 'crates/completion/src')
-rw-r--r-- | crates/completion/src/completions/qualified_path.rs | 29 | ||||
-rw-r--r-- | crates/completion/src/completions/unqualified_path.rs | 27 |
2 files changed, 55 insertions, 1 deletions
diff --git a/crates/completion/src/completions/qualified_path.rs b/crates/completion/src/completions/qualified_path.rs index 1300f00b2..882c4dcbc 100644 --- a/crates/completion/src/completions/qualified_path.rs +++ b/crates/completion/src/completions/qualified_path.rs | |||
@@ -118,6 +118,12 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon | |||
118 | _ => return, | 118 | _ => return, |
119 | }; | 119 | }; |
120 | 120 | ||
121 | if let Some(Adt::Enum(e)) = ty.as_adt() { | ||
122 | for variant in e.variants(ctx.db) { | ||
123 | acc.add_enum_variant(ctx, variant, None); | ||
124 | } | ||
125 | } | ||
126 | |||
121 | let traits_in_scope = ctx.scope.traits_in_scope(); | 127 | let traits_in_scope = ctx.scope.traits_in_scope(); |
122 | let mut seen = FxHashSet::default(); | 128 | let mut seen = FxHashSet::default(); |
123 | ty.iterate_path_candidates(ctx.db, krate, &traits_in_scope, None, |_ty, item| { | 129 | ty.iterate_path_candidates(ctx.db, krate, &traits_in_scope, None, |_ty, item| { |
@@ -752,4 +758,27 @@ fn main() { | |||
752 | "#]], | 758 | "#]], |
753 | ); | 759 | ); |
754 | } | 760 | } |
761 | |||
762 | #[test] | ||
763 | fn completes_self_enum() { | ||
764 | check( | ||
765 | r#" | ||
766 | enum Foo { | ||
767 | Bar, | ||
768 | Baz, | ||
769 | } | ||
770 | |||
771 | impl Foo { | ||
772 | fn foo(self) { | ||
773 | Self::<|> | ||
774 | } | ||
775 | } | ||
776 | "#, | ||
777 | expect![[r#" | ||
778 | ev Bar () | ||
779 | ev Baz () | ||
780 | me foo(…) fn foo(self) | ||
781 | "#]], | ||
782 | ); | ||
783 | } | ||
755 | } | 784 | } |
diff --git a/crates/completion/src/completions/unqualified_path.rs b/crates/completion/src/completions/unqualified_path.rs index 099ffb4d4..d09849752 100644 --- a/crates/completion/src/completions/unqualified_path.rs +++ b/crates/completion/src/completions/unqualified_path.rs | |||
@@ -1,5 +1,7 @@ | |||
1 | //! Completion of names from the current scope, e.g. locals and imported items. | 1 | //! Completion of names from the current scope, e.g. locals and imported items. |
2 | 2 | ||
3 | use std::iter; | ||
4 | |||
3 | use either::Either; | 5 | use either::Either; |
4 | use hir::{Adt, ModPath, ModuleDef, ScopeDef, Type}; | 6 | use hir::{Adt, ModPath, ModuleDef, ScopeDef, Type}; |
5 | use ide_db::helpers::insert_use::ImportScope; | 7 | use ide_db::helpers::insert_use::ImportScope; |
@@ -50,7 +52,9 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC | |||
50 | } | 52 | } |
51 | 53 | ||
52 | fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &Type) { | 54 | fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &Type) { |
53 | if let Some(Adt::Enum(enum_data)) = ty.as_adt() { | 55 | if let Some(Adt::Enum(enum_data)) = |
56 | iter::successors(Some(ty.clone()), |ty| ty.remove_ref()).last().and_then(|ty| ty.as_adt()) | ||
57 | { | ||
54 | let variants = enum_data.variants(ctx.db); | 58 | let variants = enum_data.variants(ctx.db); |
55 | 59 | ||
56 | let module = if let Some(module) = ctx.scope.module() { | 60 | let module = if let Some(module) = ctx.scope.module() { |
@@ -701,6 +705,7 @@ fn main() { <|> } | |||
701 | "#]], | 705 | "#]], |
702 | ); | 706 | ); |
703 | } | 707 | } |
708 | |||
704 | #[test] | 709 | #[test] |
705 | fn completes_enum_variant_matcharm() { | 710 | fn completes_enum_variant_matcharm() { |
706 | check( | 711 | check( |
@@ -722,6 +727,26 @@ fn main() { | |||
722 | } | 727 | } |
723 | 728 | ||
724 | #[test] | 729 | #[test] |
730 | fn completes_enum_variant_matcharm_ref() { | ||
731 | check( | ||
732 | r#" | ||
733 | enum Foo { Bar, Baz, Quux } | ||
734 | |||
735 | fn main() { | ||
736 | let foo = Foo::Quux; | ||
737 | match &foo { Qu<|> } | ||
738 | } | ||
739 | "#, | ||
740 | expect![[r#" | ||
741 | ev Foo::Bar () | ||
742 | ev Foo::Baz () | ||
743 | ev Foo::Quux () | ||
744 | en Foo | ||
745 | "#]], | ||
746 | ) | ||
747 | } | ||
748 | |||
749 | #[test] | ||
725 | fn completes_enum_variant_iflet() { | 750 | fn completes_enum_variant_iflet() { |
726 | check( | 751 | check( |
727 | r#" | 752 | r#" |