aboutsummaryrefslogtreecommitdiff
path: root/crates/completion/src/render/enum_variant.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/completion/src/render/enum_variant.rs')
-rw-r--r--crates/completion/src/render/enum_variant.rs130
1 files changed, 0 insertions, 130 deletions
diff --git a/crates/completion/src/render/enum_variant.rs b/crates/completion/src/render/enum_variant.rs
deleted file mode 100644
index 89fb49773..000000000
--- a/crates/completion/src/render/enum_variant.rs
+++ /dev/null
@@ -1,130 +0,0 @@
1//! Renderer for `enum` variants.
2
3use hir::{HasAttrs, HirDisplay, ModPath, StructKind};
4use itertools::Itertools;
5use test_utils::mark;
6
7use crate::{
8 item::{CompletionItem, CompletionItemKind, CompletionKind, ImportEdit},
9 render::{builder_ext::Params, RenderContext},
10};
11
12pub(crate) fn render_variant<'a>(
13 ctx: RenderContext<'a>,
14 import_to_add: Option<ImportEdit>,
15 local_name: Option<String>,
16 variant: hir::Variant,
17 path: Option<ModPath>,
18) -> CompletionItem {
19 let _p = profile::span("render_enum_variant");
20 EnumRender::new(ctx, local_name, variant, path).render(import_to_add)
21}
22
23#[derive(Debug)]
24struct EnumRender<'a> {
25 ctx: RenderContext<'a>,
26 name: String,
27 variant: hir::Variant,
28 path: Option<ModPath>,
29 qualified_name: String,
30 short_qualified_name: String,
31 variant_kind: StructKind,
32}
33
34impl<'a> EnumRender<'a> {
35 fn new(
36 ctx: RenderContext<'a>,
37 local_name: Option<String>,
38 variant: hir::Variant,
39 path: Option<ModPath>,
40 ) -> EnumRender<'a> {
41 let name = local_name.unwrap_or_else(|| variant.name(ctx.db()).to_string());
42 let variant_kind = variant.kind(ctx.db());
43
44 let (qualified_name, short_qualified_name) = match &path {
45 Some(path) => {
46 let full = path.to_string();
47 let short =
48 path.segments[path.segments.len().saturating_sub(2)..].iter().join("::");
49 (full, short)
50 }
51 None => (name.to_string(), name.to_string()),
52 };
53
54 EnumRender { ctx, name, variant, path, qualified_name, short_qualified_name, variant_kind }
55 }
56
57 fn render(self, import_to_add: Option<ImportEdit>) -> CompletionItem {
58 let mut builder = CompletionItem::new(
59 CompletionKind::Reference,
60 self.ctx.source_range(),
61 self.qualified_name.clone(),
62 )
63 .kind(CompletionItemKind::EnumVariant)
64 .set_documentation(self.variant.docs(self.ctx.db()))
65 .set_deprecated(self.ctx.is_deprecated(self.variant))
66 .add_import(import_to_add)
67 .detail(self.detail());
68
69 if self.variant_kind == StructKind::Tuple {
70 mark::hit!(inserts_parens_for_tuple_enums);
71 let params = Params::Anonymous(self.variant.fields(self.ctx.db()).len());
72 builder =
73 builder.add_call_parens(self.ctx.completion, self.short_qualified_name, params);
74 } else if self.path.is_some() {
75 builder = builder.lookup_by(self.short_qualified_name);
76 }
77
78 builder.build()
79 }
80
81 fn detail(&self) -> String {
82 let detail_types = self
83 .variant
84 .fields(self.ctx.db())
85 .into_iter()
86 .map(|field| (field.name(self.ctx.db()), field.signature_ty(self.ctx.db())));
87
88 match self.variant_kind {
89 StructKind::Tuple | StructKind::Unit => format!(
90 "({})",
91 detail_types.map(|(_, t)| t.display(self.ctx.db()).to_string()).format(", ")
92 ),
93 StructKind::Record => format!(
94 "{{ {} }}",
95 detail_types
96 .map(|(n, t)| format!("{}: {}", n, t.display(self.ctx.db()).to_string()))
97 .format(", ")
98 ),
99 }
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 use test_utils::mark;
106
107 use crate::test_utils::check_edit;
108
109 #[test]
110 fn inserts_parens_for_tuple_enums() {
111 mark::check!(inserts_parens_for_tuple_enums);
112 check_edit(
113 "Some",
114 r#"
115enum Option<T> { Some(T), None }
116use Option::*;
117fn main() -> Option<i32> {
118 Som$0
119}
120"#,
121 r#"
122enum Option<T> { Some(T), None }
123use Option::*;
124fn main() -> Option<i32> {
125 Some($0)
126}
127"#,
128 );
129 }
130}