Skip to main content

ide_completion/render/
const_.rs

1//! Renderer for `const` fields.
2
3use hir::{AsAssocItem, HirDisplay};
4use ide_db::SymbolKind;
5use syntax::ToSmolStr;
6
7use crate::{item::CompletionItem, render::RenderContext};
8
9pub(crate) fn render_const(
10    ctx: RenderContext<'_, '_>,
11    const_: hir::Const,
12) -> Option<CompletionItem> {
13    let _p = tracing::info_span!("render_const").entered();
14    render(ctx, const_)
15}
16
17fn render(ctx: RenderContext<'_, '_>, const_: hir::Const) -> Option<CompletionItem> {
18    let db = ctx.db();
19    let name = const_.name(db)?;
20    let (name, escaped_name) =
21        (name.as_str().to_smolstr(), name.display(db, ctx.completion.edition).to_smolstr());
22    let detail = const_.display(db, ctx.completion.display_target).to_string();
23
24    let mut item =
25        CompletionItem::new(SymbolKind::Const, ctx.source_range(), name, ctx.completion.edition);
26    item.set_documentation(ctx.docs(const_))
27        .set_deprecated(ctx.is_deprecated(const_, const_.as_assoc_item(db)))
28        .detail(detail)
29        .const_value(Some(const_), db, ctx.completion.display_target)
30        .set_relevance(ctx.completion_relevance());
31
32    if let Some(actm) = const_.as_assoc_item(db)
33        && let Some(trt) = actm.container_or_implemented_trait(db)
34    {
35        item.trait_name(trt.name(db).display_no_db(ctx.completion.edition).to_smolstr());
36    }
37    item.insert_text(escaped_name);
38
39    Some(item.build(db))
40}