]> git.lizzy.rs Git - rust.git/blob - crates/ide_completion/src/render/type_alias.rs
Replace more Name::to_string usages with Name::to_smol_str
[rust.git] / crates / ide_completion / src / render / type_alias.rs
1 //! Renderer for type aliases.
2
3 use hir::{AsAssocItem, HasSource};
4 use ide_db::SymbolKind;
5 use syntax::{
6     ast::{HasName, TypeAlias},
7     display::type_label,
8 };
9
10 use crate::{item::CompletionItem, render::RenderContext};
11
12 pub(crate) fn render_type_alias(
13     ctx: RenderContext<'_>,
14     type_alias: hir::TypeAlias,
15 ) -> Option<CompletionItem> {
16     TypeAliasRender::new(ctx, type_alias)?.render(false)
17 }
18
19 pub(crate) fn render_type_alias_with_eq(
20     ctx: RenderContext<'_>,
21     type_alias: hir::TypeAlias,
22 ) -> Option<CompletionItem> {
23     TypeAliasRender::new(ctx, type_alias)?.render(true)
24 }
25
26 #[derive(Debug)]
27 struct TypeAliasRender<'a> {
28     ctx: RenderContext<'a>,
29     type_alias: hir::TypeAlias,
30     ast_node: TypeAlias,
31 }
32
33 impl<'a> TypeAliasRender<'a> {
34     fn new(ctx: RenderContext<'a>, type_alias: hir::TypeAlias) -> Option<TypeAliasRender<'a>> {
35         let ast_node = type_alias.source(ctx.db())?.value;
36         Some(TypeAliasRender { ctx, type_alias, ast_node })
37     }
38
39     fn render(self, with_eq: bool) -> Option<CompletionItem> {
40         let name = self.ast_node.name().map(|name| {
41             if with_eq {
42                 format!("{} = ", name.text())
43             } else {
44                 name.text().to_string()
45             }
46         })?;
47         let detail = self.detail();
48
49         let mut item =
50             CompletionItem::new(SymbolKind::TypeAlias, self.ctx.source_range(), name.clone());
51         item.set_documentation(self.ctx.docs(self.type_alias))
52             .set_deprecated(
53                 self.ctx.is_deprecated(self.type_alias)
54                     || self.ctx.is_deprecated_assoc_item(self.type_alias),
55             )
56             .detail(detail);
57
58         let db = self.ctx.db();
59         if let Some(actm) = self.type_alias.as_assoc_item(db) {
60             if let Some(trt) = actm.containing_trait_or_trait_impl(db) {
61                 item.trait_name(trt.name(db).to_string());
62                 item.insert_text(name);
63             }
64         }
65
66         Some(item.build())
67     }
68
69     fn detail(&self) -> String {
70         type_label(&self.ast_node)
71     }
72 }