Skip to content

Commit 103bd4a

Browse files
committed
Use TokenStream::trees instead of into_trees for attributes.
This avoids cloning some token trees. A couple of `clone` calls were inserted, but only on some paths, and the next commit will remove them.
1 parent a9d8459 commit 103bd4a

File tree

1 file changed

+13
-14
lines changed
  • compiler/rustc_ast/src/attr

1 file changed

+13
-14
lines changed

compiler/rustc_ast/src/attr/mod.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -285,12 +285,12 @@ impl MetaItem {
285285
self.kind.value_str()
286286
}
287287

288-
fn from_tokens<I>(tokens: &mut iter::Peekable<I>) -> Option<MetaItem>
288+
fn from_tokens<'a, I>(tokens: &mut iter::Peekable<I>) -> Option<MetaItem>
289289
where
290-
I: Iterator<Item = TokenTree>,
290+
I: Iterator<Item = &'a TokenTree>,
291291
{
292292
// FIXME: Share code with `parse_path`.
293-
let path = match tokens.next().map(TokenTree::uninterpolate) {
293+
let path = match tokens.next().map(|tt| TokenTree::uninterpolate(tt.clone())) {
294294
Some(TokenTree::Token(
295295
Token { kind: kind @ (token::Ident(..) | token::ModSep), span },
296296
_,
@@ -309,7 +309,7 @@ impl MetaItem {
309309
};
310310
loop {
311311
if let Some(TokenTree::Token(Token { kind: token::Ident(name, _), span }, _)) =
312-
tokens.next().map(TokenTree::uninterpolate)
312+
tokens.next().map(|tt| TokenTree::uninterpolate(tt.clone()))
313313
{
314314
segments.push(PathSegment::from_ident(Ident::new(name, span)));
315315
} else {
@@ -354,7 +354,7 @@ impl MetaItemKind {
354354
}
355355

356356
fn list_from_tokens(tokens: TokenStream) -> Option<ThinVec<NestedMetaItem>> {
357-
let mut tokens = tokens.into_trees().peekable();
357+
let mut tokens = tokens.trees().peekable();
358358
let mut result = ThinVec::new();
359359
while tokens.peek().is_some() {
360360
let item = NestedMetaItem::from_tokens(&mut tokens)?;
@@ -367,12 +367,12 @@ impl MetaItemKind {
367367
Some(result)
368368
}
369369

370-
fn name_value_from_tokens(
371-
tokens: &mut impl Iterator<Item = TokenTree>,
370+
fn name_value_from_tokens<'a>(
371+
tokens: &mut impl Iterator<Item = &'a TokenTree>,
372372
) -> Option<MetaItemKind> {
373373
match tokens.next() {
374374
Some(TokenTree::Delimited(_, Delimiter::Invisible, inner_tokens)) => {
375-
MetaItemKind::name_value_from_tokens(&mut inner_tokens.into_trees())
375+
MetaItemKind::name_value_from_tokens(&mut inner_tokens.trees())
376376
}
377377
Some(TokenTree::Token(token, _)) => {
378378
MetaItemLit::from_token(&token).map(MetaItemKind::NameValue)
@@ -381,8 +381,8 @@ impl MetaItemKind {
381381
}
382382
}
383383

384-
fn from_tokens(
385-
tokens: &mut iter::Peekable<impl Iterator<Item = TokenTree>>,
384+
fn from_tokens<'a>(
385+
tokens: &mut iter::Peekable<impl Iterator<Item = &'a TokenTree>>,
386386
) -> Option<MetaItemKind> {
387387
match tokens.peek() {
388388
Some(TokenTree::Delimited(_, Delimiter::Parenthesis, inner_tokens)) => {
@@ -501,9 +501,9 @@ impl NestedMetaItem {
501501
self.meta_item().is_some()
502502
}
503503

504-
fn from_tokens<I>(tokens: &mut iter::Peekable<I>) -> Option<NestedMetaItem>
504+
fn from_tokens<'a, I>(tokens: &mut iter::Peekable<I>) -> Option<NestedMetaItem>
505505
where
506-
I: Iterator<Item = TokenTree>,
506+
I: Iterator<Item = &'a TokenTree>,
507507
{
508508
match tokens.peek() {
509509
Some(TokenTree::Token(token, _))
@@ -513,9 +513,8 @@ impl NestedMetaItem {
513513
return Some(NestedMetaItem::Lit(lit));
514514
}
515515
Some(TokenTree::Delimited(_, Delimiter::Invisible, inner_tokens)) => {
516-
let inner_tokens = inner_tokens.clone();
517516
tokens.next();
518-
return NestedMetaItem::from_tokens(&mut inner_tokens.into_trees().peekable());
517+
return NestedMetaItem::from_tokens(&mut inner_tokens.trees().peekable());
519518
}
520519
_ => {}
521520
}

0 commit comments

Comments
 (0)