Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/nameres/proc_macro.rs')
-rw-r--r--crates/hir-def/src/nameres/proc_macro.rs32
1 files changed, 21 insertions, 11 deletions
diff --git a/crates/hir-def/src/nameres/proc_macro.rs b/crates/hir-def/src/nameres/proc_macro.rs
index b93a1c87b4..cd8882183b 100644
--- a/crates/hir-def/src/nameres/proc_macro.rs
+++ b/crates/hir-def/src/nameres/proc_macro.rs
@@ -30,26 +30,36 @@ impl ProcMacroKind {
}
impl Attrs {
- #[rustfmt::skip]
pub fn parse_proc_macro_decl(&self, func_name: &Name) -> Option<ProcMacroDef> {
if self.is_proc_macro() {
Some(ProcMacroDef { name: func_name.clone(), kind: ProcMacroKind::Bang })
} else if self.is_proc_macro_attribute() {
Some(ProcMacroDef { name: func_name.clone(), kind: ProcMacroKind::Attr })
- } else if self.by_key(&sym::proc_macro_derive).exists() {
- let derive = self.by_key(&sym::proc_macro_derive).tt_values().next()?;
- let def = parse_macro_name_and_helper_attrs(derive)
- .map(|(name, helpers)| ProcMacroDef { name, kind: ProcMacroKind::Derive { helpers } });
-
- if def.is_none() {
- tracing::trace!("malformed `#[proc_macro_derive]`: {}", derive);
- }
-
- def
+ } else if self.by_key(sym::proc_macro_derive).exists() {
+ let derive = self.parse_proc_macro_derive();
+ Some(match derive {
+ Some((name, helpers)) => {
+ ProcMacroDef { name, kind: ProcMacroKind::Derive { helpers } }
+ }
+ None => ProcMacroDef {
+ name: func_name.clone(),
+ kind: ProcMacroKind::Derive { helpers: Box::default() },
+ },
+ })
} else {
None
}
}
+
+ pub fn parse_proc_macro_derive(&self) -> Option<(Name, Box<[Name]>)> {
+ let derive = self.by_key(sym::proc_macro_derive).tt_values().next()?;
+ parse_macro_name_and_helper_attrs(derive)
+ }
+
+ pub fn parse_rustc_builtin_macro(&self) -> Option<(Name, Box<[Name]>)> {
+ let derive = self.by_key(sym::rustc_builtin_macro).tt_values().next()?;
+ parse_macro_name_and_helper_attrs(derive)
+ }
}
// This fn is intended for `#[proc_macro_derive(..)]` and `#[rustc_builtin_macro(..)]`, which have