]> git.proxmox.com Git - rustc.git/blob - src/tools/rust-analyzer/crates/ide-completion/src/render/type_alias.rs
New upstream version 1.65.0+dfsg1
[rustc.git] / src / tools / rust-analyzer / crates / ide-completion / src / render / type_alias.rs
1 //! Renderer for type aliases.
2
3 use hir::{AsAssocItem, HirDisplay};
4 use ide_db::SymbolKind;
5 use syntax::SmolStr;
6
7 use crate::{item::CompletionItem, render::RenderContext};
8
9 pub(crate) fn render_type_alias(
10 ctx: RenderContext<'_>,
11 type_alias: hir::TypeAlias,
12 ) -> Option<CompletionItem> {
13 let _p = profile::span("render_type_alias");
14 render(ctx, type_alias, false)
15 }
16
17 pub(crate) fn render_type_alias_with_eq(
18 ctx: RenderContext<'_>,
19 type_alias: hir::TypeAlias,
20 ) -> Option<CompletionItem> {
21 let _p = profile::span("render_type_alias_with_eq");
22 render(ctx, type_alias, true)
23 }
24
25 fn 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.unescaped().to_smol_str(), " = "]),
36 SmolStr::from_iter([&name.to_smol_str(), " = "]),
37 )
38 } else {
39 (name.unescaped().to_smol_str(), name.to_smol_str())
40 };
41 let detail = type_alias.display(db).to_string();
42
43 let mut item = CompletionItem::new(SymbolKind::TypeAlias, ctx.source_range(), name.clone());
44 item.set_documentation(ctx.docs(type_alias))
45 .set_deprecated(ctx.is_deprecated(type_alias) || ctx.is_deprecated_assoc_item(type_alias))
46 .detail(detail)
47 .set_relevance(ctx.completion_relevance());
48
49 if let Some(actm) = type_alias.as_assoc_item(db) {
50 if let Some(trt) = actm.containing_trait_or_trait_impl(db) {
51 item.trait_name(trt.name(db).to_smol_str());
52 }
53 }
54 item.insert_text(escaped_name);
55
56 Some(item.build())
57 }