ide_completion/render/
type_alias.rs1use hir::{AsAssocItem, HirDisplay};
4use ide_db::SymbolKind;
5use syntax::{SmolStr, ToSmolStr};
6
7use crate::{item::CompletionItem, render::RenderContext};
8
9pub(crate) fn render_type_alias(
10 ctx: RenderContext<'_, '_>,
11 type_alias: hir::TypeAlias,
12) -> Option<CompletionItem> {
13 let _p = tracing::info_span!("render_type_alias").entered();
14 render(ctx, type_alias, false)
15}
16
17pub(crate) fn render_type_alias_with_eq(
18 ctx: RenderContext<'_, '_>,
19 type_alias: hir::TypeAlias,
20) -> Option<CompletionItem> {
21 let _p = tracing::info_span!("render_type_alias_with_eq").entered();
22 render(ctx, type_alias, true)
23}
24
25fn render(
26 ctx: RenderContext<'_, '_>,
27 type_alias: hir::TypeAlias,
28 with_eq: bool,
29) -> Option<CompletionItem> {
30 let db = ctx.db();
31
32 let name = type_alias.name(db);
33 let (name, escaped_name) = if with_eq {
34 (
35 SmolStr::from_iter([&name.as_str().to_smolstr(), " = "]),
36 SmolStr::from_iter([&name.display_no_db(ctx.completion.edition).to_smolstr(), " = "]),
37 )
38 } else {
39 (name.as_str().to_smolstr(), name.display_no_db(ctx.completion.edition).to_smolstr())
40 };
41 let detail = type_alias.display(db, ctx.completion.display_target).to_string();
42
43 let mut item = CompletionItem::new(
44 SymbolKind::TypeAlias,
45 ctx.source_range(),
46 name,
47 ctx.completion.edition,
48 );
49 item.set_documentation(ctx.docs(type_alias))
50 .set_deprecated(ctx.is_deprecated(type_alias, type_alias.as_assoc_item(db)))
51 .detail(detail)
52 .set_relevance(crate::CompletionRelevance {
53 type_match: super::compute_type_match(
54 ctx.completion,
55 &ctx.completion.rebase_ty(&type_alias.ty(db)),
56 ),
57 ..ctx.completion_relevance()
58 });
59
60 if let Some(actm) = type_alias.as_assoc_item(db)
61 && let Some(trt) = actm.container_or_implemented_trait(db)
62 {
63 item.trait_name(trt.name(db).display_no_db(ctx.completion.edition).to_smolstr());
64 }
65 item.insert_text(escaped_name);
66
67 Some(item.build(ctx.db()))
68}