diff options
Diffstat (limited to 'crates/ra_ide/src/completion/complete_unqualified_path.rs')
-rw-r--r-- | crates/ra_ide/src/completion/complete_unqualified_path.rs | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/crates/ra_ide/src/completion/complete_unqualified_path.rs b/crates/ra_ide/src/completion/complete_unqualified_path.rs index 56cd086c6..f559f2b97 100644 --- a/crates/ra_ide/src/completion/complete_unqualified_path.rs +++ b/crates/ra_ide/src/completion/complete_unqualified_path.rs | |||
@@ -4,7 +4,7 @@ use hir::ScopeDef; | |||
4 | use test_utils::tested_by; | 4 | use test_utils::tested_by; |
5 | 5 | ||
6 | use crate::completion::{CompletionContext, Completions}; | 6 | use crate::completion::{CompletionContext, Completions}; |
7 | use hir::{Adt, ModuleDef}; | 7 | use hir::{Adt, ModuleDef, Type}; |
8 | use ra_syntax::AstNode; | 8 | use ra_syntax::AstNode; |
9 | 9 | ||
10 | pub(super) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) { | 10 | pub(super) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) { |
@@ -15,7 +15,9 @@ pub(super) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC | |||
15 | return; | 15 | return; |
16 | } | 16 | } |
17 | 17 | ||
18 | complete_enum_variants(acc, ctx); | 18 | if let Some(ty) = &ctx.expected_type { |
19 | complete_enum_variants(acc, ctx, ty); | ||
20 | } | ||
19 | 21 | ||
20 | if ctx.is_pat_binding_or_const { | 22 | if ctx.is_pat_binding_or_const { |
21 | return; | 23 | return; |
@@ -34,26 +36,24 @@ pub(super) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC | |||
34 | }); | 36 | }); |
35 | } | 37 | } |
36 | 38 | ||
37 | fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext) { | 39 | fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &Type) { |
38 | if let Some(ty) = ctx.expected_type_of(&ctx.token.parent()) { | 40 | if let Some(Adt::Enum(enum_data)) = ty.as_adt() { |
39 | if let Some(Adt::Enum(enum_data)) = ty.as_adt() { | 41 | let variants = enum_data.variants(ctx.db); |
40 | let variants = enum_data.variants(ctx.db); | 42 | |
41 | 43 | let module = if let Some(module) = ctx.scope().module() { | |
42 | let module = if let Some(module) = ctx.scope().module() { | 44 | // Compute path from the completion site if available. |
43 | // Compute path from the completion site if available. | 45 | module |
44 | module | 46 | } else { |
45 | } else { | 47 | // Otherwise fall back to the enum's definition site. |
46 | // Otherwise fall back to the enum's definition site. | 48 | enum_data.module(ctx.db) |
47 | enum_data.module(ctx.db) | 49 | }; |
48 | }; | 50 | |
49 | 51 | for variant in variants { | |
50 | for variant in variants { | 52 | if let Some(path) = module.find_use_path(ctx.db, ModuleDef::from(variant)) { |
51 | if let Some(path) = module.find_use_path(ctx.db, ModuleDef::from(variant)) { | 53 | // Variants with trivial paths are already added by the existing completion logic, |
52 | // Variants with trivial paths are already added by the existing completion logic, | 54 | // so we should avoid adding these twice |
53 | // so we should avoid adding these twice | 55 | if path.segments.len() > 1 { |
54 | if path.segments.len() > 1 { | 56 | acc.add_enum_variant(ctx, variant, Some(path.to_string())); |
55 | acc.add_enum_variant(ctx, variant, Some(path.to_string())); | ||
56 | } | ||
57 | } | 57 | } |
58 | } | 58 | } |
59 | } | 59 | } |