Skip to content

Commit cf71538

Browse files
committed
syntax: Optimize conversion AttrItem -> MetaItem by avoiding outer_tokens.
1 parent 5378955 commit cf71538

File tree

1 file changed

+44
-29
lines changed

1 file changed

+44
-29
lines changed

src/libsyntax/attr/mod.rs

+44-29
Original file line numberDiff line numberDiff line change
@@ -278,17 +278,9 @@ impl MetaItem {
278278

279279
impl AttrItem {
280280
pub fn meta(&self, span: Span) -> Option<MetaItem> {
281-
let mut tokens = self.args.outer_tokens().trees().peekable();
282281
Some(MetaItem {
283282
path: self.path.clone(),
284-
kind: if let Some(kind) = MetaItemKind::from_tokens(&mut tokens) {
285-
if tokens.peek().is_some() {
286-
return None;
287-
}
288-
kind
289-
} else {
290-
return None;
291-
},
283+
kind: MetaItemKind::from_mac_args(&self.args)?,
292284
span,
293285
})
294286
}
@@ -567,26 +559,8 @@ impl MetaItemKind {
567559
}
568560
}
569561

570-
fn from_tokens<I>(tokens: &mut iter::Peekable<I>) -> Option<MetaItemKind>
571-
where I: Iterator<Item = TokenTree>,
572-
{
573-
let delimited = match tokens.peek().cloned() {
574-
Some(TokenTree::Token(token)) if token == token::Eq => {
575-
tokens.next();
576-
return if let Some(TokenTree::Token(token)) = tokens.next() {
577-
Lit::from_token(&token).ok().map(MetaItemKind::NameValue)
578-
} else {
579-
None
580-
};
581-
}
582-
Some(TokenTree::Delimited(_, delim, ref tts)) if delim == token::Paren => {
583-
tokens.next();
584-
tts.clone()
585-
}
586-
_ => return Some(MetaItemKind::Word),
587-
};
588-
589-
let mut tokens = delimited.into_trees().peekable();
562+
fn list_from_tokens(tokens: TokenStream) -> Option<MetaItemKind> {
563+
let mut tokens = tokens.into_trees().peekable();
590564
let mut result = Vec::new();
591565
while let Some(..) = tokens.peek() {
592566
let item = NestedMetaItem::from_tokens(&mut tokens)?;
@@ -598,6 +572,47 @@ impl MetaItemKind {
598572
}
599573
Some(MetaItemKind::List(result))
600574
}
575+
576+
fn name_value_from_tokens(
577+
tokens: &mut impl Iterator<Item = TokenTree>,
578+
) -> Option<MetaItemKind> {
579+
match tokens.next() {
580+
Some(TokenTree::Token(token)) =>
581+
Lit::from_token(&token).ok().map(MetaItemKind::NameValue),
582+
_ => None,
583+
}
584+
}
585+
586+
fn from_mac_args(args: &MacArgs) -> Option<MetaItemKind> {
587+
match args {
588+
MacArgs::Delimited(_, MacDelimiter::Parenthesis, tokens) =>
589+
MetaItemKind::list_from_tokens(tokens.clone()),
590+
MacArgs::Delimited(..) => None,
591+
MacArgs::Eq(_, tokens) => {
592+
assert!(tokens.len() == 1);
593+
MetaItemKind::name_value_from_tokens(&mut tokens.trees())
594+
}
595+
MacArgs::Empty => Some(MetaItemKind::Word),
596+
}
597+
}
598+
599+
fn from_tokens(
600+
tokens: &mut iter::Peekable<impl Iterator<Item = TokenTree>>,
601+
) -> Option<MetaItemKind> {
602+
match tokens.peek() {
603+
Some(TokenTree::Delimited(_, token::Paren, inner_tokens)) => {
604+
let inner_tokens = inner_tokens.clone();
605+
tokens.next();
606+
MetaItemKind::list_from_tokens(inner_tokens)
607+
}
608+
Some(TokenTree::Delimited(..)) => None,
609+
Some(TokenTree::Token(Token { kind: token::Eq, .. })) => {
610+
tokens.next();
611+
MetaItemKind::name_value_from_tokens(tokens)
612+
}
613+
_ => Some(MetaItemKind::Word),
614+
}
615+
}
601616
}
602617

603618
impl NestedMetaItem {

0 commit comments

Comments
 (0)