aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_completion/src/render/const_.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide_completion/src/render/const_.rs')
-rw-r--r--crates/ide_completion/src/render/const_.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/crates/ide_completion/src/render/const_.rs b/crates/ide_completion/src/render/const_.rs
new file mode 100644
index 000000000..5010b642a
--- /dev/null
+++ b/crates/ide_completion/src/render/const_.rs
@@ -0,0 +1,59 @@
1//! Renderer for `const` fields.
2
3use hir::HasSource;
4use ide_db::SymbolKind;
5use syntax::{
6 ast::{Const, NameOwner},
7 display::const_label,
8};
9
10use crate::{
11 item::{CompletionItem, CompletionKind},
12 render::RenderContext,
13};
14
15pub(crate) fn render_const<'a>(
16 ctx: RenderContext<'a>,
17 const_: hir::Const,
18) -> Option<CompletionItem> {
19 ConstRender::new(ctx, const_)?.render()
20}
21
22#[derive(Debug)]
23struct ConstRender<'a> {
24 ctx: RenderContext<'a>,
25 const_: hir::Const,
26 ast_node: Const,
27}
28
29impl<'a> ConstRender<'a> {
30 fn new(ctx: RenderContext<'a>, const_: hir::Const) -> Option<ConstRender<'a>> {
31 let ast_node = const_.source(ctx.db())?.value;
32 Some(ConstRender { ctx, const_, ast_node })
33 }
34
35 fn render(self) -> Option<CompletionItem> {
36 let name = self.name()?;
37 let detail = self.detail();
38
39 let item = CompletionItem::new(CompletionKind::Reference, self.ctx.source_range(), name)
40 .kind(SymbolKind::Const)
41 .set_documentation(self.ctx.docs(self.const_))
42 .set_deprecated(
43 self.ctx.is_deprecated(self.const_)
44 || self.ctx.is_deprecated_assoc_item(self.const_),
45 )
46 .detail(detail)
47 .build();
48
49 Some(item)
50 }
51
52 fn name(&self) -> Option<String> {
53 self.ast_node.name().map(|name| name.text().to_string())
54 }
55
56 fn detail(&self) -> String {
57 const_label(&self.ast_node)
58 }
59}