Skip to content

Commit 5c8dfa9

Browse files
committed
Remove Peekable<TokenStreamIter> uses.
Currently there are two ways to peek at a `TokenStreamIter`. - Wrap it in a `Peekable` and use that traits `peek` method. - Use `TokenStreamIter`'s inherent `peek` method. Some code uses one, some use the other. This commit converts all places to the inherent method. This eliminates mixing of `TokenStreamIter` and `Peekable<TokenStreamIter>` and some use of `impl Iterator` and `dyn Iterator`.
1 parent b25038f commit 5c8dfa9

File tree

3 files changed

+24
-31
lines changed

3 files changed

+24
-31
lines changed

compiler/rustc_ast/src/attr/mod.rs

+9-18
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//! Functions dealing with attributes and meta items.
22
3-
use std::iter;
43
use std::sync::atomic::{AtomicU32, Ordering};
54

65
use rustc_index::bit_set::GrowableBitSet;
@@ -16,7 +15,9 @@ use crate::ast::{
1615
};
1716
use crate::ptr::P;
1817
use crate::token::{self, CommentKind, Delimiter, Token};
19-
use crate::tokenstream::{DelimSpan, LazyAttrTokenStream, Spacing, TokenStream, TokenTree};
18+
use crate::tokenstream::{
19+
DelimSpan, LazyAttrTokenStream, Spacing, TokenStream, TokenStreamIter, TokenTree,
20+
};
2021
use crate::util::comments;
2122
use crate::util::literal::escape_string_symbol;
2223

@@ -368,10 +369,7 @@ impl MetaItem {
368369
}
369370
}
370371

371-
fn from_tokens<'a, I>(iter: &mut iter::Peekable<I>) -> Option<MetaItem>
372-
where
373-
I: Iterator<Item = &'a TokenTree>,
374-
{
372+
fn from_tokens(iter: &mut TokenStreamIter<'_>) -> Option<MetaItem> {
375373
// FIXME: Share code with `parse_path`.
376374
let tt = iter.next().map(|tt| TokenTree::uninterpolate(tt));
377375
let path = match tt.as_deref() {
@@ -440,7 +438,7 @@ impl MetaItem {
440438

441439
impl MetaItemKind {
442440
fn list_from_tokens(tokens: TokenStream) -> Option<ThinVec<MetaItemInner>> {
443-
let mut iter = tokens.iter().peekable();
441+
let mut iter = tokens.iter();
444442
let mut result = ThinVec::new();
445443
while iter.peek().is_some() {
446444
let item = MetaItemInner::from_tokens(&mut iter)?;
@@ -453,9 +451,7 @@ impl MetaItemKind {
453451
Some(result)
454452
}
455453

456-
fn name_value_from_tokens<'a>(
457-
iter: &mut impl Iterator<Item = &'a TokenTree>,
458-
) -> Option<MetaItemKind> {
454+
fn name_value_from_tokens(iter: &mut TokenStreamIter<'_>) -> Option<MetaItemKind> {
459455
match iter.next() {
460456
Some(TokenTree::Delimited(.., Delimiter::Invisible(_), inner_tokens)) => {
461457
MetaItemKind::name_value_from_tokens(&mut inner_tokens.iter())
@@ -467,9 +463,7 @@ impl MetaItemKind {
467463
}
468464
}
469465

470-
fn from_tokens<'a>(
471-
iter: &mut iter::Peekable<impl Iterator<Item = &'a TokenTree>>,
472-
) -> Option<MetaItemKind> {
466+
fn from_tokens(iter: &mut TokenStreamIter<'_>) -> Option<MetaItemKind> {
473467
match iter.peek() {
474468
Some(TokenTree::Delimited(.., Delimiter::Parenthesis, inner_tokens)) => {
475469
let inner_tokens = inner_tokens.clone();
@@ -598,18 +592,15 @@ impl MetaItemInner {
598592
self.meta_item().is_some()
599593
}
600594

601-
fn from_tokens<'a, I>(iter: &mut iter::Peekable<I>) -> Option<MetaItemInner>
602-
where
603-
I: Iterator<Item = &'a TokenTree>,
604-
{
595+
fn from_tokens(iter: &mut TokenStreamIter<'_>) -> Option<MetaItemInner> {
605596
match iter.peek() {
606597
Some(TokenTree::Token(token, _)) if let Some(lit) = MetaItemLit::from_token(token) => {
607598
iter.next();
608599
return Some(MetaItemInner::Lit(lit));
609600
}
610601
Some(TokenTree::Delimited(.., Delimiter::Invisible(_), inner_tokens)) => {
611602
iter.next();
612-
return MetaItemInner::from_tokens(&mut inner_tokens.iter().peekable());
603+
return MetaItemInner::from_tokens(&mut inner_tokens.iter());
613604
}
614605
_ => {}
615606
}

compiler/rustc_ast/src/tokenstream.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ impl<'t> TokenStreamIter<'t> {
676676
TokenStreamIter { stream, index: 0 }
677677
}
678678

679-
pub fn peek(&self) -> Option<&TokenTree> {
679+
pub fn peek(&self) -> Option<&'t TokenTree> {
680680
self.stream.0.get(self.index)
681681
}
682682
}

compiler/rustc_expand/src/mbe/quoted.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use rustc_ast::token::{self, Delimiter, IdentIsRaw, NonterminalKind, Token};
2+
use rustc_ast::tokenstream::TokenStreamIter;
23
use rustc_ast::{NodeId, tokenstream};
34
use rustc_ast_pretty::pprust;
45
use rustc_feature::Features;
@@ -49,7 +50,7 @@ pub(super) fn parse(
4950

5051
// For each token tree in `input`, parse the token into a `self::TokenTree`, consuming
5152
// additional trees if need be.
52-
let mut iter = input.iter().peekable();
53+
let mut iter = input.iter();
5354
while let Some(tree) = iter.next() {
5455
// Given the parsed tree, if there is a metavar and we are expecting matchers, actually
5556
// parse out the matcher (i.e., in `$id:ident` this would parse the `:` and `ident`).
@@ -150,7 +151,7 @@ fn maybe_emit_macro_metavar_expr_concat_feature(features: &Features, sess: &Sess
150151
/// - `features`: language features so we can do feature gating.
151152
fn parse_tree<'a>(
152153
tree: &'a tokenstream::TokenTree,
153-
outer_iter: &mut impl Iterator<Item = &'a tokenstream::TokenTree>,
154+
outer_iter: &mut TokenStreamIter<'a>,
154155
parsing_patterns: bool,
155156
sess: &Session,
156157
node_id: NodeId,
@@ -164,14 +165,15 @@ fn parse_tree<'a>(
164165
// FIXME: Handle `Invisible`-delimited groups in a more systematic way
165166
// during parsing.
166167
let mut next = outer_iter.next();
167-
let mut iter: Box<dyn Iterator<Item = &tokenstream::TokenTree>>;
168-
match next {
168+
let mut iter_storage;
169+
let mut iter: &mut TokenStreamIter<'_> = match next {
169170
Some(tokenstream::TokenTree::Delimited(.., delim, tts)) if delim.skip() => {
170-
iter = Box::new(tts.iter());
171-
next = iter.next();
171+
iter_storage = tts.iter();
172+
next = iter_storage.next();
173+
&mut iter_storage
172174
}
173-
_ => iter = Box::new(outer_iter),
174-
}
175+
_ => outer_iter,
176+
};
175177

176178
match next {
177179
// `tree` is followed by a delimited set of token trees.
@@ -313,8 +315,8 @@ fn kleene_op(token: &Token) -> Option<KleeneOp> {
313315
/// - Ok(Ok((op, span))) if the next token tree is a KleeneOp
314316
/// - Ok(Err(tok, span)) if the next token tree is a token but not a KleeneOp
315317
/// - Err(span) if the next token tree is not a token
316-
fn parse_kleene_op<'a>(
317-
iter: &mut impl Iterator<Item = &'a tokenstream::TokenTree>,
318+
fn parse_kleene_op(
319+
iter: &mut TokenStreamIter<'_>,
318320
span: Span,
319321
) -> Result<Result<(KleeneOp, Span), Token>, Span> {
320322
match iter.next() {
@@ -338,8 +340,8 @@ fn parse_kleene_op<'a>(
338340
/// session `sess`. If the next one (or possibly two) tokens in `iter` correspond to a Kleene
339341
/// operator and separator, then a tuple with `(separator, KleeneOp)` is returned. Otherwise, an
340342
/// error with the appropriate span is emitted to `sess` and a dummy value is returned.
341-
fn parse_sep_and_kleene_op<'a>(
342-
iter: &mut impl Iterator<Item = &'a tokenstream::TokenTree>,
343+
fn parse_sep_and_kleene_op(
344+
iter: &mut TokenStreamIter<'_>,
343345
span: Span,
344346
sess: &Session,
345347
) -> (Option<Token>, KleeneToken) {

0 commit comments

Comments
 (0)