diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs index 64ccd11eec..23cb0c839f 100644 --- a/crates/base_db/src/input.rs +++ b/crates/base_db/src/input.rs @@ -147,7 +147,7 @@ impl CrateDisplayName { #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct ProcMacroId(pub u32); -#[derive(Copy, Clone, Eq, PartialEq, Debug)] +#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash)] pub enum ProcMacroKind { CustomDerive, FuncLike, diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 01b2de515a..975ae48690 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -1282,10 +1282,16 @@ impl BuiltinType { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum MacroKind { + /// `macro_rules!` or Macros 2.0 macro. Declarative, - ProcMacro, + /// A built-in or custom derive. Derive, + /// A built-in function-like macro. BuiltIn, + /// A procedural attribute macro. + Attr, + /// A function-like procedural macro. + ProcMacro, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -1315,11 +1321,13 @@ impl MacroDef { pub fn kind(&self) -> MacroKind { match self.id.kind { MacroDefKind::Declarative(_) => MacroKind::Declarative, - MacroDefKind::BuiltIn(_, _) => MacroKind::BuiltIn, + MacroDefKind::BuiltIn(_, _) | MacroDefKind::BuiltInEager(_, _) => MacroKind::BuiltIn, MacroDefKind::BuiltInDerive(_, _) => MacroKind::Derive, - MacroDefKind::BuiltInEager(_, _) => MacroKind::BuiltIn, - // FIXME might be a derive - MacroDefKind::ProcMacro(_, _) => MacroKind::ProcMacro, + MacroDefKind::ProcMacro(_, base_db::ProcMacroKind::CustomDerive, _) => { + MacroKind::Derive + } + MacroDefKind::ProcMacro(_, base_db::ProcMacroKind::Attr, _) => MacroKind::Attr, + MacroDefKind::ProcMacro(_, base_db::ProcMacroKind::FuncLike, _) => MacroKind::ProcMacro, } } } diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index 4296c63045..d9d6c91a85 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs @@ -477,16 +477,21 @@ impl DefCollector<'_> { /// going out of sync with what the build system sees (since we resolve using VFS state, but /// Cargo builds only on-disk files). We could and probably should add diagnostics for that. fn export_proc_macro(&mut self, def: ProcMacroDef, ast_id: AstId) { + let kind = def.kind.to_basedb_kind(); self.exports_proc_macros = true; let macro_def = match self.proc_macros.iter().find(|(n, _)| n == &def.name) { Some((_, expander)) => MacroDefId { krate: self.def_map.krate, - kind: MacroDefKind::ProcMacro(*expander, ast_id), + kind: MacroDefKind::ProcMacro(*expander, kind, ast_id), local_inner: false, }, None => MacroDefId { krate: self.def_map.krate, - kind: MacroDefKind::ProcMacro(ProcMacroExpander::dummy(self.def_map.krate), ast_id), + kind: MacroDefKind::ProcMacro( + ProcMacroExpander::dummy(self.def_map.krate), + kind, + ast_id, + ), local_inner: false, }, }; diff --git a/crates/hir_def/src/nameres/proc_macro.rs b/crates/hir_def/src/nameres/proc_macro.rs index 156598f195..3f095d623f 100644 --- a/crates/hir_def/src/nameres/proc_macro.rs +++ b/crates/hir_def/src/nameres/proc_macro.rs @@ -18,6 +18,16 @@ pub(super) enum ProcMacroKind { Attr, } +impl ProcMacroKind { + pub(super) fn to_basedb_kind(&self) -> base_db::ProcMacroKind { + match self { + ProcMacroKind::CustomDerive { .. } => base_db::ProcMacroKind::CustomDerive, + ProcMacroKind::FnLike => base_db::ProcMacroKind::FuncLike, + ProcMacroKind::Attr => base_db::ProcMacroKind::Attr, + } + } +} + impl Attrs { #[rustfmt::skip] pub(super) fn parse_proc_macro_decl(&self, func_name: &Name) -> Option { diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs index 10d37234e7..90d8ae2401 100644 --- a/crates/hir_expand/src/lib.rs +++ b/crates/hir_expand/src/lib.rs @@ -15,6 +15,7 @@ pub mod quote; pub mod eager; mod input; +use base_db::ProcMacroKind; use either::Either; pub use mbe::{ExpandError, ExpandResult}; @@ -207,7 +208,7 @@ impl MacroDefId { MacroDefKind::BuiltIn(_, id) => id, MacroDefKind::BuiltInDerive(_, id) => id, MacroDefKind::BuiltInEager(_, id) => id, - MacroDefKind::ProcMacro(_, id) => return Either::Right(*id), + MacroDefKind::ProcMacro(.., id) => return Either::Right(*id), }; Either::Left(*id) } @@ -224,7 +225,7 @@ pub enum MacroDefKind { // FIXME: maybe just Builtin and rename BuiltinFnLikeExpander to BuiltinExpander BuiltInDerive(BuiltinDeriveExpander, AstId), BuiltInEager(EagerExpander, AstId), - ProcMacro(ProcMacroExpander, AstId), + ProcMacro(ProcMacroExpander, ProcMacroKind, AstId), } #[derive(Debug, Clone, PartialEq, Eq, Hash)]