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 | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/crates/hir-def/src/nameres/proc_macro.rs b/crates/hir-def/src/nameres/proc_macro.rs index cd45afe57d..cd8882183b 100644 --- a/crates/hir-def/src/nameres/proc_macro.rs +++ b/crates/hir-def/src/nameres/proc_macro.rs @@ -3,10 +3,8 @@ use hir_expand::name::{AsName, Name}; use intern::sym; -use crate::{ - item_tree::Attrs, - tt::{Leaf, TokenTree, TopSubtree, TtElement}, -}; +use crate::attr::Attrs; +use crate::tt::{Leaf, TokenTree, TopSubtree, TtElement}; #[derive(Debug, PartialEq, Eq)] pub struct ProcMacroDef { @@ -31,8 +29,8 @@ impl ProcMacroKind { } } -impl Attrs<'_> { - pub(crate) fn parse_proc_macro_decl(&self, func_name: &Name) -> Option<ProcMacroDef> { +impl Attrs { + 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() { @@ -53,10 +51,15 @@ impl Attrs<'_> { } } - pub(crate) fn parse_proc_macro_derive(&self) -> Option<(Name, Box<[Name]>)> { + 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 @@ -81,11 +84,14 @@ pub(crate) fn parse_macro_name_and_helper_attrs(tt: &TopSubtree) -> Option<(Name let helpers = tt::TokenTreesView::new(&tt.token_trees().flat_tokens()[3..]).try_into_subtree()?; let helpers = helpers .iter() - .filter_map(|tt| match tt { + .filter( + |tt| !matches!(tt, TtElement::Leaf(Leaf::Punct(comma)) if comma.char == ','), + ) + .map(|tt| match tt { TtElement::Leaf(Leaf::Ident(helper)) => Some(helper.as_name()), _ => None, }) - .collect::<Box<[_]>>(); + .collect::<Option<Box<[_]>>>()?; Some((trait_name.as_name(), helpers)) } |