Simplify type alias rendering, remove constructor structs

This commit is contained in:
Lukas Wirth 2021-12-21 15:37:43 +01:00
parent 97f7865c56
commit 95ae67b0b0

View file

@ -2,10 +2,7 @@
use hir::{AsAssocItem, HasSource}; use hir::{AsAssocItem, HasSource};
use ide_db::SymbolKind; use ide_db::SymbolKind;
use syntax::{ use syntax::{ast::HasName, display::type_label};
ast::{HasName, TypeAlias},
display::type_label,
};
use crate::{item::CompletionItem, render::RenderContext}; use crate::{item::CompletionItem, render::RenderContext};
@ -14,7 +11,7 @@ pub(crate) fn render_type_alias(
type_alias: hir::TypeAlias, type_alias: hir::TypeAlias,
) -> Option<CompletionItem> { ) -> Option<CompletionItem> {
let _p = profile::span("render_type_alias"); let _p = profile::span("render_type_alias");
TypeAliasRender::new(ctx, type_alias)?.render(false) render(ctx, type_alias, false)
} }
pub(crate) fn render_type_alias_with_eq( pub(crate) fn render_type_alias_with_eq(
@ -22,43 +19,33 @@ pub(crate) fn render_type_alias_with_eq(
type_alias: hir::TypeAlias, type_alias: hir::TypeAlias,
) -> Option<CompletionItem> { ) -> Option<CompletionItem> {
let _p = profile::span("render_type_alias_with_eq"); let _p = profile::span("render_type_alias_with_eq");
TypeAliasRender::new(ctx, type_alias)?.render(true) render(ctx, type_alias, true)
} }
#[derive(Debug)] fn render(
struct TypeAliasRender<'a> { ctx: RenderContext<'_>,
ctx: RenderContext<'a>,
type_alias: hir::TypeAlias, type_alias: hir::TypeAlias,
ast_node: TypeAlias, with_eq: bool,
} ) -> Option<CompletionItem> {
let db = ctx.db();
impl<'a> TypeAliasRender<'a> { // FIXME: This parses the file!
fn new(ctx: RenderContext<'a>, type_alias: hir::TypeAlias) -> Option<TypeAliasRender<'a>> { let ast_node = type_alias.source(db)?.value;
let ast_node = type_alias.source(ctx.db())?.value; let name = ast_node.name().map(|name| {
Some(TypeAliasRender { ctx, type_alias, ast_node })
}
fn render(self, with_eq: bool) -> Option<CompletionItem> {
let name = self.ast_node.name().map(|name| {
if with_eq { if with_eq {
format!("{} = ", name.text()) format!("{} = ", name.text())
} else { } else {
name.text().to_string() name.text().to_string()
} }
})?; })?;
let detail = self.detail(); let detail = type_label(&ast_node);
let mut item = let mut item = CompletionItem::new(SymbolKind::TypeAlias, ctx.source_range(), name.clone());
CompletionItem::new(SymbolKind::TypeAlias, self.ctx.source_range(), name.clone()); item.set_documentation(ctx.docs(type_alias))
item.set_documentation(self.ctx.docs(self.type_alias)) .set_deprecated(ctx.is_deprecated(type_alias) || ctx.is_deprecated_assoc_item(type_alias))
.set_deprecated(
self.ctx.is_deprecated(self.type_alias)
|| self.ctx.is_deprecated_assoc_item(self.type_alias),
)
.detail(detail); .detail(detail);
let db = self.ctx.db(); if let Some(actm) = type_alias.as_assoc_item(db) {
if let Some(actm) = self.type_alias.as_assoc_item(db) {
if let Some(trt) = actm.containing_trait_or_trait_impl(db) { if let Some(trt) = actm.containing_trait_or_trait_impl(db) {
item.trait_name(trt.name(db).to_smol_str()); item.trait_name(trt.name(db).to_smol_str());
item.insert_text(name); item.insert_text(name);
@ -66,9 +53,4 @@ impl<'a> TypeAliasRender<'a> {
} }
Some(item.build()) Some(item.build())
}
fn detail(&self) -> String {
type_label(&self.ast_node)
}
} }