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.rs24
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))
}