aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_completion/src/render/pattern.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide_completion/src/render/pattern.rs')
-rw-r--r--crates/ide_completion/src/render/pattern.rs54
1 files changed, 27 insertions, 27 deletions
diff --git a/crates/ide_completion/src/render/pattern.rs b/crates/ide_completion/src/render/pattern.rs
index 465dfe00c..b4e80f424 100644
--- a/crates/ide_completion/src/render/pattern.rs
+++ b/crates/ide_completion/src/render/pattern.rs
@@ -6,24 +6,6 @@ use itertools::Itertools;
6 6
7use crate::{item::CompletionKind, render::RenderContext, CompletionItem, CompletionItemKind}; 7use crate::{item::CompletionKind, render::RenderContext, CompletionItem, CompletionItemKind};
8 8
9fn visible_fields(
10 ctx: &RenderContext<'_>,
11 fields: &[hir::Field],
12 item: impl HasAttrs,
13) -> Option<(Vec<hir::Field>, bool)> {
14 let module = ctx.completion.scope.module()?;
15 let n_fields = fields.len();
16 let fields = fields
17 .into_iter()
18 .filter(|field| field.is_visible_from(ctx.db(), module))
19 .copied()
20 .collect::<Vec<_>>();
21
22 let fields_omitted =
23 n_fields - fields.len() > 0 || item.attrs(ctx.db()).by_key("non_exhaustive").exists();
24 Some((fields, fields_omitted))
25}
26
27pub(crate) fn render_struct_pat( 9pub(crate) fn render_struct_pat(
28 ctx: RenderContext<'_>, 10 ctx: RenderContext<'_>,
29 strukt: hir::Struct, 11 strukt: hir::Struct,
@@ -69,19 +51,19 @@ fn build_completion(
69 ctx: RenderContext<'_>, 51 ctx: RenderContext<'_>,
70 name: String, 52 name: String,
71 pat: String, 53 pat: String,
72 item: impl HasAttrs + Copy, 54 def: impl HasAttrs + Copy,
73) -> CompletionItem { 55) -> CompletionItem {
74 let completion = CompletionItem::new(CompletionKind::Snippet, ctx.source_range(), name) 56 let mut item = CompletionItem::new(CompletionKind::Snippet, ctx.source_range(), name);
75 .kind(CompletionItemKind::Binding) 57 item.kind(CompletionItemKind::Binding)
76 .set_documentation(ctx.docs(item)) 58 .set_documentation(ctx.docs(def))
77 .set_deprecated(ctx.is_deprecated(item)) 59 .set_deprecated(ctx.is_deprecated(def))
78 .detail(&pat); 60 .detail(&pat);
79 let completion = if let Some(snippet_cap) = ctx.snippet_cap() { 61 if let Some(snippet_cap) = ctx.snippet_cap() {
80 completion.insert_snippet(snippet_cap, pat) 62 item.insert_snippet(snippet_cap, pat);
81 } else { 63 } else {
82 completion.insert_text(pat) 64 item.insert_text(pat);
83 }; 65 };
84 completion.build() 66 item.build()
85} 67}
86 68
87fn render_pat( 69fn render_pat(
@@ -148,3 +130,21 @@ fn render_tuple_as_pat(fields: &[hir::Field], name: &str, fields_omitted: bool)
148 name = name 130 name = name
149 ) 131 )
150} 132}
133
134fn visible_fields(
135 ctx: &RenderContext<'_>,
136 fields: &[hir::Field],
137 item: impl HasAttrs,
138) -> Option<(Vec<hir::Field>, bool)> {
139 let module = ctx.completion.scope.module()?;
140 let n_fields = fields.len();
141 let fields = fields
142 .into_iter()
143 .filter(|field| field.is_visible_from(ctx.db(), module))
144 .copied()
145 .collect::<Vec<_>>();
146
147 let fields_omitted =
148 n_fields - fields.len() > 0 || item.attrs(ctx.db()).by_key("non_exhaustive").exists();
149 Some((fields, fields_omitted))
150}