1 //! Renderer for type aliases.
3 use hir::{AsAssocItem, HasSource};
4 use ide_db::SymbolKind;
6 ast::{HasName, TypeAlias},
10 use crate::{item::CompletionItem, render::RenderContext};
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)
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)
27 struct TypeAliasRender<'a> {
28 ctx: RenderContext<'a>,
29 type_alias: hir::TypeAlias,
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 })
39 fn render(self, with_eq: bool) -> Option<CompletionItem> {
40 let name = self.ast_node.name().map(|name| {
42 format!("{} = ", name.text())
44 name.text().to_string()
47 let detail = self.detail();
50 CompletionItem::new(SymbolKind::TypeAlias, self.ctx.source_range(), name.clone());
51 item.set_documentation(self.ctx.docs(self.type_alias))
53 self.ctx.is_deprecated(self.type_alias)
54 || self.ctx.is_deprecated_assoc_item(self.type_alias),
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);
69 fn detail(&self) -> String {
70 type_label(&self.ast_node)