Skip to content

Commit 622b516

Browse files
committed
fix: variants rendering in pattern path
1 parent ec78b6b commit 622b516

File tree

9 files changed

+83
-73
lines changed

9 files changed

+83
-73
lines changed

crates/ide-completion/src/completions.rs

+6
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,12 @@ impl Completions {
357357
variant: hir::Variant,
358358
local_name: Option<hir::Name>,
359359
) {
360+
if let PathCompletionCtx { kind: PathKind::Pat { pat_ctx }, .. } = path_ctx {
361+
cov_mark::hit!(enum_variant_pattern_path);
362+
self.add_variant_pat(ctx, pat_ctx, variant, local_name);
363+
return;
364+
}
365+
360366
if let Some(builder) =
361367
render_variant_lit(RenderContext::new(ctx), path_ctx, local_name, variant, None)
362368
{

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

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ pub(crate) fn complete_expr_path(
115115
};
116116

117117
if let Some(hir::Adt::Enum(e)) = ty.as_adt() {
118+
cov_mark::hit!(completes_variant_through_self);
118119
acc.add_enum_variants(ctx, path_ctx, e);
119120
}
120121

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

-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ pub(crate) fn complete_pattern_path(
151151
};
152152

153153
if let Some(hir::Adt::Enum(e)) = ty.as_adt() {
154-
cov_mark::hit!(enum_plain_qualified_use_tree);
155154
acc.add_enum_variants(ctx, path_ctx, e);
156155
}
157156

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

+1-3
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ pub(crate) fn complete_use_path(
7979
}
8080
hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Enum(e))) => {
8181
cov_mark::hit!(enum_plain_qualified_use_tree);
82-
e.variants(ctx.db)
83-
.into_iter()
84-
.for_each(|variant| acc.add_enum_variant(ctx, path_ctx, variant, None));
82+
acc.add_enum_variants(ctx, path_ctx, *e);
8583
}
8684
_ => {}
8785
}

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

+14-21
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ use syntax::SmolStr;
77

88
use crate::{
99
context::{ParamKind, PatternContext},
10-
render::{variant::visible_fields, RenderContext},
10+
render::{
11+
variant::{format_literal_label, visible_fields},
12+
RenderContext,
13+
},
1114
CompletionItem, CompletionItemKind,
1215
};
1316

@@ -29,16 +32,11 @@ pub(crate) fn render_struct_pat(
2932

3033
let name = local_name.unwrap_or_else(|| strukt.name(ctx.db()));
3134
let (name, escaped_name) = (name.to_smol_str(), name.escaped().to_smol_str());
32-
let pat = render_pat(
33-
&ctx,
34-
pattern_ctx,
35-
&escaped_name,
36-
strukt.kind(ctx.db()),
37-
&visible_fields,
38-
fields_omitted,
39-
)?;
35+
let kind = strukt.kind(ctx.db());
36+
let label = format_literal_label(name.as_str(), kind);
37+
let pat = render_pat(&ctx, pattern_ctx, &escaped_name, kind, &visible_fields, fields_omitted)?;
4038

41-
Some(build_completion(ctx, name, pat, strukt))
39+
Some(build_completion(ctx, label, pat, strukt))
4240
}
4341

4442
pub(crate) fn render_variant_pat(
@@ -60,25 +58,20 @@ pub(crate) fn render_variant_pat(
6058
(name.to_smol_str(), name.escaped().to_smol_str())
6159
}
6260
};
63-
let pat = render_pat(
64-
&ctx,
65-
pattern_ctx,
66-
&escaped_name,
67-
variant.kind(ctx.db()),
68-
&visible_fields,
69-
fields_omitted,
70-
)?;
61+
let kind = variant.kind(ctx.db());
62+
let label = format_literal_label(name.as_str(), kind);
63+
let pat = render_pat(&ctx, pattern_ctx, &escaped_name, kind, &visible_fields, fields_omitted)?;
7164

72-
Some(build_completion(ctx, name, pat, variant))
65+
Some(build_completion(ctx, label, pat, variant))
7366
}
7467

7568
fn build_completion(
7669
ctx: RenderContext<'_>,
77-
name: SmolStr,
70+
label: SmolStr,
7871
pat: String,
7972
def: impl HasAttrs + Copy,
8073
) -> CompletionItem {
81-
let mut item = CompletionItem::new(CompletionItemKind::Binding, ctx.source_range(), name);
74+
let mut item = CompletionItem::new(CompletionItemKind::Binding, ctx.source_range(), label);
8275
item.set_documentation(ctx.docs(def))
8376
.set_deprecated(ctx.is_deprecated(def))
8477
.detail(&pat)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ fn foo2($0) {}
139139
"#,
140140
expect![[r#"
141141
st Bar
142-
bn Bar Bar { bar$1 }: Bar$0
143142
bn Bar { bar }: Bar
143+
bn Bar {…} Bar { bar$1 }: Bar$0
144144
kw mut
145145
kw ref
146146
"#]],

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

+55-28
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Completion tests for pattern position.
22
use expect_test::{expect, Expect};
33

4-
use crate::tests::{completion_list, BASE_ITEMS_FIXTURE};
4+
use crate::tests::{check_edit, completion_list, BASE_ITEMS_FIXTURE};
55

66
fn check_empty(ra_fixture: &str, expect: Expect) {
77
let actual = completion_list(ra_fixture);
@@ -127,15 +127,15 @@ fn foo() {
127127
expect![[r#"
128128
ct CONST
129129
en Enum
130-
ma makro!(…) macro_rules! makro
130+
ma makro!(…) macro_rules! makro
131131
md module
132132
st Record
133133
st Tuple
134134
st Unit
135135
ev TupleV
136-
bn Record Record { field$1 }$0
137-
bn Tuple Tuple($1)$0
138-
bn TupleV TupleV($1)$0
136+
bn Record {…} Record { field$1 }$0
137+
bn Tuple(…) Tuple($1)$0
138+
bn TupleV(…) TupleV($1)$0
139139
kw mut
140140
kw ref
141141
"#]],
@@ -162,8 +162,8 @@ fn foo() {
162162
st Tuple
163163
st Unit
164164
ev Variant
165-
bn Record Record { field$1 }$0
166-
bn Tuple Tuple($1)$0
165+
bn Record {…} Record { field$1 }$0
166+
bn Tuple(…) Tuple($1)$0
167167
kw mut
168168
kw ref
169169
"#]],
@@ -178,13 +178,13 @@ fn foo(a$0) {
178178
}
179179
"#,
180180
expect![[r#"
181-
ma makro!(…) macro_rules! makro
181+
ma makro!(…) macro_rules! makro
182182
md module
183183
st Record
184184
st Tuple
185185
st Unit
186-
bn Record Record { field$1 }: Record$0
187-
bn Tuple Tuple($1): Tuple$0
186+
bn Record {…} Record { field$1 }: Record$0
187+
bn Tuple(…) Tuple($1): Tuple$0
188188
kw mut
189189
kw ref
190190
"#]],
@@ -195,13 +195,13 @@ fn foo(a$0: Tuple) {
195195
}
196196
"#,
197197
expect![[r#"
198-
ma makro!(…) macro_rules! makro
198+
ma makro!(…) macro_rules! makro
199199
md module
200200
st Record
201201
st Tuple
202202
st Unit
203-
bn Record Record { field$1 }$0
204-
bn Tuple Tuple($1)$0
203+
bn Record {…} Record { field$1 }$0
204+
bn Tuple(…) Tuple($1)$0
205205
kw mut
206206
kw ref
207207
"#]],
@@ -269,8 +269,8 @@ fn outer() {
269269
st Invisible
270270
st Record
271271
st Tuple
272-
bn Record Record { field$1, .. }$0
273-
bn Tuple Tuple($1, ..)$0
272+
bn Record {…} Record { field$1, .. }$0
273+
bn Tuple(…) Tuple($1, ..)$0
274274
kw mut
275275
kw ref
276276
"#]],
@@ -293,8 +293,8 @@ impl Foo {
293293
expect![[r#"
294294
sp Self
295295
st Foo
296-
bn Foo Foo($1)$0
297-
bn Self Self($1)$0
296+
bn Foo(…) Foo($1)$0
297+
bn Self(…) Self($1)$0
298298
kw mut
299299
kw ref
300300
"#]],
@@ -316,9 +316,8 @@ fn func() {
316316
"#,
317317
expect![[r#"
318318
ct ASSOC_CONST const ASSOC_CONST: ()
319-
ev RecordV {…} RecordV { field: u32 }
320-
ev TupleV(…) TupleV(u32)
321-
ev UnitV UnitV
319+
bn RecordV {…} RecordV { field$1 }$0
320+
bn TupleV(…) TupleV($1)$0
322321
"#]],
323322
);
324323
}
@@ -334,8 +333,8 @@ fn outer(Foo { bar: $0 }: Foo) {}
334333
expect![[r#"
335334
st Bar
336335
st Foo
337-
bn Bar Bar($1)$0
338-
bn Foo Foo { bar$1 }$0
336+
bn Bar(…) Bar($1)$0
337+
bn Foo {…} Foo { bar$1 }$0
339338
kw mut
340339
kw ref
341340
"#]],
@@ -368,8 +367,8 @@ fn foo($0) {}
368367
expect![[r#"
369368
st Bar
370369
st Foo
371-
bn Bar Bar($1): Bar$0
372-
bn Foo Foo { bar$1 }: Foo$0
370+
bn Bar(…) Bar($1): Bar$0
371+
bn Foo {…} Foo { bar$1 }: Foo$0
373372
kw mut
374373
kw ref
375374
"#]],
@@ -389,8 +388,8 @@ fn foo() {
389388
expect![[r#"
390389
st Bar
391390
st Foo
392-
bn Bar Bar($1)$0
393-
bn Foo Foo { bar$1 }$0
391+
bn Bar(…) Bar($1)$0
392+
bn Foo {…} Foo { bar$1 }$0
394393
kw mut
395394
kw ref
396395
"#]],
@@ -443,7 +442,7 @@ fn foo() {
443442
}
444443
"#,
445444
expect![[r#"
446-
ev TupleVariant TupleVariant
445+
bn TupleVariant(…) TupleVariant($1)$0
447446
"#]],
448447
);
449448
check_empty(
@@ -458,11 +457,39 @@ fn foo() {
458457
}
459458
"#,
460459
expect![[r#"
461-
ev RecordVariant RecordVariant
460+
bn RecordVariant {…} RecordVariant { field$1 }$0
462461
"#]],
463462
);
464463
}
465464

465+
#[test]
466+
fn completes_enum_variant_pat() {
467+
cov_mark::check!(enum_variant_pattern_path);
468+
check_edit(
469+
"RecordVariant {…}",
470+
r#"
471+
enum Enum {
472+
RecordVariant { field: u32 }
473+
}
474+
fn foo() {
475+
match (Enum::RecordVariant { field: 0 }) {
476+
Enum::RecordV$0
477+
}
478+
}
479+
"#,
480+
r#"
481+
enum Enum {
482+
RecordVariant { field: u32 }
483+
}
484+
fn foo() {
485+
match (Enum::RecordVariant { field: 0 }) {
486+
Enum::RecordVariant { field$1 }$0
487+
}
488+
}
489+
"#,
490+
);
491+
}
492+
466493
#[test]
467494
fn completes_associated_const() {
468495
check_empty(

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

+1
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ fn foo() {
519519

520520
#[test]
521521
fn completes_variant_through_self() {
522+
cov_mark::check!(completes_variant_through_self);
522523
check(
523524
r#"
524525
enum Foo {

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

+4-19
Original file line numberDiff line numberDiff line change
@@ -165,30 +165,15 @@ fn enum_plain_qualified_use_tree() {
165165
r#"
166166
use Foo::$0
167167
168-
enum Foo { Variant }
169-
impl Foo {
170-
const CONST: () = ()
171-
fn func() {}
172-
}
173-
"#,
174-
expect![[r#"
175-
ev Variant Variant
176-
"#]],
177-
);
178-
}
179-
180-
#[test]
181-
fn enum_no_parens_in_qualified_use_tree() {
182-
cov_mark::check!(enum_plain_qualified_use_tree);
183-
check(
184-
r#"
185-
use Foo::$0
186-
187168
enum Foo {
188169
UnitVariant,
189170
TupleVariant(),
190171
RecordVariant {},
191172
}
173+
impl Foo {
174+
const CONST: () = ()
175+
fn func() {}
176+
}
192177
"#,
193178
expect![[r#"
194179
ev RecordVariant RecordVariant

0 commit comments

Comments
 (0)