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.rs | 32 |
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 |