Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_completion/src/render/macro_.rs')
-rw-r--r--crates/ide_completion/src/render/macro_.rs36
1 files changed, 26 insertions, 10 deletions
diff --git a/crates/ide_completion/src/render/macro_.rs b/crates/ide_completion/src/render/macro_.rs
index 090bb5a715..22fb1f4825 100644
--- a/crates/ide_completion/src/render/macro_.rs
+++ b/crates/ide_completion/src/render/macro_.rs
@@ -1,8 +1,12 @@
//! Renderer for macro invocations.
+use either::Either;
use hir::HasSource;
use ide_db::SymbolKind;
-use syntax::{display::macro_label, SmolStr};
+use syntax::{
+ display::{fn_as_proc_macro_label, macro_label},
+ SmolStr,
+};
use crate::{
context::CallKind,
@@ -35,7 +39,8 @@ impl<'a> MacroRender<'a> {
let name = name.to_smol_str();
let docs = ctx.docs(macro_);
let docs_str = docs.as_ref().map_or("", |s| s.as_str());
- let (bra, ket) = guess_macro_braces(&name, docs_str);
+ let (bra, ket) =
+ if macro_.is_fn_like() { guess_macro_braces(&name, docs_str) } else { ("", "") };
MacroRender { ctx, name, macro_, docs, bra, ket }
}
@@ -47,15 +52,23 @@ impl<'a> MacroRender<'a> {
} else {
Some(self.ctx.source_range())
}?;
- let mut item = CompletionItem::new(SymbolKind::Macro, source_range, self.label());
+ let kind = match self.macro_.kind() {
+ hir::MacroKind::Derive => SymbolKind::Derive,
+ hir::MacroKind::Attr => SymbolKind::Attribute,
+ hir::MacroKind::BuiltIn | hir::MacroKind::Declarative | hir::MacroKind::ProcMacro => {
+ SymbolKind::Macro
+ }
+ };
+ let mut item = CompletionItem::new(kind, source_range, self.label());
item.set_deprecated(self.ctx.is_deprecated(self.macro_)).set_detail(self.detail());
if let Some(import_to_add) = import_to_add {
item.add_import(import_to_add);
}
- let needs_bang = !(self.ctx.completion.in_use_tree()
- || matches!(self.ctx.completion.path_call_kind(), Some(CallKind::Mac)));
+ let needs_bang = self.macro_.is_fn_like()
+ && !(self.ctx.completion.in_use_tree()
+ || matches!(self.ctx.completion.path_call_kind(), Some(CallKind::Mac)));
let has_parens = self.ctx.completion.path_call_kind().is_some();
match self.ctx.snippet_cap() {
@@ -84,10 +97,10 @@ impl<'a> MacroRender<'a> {
}
fn label(&self) -> SmolStr {
- if self.needs_bang() && self.ctx.snippet_cap().is_some() {
- SmolStr::from_iter([&*self.name, "!", self.bra, "…", self.ket])
- } else if self.macro_.kind() == hir::MacroKind::Derive {
+ if !self.macro_.is_fn_like() {
self.name.clone()
+ } else if self.needs_bang() && self.ctx.snippet_cap().is_some() {
+ SmolStr::from_iter([&*self.name, "!", self.bra, "…", self.ket])
} else {
self.banged_name()
}
@@ -98,8 +111,11 @@ impl<'a> MacroRender<'a> {
}
fn detail(&self) -> Option<String> {
- let ast_node = self.macro_.source(self.ctx.db())?.value.left()?;
- Some(macro_label(&ast_node))
+ let detail = match self.macro_.source(self.ctx.db())?.value {
+ Either::Left(node) => macro_label(&node),
+ Either::Right(node) => fn_as_proc_macro_label(&node),
+ };
+ Some(detail)
}
}