From 7f7a3644b38bb3155e0d75bd9eb5baecaba8db97 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Tue, 21 Dec 2021 16:36:04 +0100 Subject: [PATCH] Fully render type alias completions from hir --- .../src/completions/qualified_path.rs | 10 +++++----- .../ide_completion/src/render/type_alias.rs | 20 ++++++++----------- crates/ide_completion/src/tests/expression.rs | 2 +- crates/ide_completion/src/tests/pattern.rs | 2 +- crates/ide_completion/src/tests/type_pos.rs | 4 ++-- crates/syntax/src/display.rs | 15 -------------- 6 files changed, 17 insertions(+), 36 deletions(-) diff --git a/crates/ide_completion/src/completions/qualified_path.rs b/crates/ide_completion/src/completions/qualified_path.rs index 8628de413b5..88fb3959203 100644 --- a/crates/ide_completion/src/completions/qualified_path.rs +++ b/crates/ide_completion/src/completions/qualified_path.rs @@ -288,7 +288,7 @@ fn foo() { let _ = lib::S::$0 } expect![[r#" fn public_method() fn() ct PUBLIC_CONST pub const PUBLIC_CONST: u32 - ta PublicType pub type PublicType; + ta PublicType pub type PublicType = u32 "#]], ); } @@ -377,8 +377,8 @@ trait Sub: Super { fn foo() { T::$0 } "#, expect![[r#" - ta SubTy (as Sub) type SubTy; - ta Ty (as Super) type Ty; + ta SubTy (as Sub) type SubTy + ta Ty (as Super) type Ty ct C2 (as Sub) const C2: () fn subfunc() (as Sub) fn() me submethod(…) (as Sub) fn(&self) @@ -417,8 +417,8 @@ impl Sub for Wrap { } "#, expect![[r#" - ta SubTy (as Sub) type SubTy; - ta Ty (as Super) type Ty; + ta SubTy (as Sub) type SubTy + ta Ty (as Super) type Ty ct CONST (as Super) const CONST: u8 fn func() (as Super) fn() me method(…) (as Super) fn(&self) diff --git a/crates/ide_completion/src/render/type_alias.rs b/crates/ide_completion/src/render/type_alias.rs index 5df21fb36cd..be1d3212810 100644 --- a/crates/ide_completion/src/render/type_alias.rs +++ b/crates/ide_completion/src/render/type_alias.rs @@ -1,8 +1,7 @@ //! Renderer for type aliases. -use hir::{AsAssocItem, HasSource}; +use hir::{AsAssocItem, HirDisplay}; use ide_db::SymbolKind; -use syntax::{ast::HasName, display::type_label}; use crate::{item::CompletionItem, render::RenderContext}; @@ -29,16 +28,13 @@ fn render( ) -> Option { let db = ctx.db(); - // FIXME: This parses the file! - let ast_node = type_alias.source(db)?.value; - let name = ast_node.name().map(|name| { - if with_eq { - format!("{} = ", name.text()) - } else { - name.text().to_string() - } - })?; - let detail = type_label(&ast_node); + // FIXME: smolstr? + let name = if with_eq { + format!("{} = ", type_alias.name(db)) + } else { + type_alias.name(db).to_string() + }; + let detail = type_alias.display(db).to_string(); let mut item = CompletionItem::new(SymbolKind::TypeAlias, ctx.source_range(), name.clone()); item.set_documentation(ctx.docs(type_alias)) diff --git a/crates/ide_completion/src/tests/expression.rs b/crates/ide_completion/src/tests/expression.rs index eb95bdcda95..56a2cd6e9dc 100644 --- a/crates/ide_completion/src/tests/expression.rs +++ b/crates/ide_completion/src/tests/expression.rs @@ -548,7 +548,7 @@ fn func() { ev UnitV () ct ASSOC_CONST const ASSOC_CONST: () fn assoc_fn() fn() - ta AssocType type AssocType; + ta AssocType type AssocType = () "#]], ); } diff --git a/crates/ide_completion/src/tests/pattern.rs b/crates/ide_completion/src/tests/pattern.rs index 0e2d4088274..c9a31eea849 100644 --- a/crates/ide_completion/src/tests/pattern.rs +++ b/crates/ide_completion/src/tests/pattern.rs @@ -296,7 +296,7 @@ fn func() { ev UnitV () ct ASSOC_CONST const ASSOC_CONST: () fn assoc_fn() fn() - ta AssocType type AssocType; + ta AssocType type AssocType = () "#]], ); } diff --git a/crates/ide_completion/src/tests/type_pos.rs b/crates/ide_completion/src/tests/type_pos.rs index a76f97f3da3..d6c1a787ff9 100644 --- a/crates/ide_completion/src/tests/type_pos.rs +++ b/crates/ide_completion/src/tests/type_pos.rs @@ -148,7 +148,7 @@ fn foo<'lt, T: Trait2<$0>, const CONST_PARAM: usize>(_: T) {} kw self kw super kw crate - ta Foo = (as Trait2) type Foo; + ta Foo = (as Trait2) type Foo tp T cp CONST_PARAM tt Trait @@ -199,7 +199,7 @@ impl Enum { fn func(_: Enum::$0) {} "#, expect![[r#" - ta AssocType type AssocType; + ta AssocType type AssocType = () "#]], ); } diff --git a/crates/syntax/src/display.rs b/crates/syntax/src/display.rs index 10f1c901387..d03e94d0583 100644 --- a/crates/syntax/src/display.rs +++ b/crates/syntax/src/display.rs @@ -50,21 +50,6 @@ pub fn function_declaration(node: &ast::Fn) -> String { buf } -pub fn type_label(node: &ast::TypeAlias) -> String { - let mut s = String::new(); - if let Some(vis) = node.visibility() { - format_to!(s, "{} ", vis); - } - format_to!(s, "type "); - if let Some(name) = node.name() { - format_to!(s, "{}", name); - } else { - format_to!(s, "?"); - } - format_to!(s, ";"); - s -} - pub fn macro_label(node: &ast::Macro) -> String { let name = node.name(); let mut s = String::new();