Skip to content

Commit a5874a3

Browse files
committed
Reduce code duplication in pattern completion
1 parent 2f6a249 commit a5874a3

File tree

1 file changed

+29
-34
lines changed

1 file changed

+29
-34
lines changed

crates/completion/src/render/pattern.rs

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use crate::{
88
CompletionItemKind,
99
};
1010

11-
pub(crate) fn render_struct_pat<'a>(
12-
ctx: RenderContext<'a>,
11+
pub(crate) fn render_struct_pat(
12+
ctx: RenderContext<'_>,
1313
strukt: hir::Struct,
1414
local_name: Option<Name>,
1515
) -> Option<CompletionItem> {
@@ -30,24 +30,7 @@ pub(crate) fn render_struct_pat<'a>(
3030
let fields_omitted = n_fields - fields.len() > 0;
3131

3232
let name = local_name.unwrap_or_else(|| strukt.name(ctx.db())).to_string();
33-
let mut pat = match strukt.kind(ctx.db()) {
34-
StructKind::Tuple if ctx.snippet_cap().is_some() => {
35-
render_tuple_as_pat(&fields, &name, fields_omitted)
36-
}
37-
StructKind::Record => {
38-
render_record_as_pat(ctx.db(), ctx.snippet_cap(), &fields, &name, fields_omitted)
39-
}
40-
_ => return None,
41-
};
42-
43-
if ctx.completion.is_param {
44-
pat.push(':');
45-
pat.push(' ');
46-
pat.push_str(&name);
47-
}
48-
if ctx.snippet_cap().is_some() {
49-
pat.push_str("$0");
50-
}
33+
let pat = render_pat(&ctx, &name, strukt.kind(ctx.db()), &fields, fields_omitted)?;
5134

5235
let mut completion = CompletionItem::new(CompletionKind::Snippet, ctx.source_range(), name)
5336
.kind(CompletionItemKind::Binding)
@@ -62,8 +45,8 @@ pub(crate) fn render_struct_pat<'a>(
6245
Some(completion.build())
6346
}
6447

65-
pub(crate) fn render_variant_pat<'a>(
66-
ctx: RenderContext<'a>,
48+
pub(crate) fn render_variant_pat(
49+
ctx: RenderContext<'_>,
6750
variant: hir::Variant,
6851
local_name: Option<Name>,
6952
) -> Option<CompletionItem> {
@@ -80,7 +63,29 @@ pub(crate) fn render_variant_pat<'a>(
8063
let fields_omitted = n_fields - fields.len() > 0;
8164

8265
let name = local_name.unwrap_or_else(|| variant.name(ctx.db())).to_string();
83-
let mut pat = match variant.kind(ctx.db()) {
66+
let pat = render_pat(&ctx, &name, variant.kind(ctx.db()), &fields, fields_omitted)?;
67+
68+
let mut completion = CompletionItem::new(CompletionKind::Snippet, ctx.source_range(), name)
69+
.kind(CompletionItemKind::Binding)
70+
.set_documentation(ctx.docs(variant))
71+
.set_deprecated(ctx.is_deprecated(variant))
72+
.detail(&pat);
73+
if let Some(snippet_cap) = ctx.snippet_cap() {
74+
completion = completion.insert_snippet(snippet_cap, pat);
75+
} else {
76+
completion = completion.insert_text(pat);
77+
}
78+
Some(completion.build())
79+
}
80+
81+
fn render_pat(
82+
ctx: &RenderContext<'_>,
83+
name: &str,
84+
kind: StructKind,
85+
fields: &[hir::Field],
86+
fields_omitted: bool,
87+
) -> Option<String> {
88+
let mut pat = match kind {
8489
StructKind::Tuple if ctx.snippet_cap().is_some() => {
8590
render_tuple_as_pat(&fields, &name, fields_omitted)
8691
}
@@ -98,17 +103,7 @@ pub(crate) fn render_variant_pat<'a>(
98103
if ctx.snippet_cap().is_some() {
99104
pat.push_str("$0");
100105
}
101-
let mut completion = CompletionItem::new(CompletionKind::Snippet, ctx.source_range(), name)
102-
.kind(CompletionItemKind::Binding)
103-
.set_documentation(ctx.docs(variant))
104-
.set_deprecated(ctx.is_deprecated(variant))
105-
.detail(&pat);
106-
if let Some(snippet_cap) = ctx.snippet_cap() {
107-
completion = completion.insert_snippet(snippet_cap, pat);
108-
} else {
109-
completion = completion.insert_text(pat);
110-
}
111-
Some(completion.build())
106+
Some(pat)
112107
}
113108

114109
fn render_record_as_pat(

0 commit comments

Comments
 (0)