diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index ea0a609612..5da6a03404 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -1116,6 +1116,14 @@ impl BuiltinType { } } +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum MacroKind { + Declarative, + ProcMacro, + Derive, + BuiltIn, +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct MacroDef { pub(crate) id: MacroDefId, @@ -1140,20 +1148,15 @@ impl MacroDef { } } - /// Indicate it is a proc-macro - pub fn is_proc_macro(&self) -> bool { - matches!(self.id.kind, MacroDefKind::ProcMacro(..)) - } - - /// Indicate it is a derive macro - pub fn is_derive_macro(&self) -> bool { - // FIXME: wrong for `ProcMacro` - matches!(self.id.kind, MacroDefKind::ProcMacro(..) | MacroDefKind::BuiltInDerive(..)) - } - - /// Indicate it is a declarative macro - pub fn is_declarative(&self) -> bool { - matches!(self.id.kind, MacroDefKind::Declarative(..)) + pub fn kind(&self) -> MacroKind { + match self.id.kind { + MacroDefKind::Declarative(_) => MacroKind::Declarative, + MacroDefKind::BuiltIn(_, _) => MacroKind::BuiltIn, + MacroDefKind::BuiltInDerive(_, _) => MacroKind::Derive, + MacroDefKind::BuiltInEager(_, _) => MacroKind::BuiltIn, + // FIXME might be a derive + MacroDefKind::ProcMacro(_, _) => MacroKind::ProcMacro, + } } } diff --git a/crates/ide_completion/src/completions/attribute.rs b/crates/ide_completion/src/completions/attribute.rs index e846678b4b..b1505c74b4 100644 --- a/crates/ide_completion/src/completions/attribute.rs +++ b/crates/ide_completion/src/completions/attribute.rs @@ -246,7 +246,8 @@ fn get_derive_names_in_scope(ctx: &CompletionContext) -> FxHashSet { let mut result = FxHashSet::default(); ctx.scope.process_all_names(&mut |name, scope_def| { if let hir::ScopeDef::MacroDef(mac) = scope_def { - if mac.is_derive_macro() { + // FIXME kind() doesn't check whether proc-macro is a derive + if mac.kind() == hir::MacroKind::Derive || mac.kind() == hir::MacroKind::ProcMacro { result.insert(name.to_string()); } } diff --git a/crates/ide_db/src/search.rs b/crates/ide_db/src/search.rs index 5fdcb13cfb..ff958c757c 100644 --- a/crates/ide_db/src/search.rs +++ b/crates/ide_db/src/search.rs @@ -257,7 +257,7 @@ impl Definition { }; if let Definition::Macro(macro_def) = self { - if macro_def.is_declarative() { + if macro_def.kind() == hir::MacroKind::Declarative { return if macro_def.attrs(db).by_key("macro_export").exists() { rev_dep_scope() } else {