]> git.lizzy.rs Git - rust.git/blob - crates/ide_completion/src/render/type_alias.rs
5df21fb36cddea4b842ebeeff18fb2c1d0290924
[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::{ast::HasName, display::type_label};
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     // FIXME: This parses the file!
33     let ast_node = type_alias.source(db)?.value;
34     let name = ast_node.name().map(|name| {
35         if with_eq {
36             format!("{} = ", name.text())
37         } else {
38             name.text().to_string()
39         }
40     })?;
41     let detail = type_label(&ast_node);
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
48     if let Some(actm) = type_alias.as_assoc_item(db) {
49         if let Some(trt) = actm.containing_trait_or_trait_impl(db) {
50             item.trait_name(trt.name(db).to_smol_str());
51             item.insert_text(name);
52         }
53     }
54
55     Some(item.build())
56 }