Skip to content

Commit 6778d1a

Browse files
committed
feat: do not remove other variants, just push them down in list
1 parent d03c789 commit 6778d1a

File tree

6 files changed

+24
-10
lines changed

6 files changed

+24
-10
lines changed

crates/ide-completion/src/completions.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,6 @@ fn enum_variants_with_paths(
536536
enum_: hir::Enum,
537537
impl_: &Option<ast::Impl>,
538538
cb: impl Fn(&mut Completions, &CompletionContext<'_>, hir::Variant, hir::ModPath),
539-
missing_variants: Option<Vec<Variant>>,
540539
) {
541540
let mut process_variant = |variant: Variant| {
542541
let self_path = hir::ModPath::from_segments(
@@ -547,10 +546,7 @@ fn enum_variants_with_paths(
547546
cb(acc, ctx, variant, self_path);
548547
};
549548

550-
let variants = match missing_variants {
551-
Some(missing_variants) => missing_variants,
552-
None => enum_.variants(ctx.db),
553-
};
549+
let variants = enum_.variants(ctx.db);
554550

555551
if let Some(impl_) = impl_.as_ref().and_then(|impl_| ctx.sema.to_def(impl_)) {
556552
if impl_.self_ty(ctx.db).as_adt() == Some(hir::Adt::Enum(enum_)) {

crates/ide-completion/src/completions/expr.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,6 @@ pub(crate) fn complete_expr_path(
208208
|acc, ctx, variant, path| {
209209
acc.add_qualified_enum_variant(ctx, path_ctx, variant, path)
210210
},
211-
None,
212211
);
213212
}
214213
}

crates/ide-completion/src/completions/pattern.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ pub(crate) fn complete_pattern(
5858
|acc, ctx, variant, path| {
5959
acc.add_qualified_variant_pat(ctx, pattern_ctx, variant, path);
6060
},
61-
Some(pattern_ctx.missing_variants.clone()),
6261
);
6362
}
6463
}

crates/ide-completion/src/render.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,22 @@ pub(crate) struct RenderContext<'a> {
3232
completion: &'a CompletionContext<'a>,
3333
is_private_editable: bool,
3434
import_to_add: Option<LocatedImport>,
35+
// For variants which are missing
36+
// in match completion context
37+
//
38+
// Option -> only applicable for enums
39+
// bool -> is enum variant missing or not?
40+
is_variant_missing: Option<bool>,
3541
}
3642

3743
impl<'a> RenderContext<'a> {
3844
pub(crate) fn new(completion: &'a CompletionContext<'a>) -> RenderContext<'a> {
39-
RenderContext { completion, is_private_editable: false, import_to_add: None }
45+
RenderContext {
46+
completion,
47+
is_private_editable: false,
48+
import_to_add: None,
49+
is_variant_missing: None,
50+
}
4051
}
4152

4253
pub(crate) fn private_editable(mut self, private_editable: bool) -> Self {

crates/ide-completion/src/render/pattern.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub(crate) fn render_struct_pat(
4343
}
4444

4545
pub(crate) fn render_variant_pat(
46-
ctx: RenderContext<'_>,
46+
mut ctx: RenderContext<'_>,
4747
pattern_ctx: &PatternContext,
4848
path_ctx: Option<&PathCompletionCtx>,
4949
variant: hir::Variant,
@@ -56,6 +56,11 @@ pub(crate) fn render_variant_pat(
5656
let (visible_fields, fields_omitted) = visible_fields(ctx.completion, &fields, variant)?;
5757
let enum_ty = variant.parent_enum(ctx.db()).ty(ctx.db());
5858

59+
// Missing in context of match statement completions
60+
if pattern_ctx.missing_variants.contains(&variant) {
61+
ctx.is_variant_missing = Some(true);
62+
}
63+
5964
let (name, escaped_name) = match path {
6065
Some(path) => (path.unescaped().to_string().into(), path.to_string().into()),
6166
None => {
@@ -97,7 +102,9 @@ fn build_completion(
97102
) -> CompletionItem {
98103
let mut relevance = ctx.completion_relevance();
99104

100-
relevance.type_match = super::compute_type_match(ctx.completion, &adt_ty);
105+
if let Some(true) = ctx.is_variant_missing {
106+
relevance.type_match = super::compute_type_match(ctx.completion, &adt_ty);
107+
}
101108

102109
let mut item = CompletionItem::new(CompletionItemKind::Binding, ctx.source_range(), label);
103110
item.set_documentation(ctx.docs(def))

crates/ide-completion/src/tests/record.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ fn foo(baz: Baz) {
6767
ev Err
6868
ev Ok
6969
bn Baz::Bar Baz::Bar$0
70+
bn Baz::Foo Baz::Foo$0
7071
bn Err(…) Err($1)$0
7172
bn Ok(…) Ok($1)$0
7273
kw mut
@@ -93,6 +94,7 @@ fn foo(baz: Baz) {
9394
ev Err
9495
ev Ok
9596
bn Baz::Bar Baz::Bar$0
97+
bn Baz::Foo Baz::Foo$0
9698
bn Err(…) Err($1)$0
9799
bn Ok(…) Ok($1)$0
98100
kw mut

0 commit comments

Comments
 (0)