Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/nameres.rs')
-rw-r--r--crates/hir-def/src/nameres.rs46
1 files changed, 25 insertions, 21 deletions
diff --git a/crates/hir-def/src/nameres.rs b/crates/hir-def/src/nameres.rs
index b2c50f35be..f910008833 100644
--- a/crates/hir-def/src/nameres.rs
+++ b/crates/hir-def/src/nameres.rs
@@ -77,7 +77,7 @@ use tt::TextRange;
use crate::{
AstId, BlockId, BlockLoc, CrateRootModuleId, ExternCrateId, FunctionId, FxIndexMap,
- LocalModuleId, Lookup, MacroExpander, MacroId, ModuleId, ProcMacroId, UseId,
+ LocalModuleId, Lookup, MacroCallStyles, MacroExpander, MacroId, ModuleId, ProcMacroId, UseId,
db::DefDatabase,
item_scope::{BuiltinShadowMode, ItemScope},
item_tree::TreeId,
@@ -813,26 +813,25 @@ pub enum MacroSubNs {
Attr,
}
-impl MacroSubNs {
- pub(crate) fn from_id(db: &dyn DefDatabase, macro_id: MacroId) -> Self {
- let expander = match macro_id {
- MacroId::Macro2Id(it) => it.lookup(db).expander,
- MacroId::MacroRulesId(it) => it.lookup(db).expander,
- MacroId::ProcMacroId(it) => {
- return match it.lookup(db).kind {
- ProcMacroKind::CustomDerive | ProcMacroKind::Attr => Self::Attr,
- ProcMacroKind::Bang => Self::Bang,
- };
- }
- };
+pub(crate) fn macro_styles_from_id(db: &dyn DefDatabase, macro_id: MacroId) -> MacroCallStyles {
+ let expander = match macro_id {
+ MacroId::Macro2Id(it) => it.lookup(db).expander,
+ MacroId::MacroRulesId(it) => it.lookup(db).expander,
+ MacroId::ProcMacroId(it) => {
+ return match it.lookup(db).kind {
+ ProcMacroKind::CustomDerive => MacroCallStyles::DERIVE,
+ ProcMacroKind::Bang => MacroCallStyles::FN_LIKE,
+ ProcMacroKind::Attr => MacroCallStyles::ATTR,
+ };
+ }
+ };
+ match expander {
+ MacroExpander::Declarative { styles } => styles,
// Eager macros aren't *guaranteed* to be bang macros, but they *are* all bang macros currently.
- match expander {
- MacroExpander::Declarative
- | MacroExpander::BuiltIn(_)
- | MacroExpander::BuiltInEager(_) => Self::Bang,
- MacroExpander::BuiltInAttr(_) | MacroExpander::BuiltInDerive(_) => Self::Attr,
- }
+ MacroExpander::BuiltIn(_) | MacroExpander::BuiltInEager(_) => MacroCallStyles::FN_LIKE,
+ MacroExpander::BuiltInAttr(_) => MacroCallStyles::ATTR,
+ MacroExpander::BuiltInDerive(_) => MacroCallStyles::DERIVE,
}
}
@@ -847,9 +846,14 @@ fn sub_namespace_match(
macro_id: MacroId,
expected: Option<MacroSubNs>,
) -> bool {
- let candidate = MacroSubNs::from_id(db, macro_id);
+ let candidate = macro_styles_from_id(db, macro_id);
match expected {
- Some(expected) => candidate == expected,
+ Some(MacroSubNs::Bang) => candidate.contains(MacroCallStyles::FN_LIKE),
+ Some(MacroSubNs::Attr) => {
+ candidate.contains(MacroCallStyles::ATTR) || candidate.contains(MacroCallStyles::DERIVE)
+ }
+ // If we aren't expecting a specific sub-namespace
+ // (e.g. in `use` declarations), match any macro.
None => true,
}
}