Skip to content

Commit c82d586

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 809975c commit c82d586

File tree

3 files changed

+27
-31
lines changed

3 files changed

+27
-31
lines changed

compiler/rustc_ast/src/attr/mod.rs

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

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

@@ -366,10 +367,7 @@ impl MetaItem {
366367
}
367368
}
368369

369-
fn from_tokens<'a, I>(iter: &mut iter::Peekable<I>) -> Option<MetaItem>
370-
where
371-
I: Iterator<Item = &'a TokenTree>,
372-
{
370+
fn from_tokens(iter: &mut TokenStreamIter<'_>) -> Option<MetaItem> {
373371
// FIXME: Share code with `parse_path`.
374372
let tt = iter.next().map(|tt| TokenTree::uninterpolate(tt));
375373
let path = match tt.as_deref() {
@@ -439,7 +437,7 @@ impl MetaItem {
439437
impl MetaItemKind {
440438
// public because it can be called in the hir
441439
pub fn list_from_tokens(tokens: TokenStream) -> Option<ThinVec<MetaItemInner>> {
442-
let mut iter = tokens.iter().peekable();
440+
let mut iter = tokens.iter();
443441
let mut result = ThinVec::new();
444442
while iter.peek().is_some() {
445443
let item = MetaItemInner::from_tokens(&mut iter)?;
@@ -452,9 +450,7 @@ impl MetaItemKind {
452450
Some(result)
453451
}
454452

455-
fn name_value_from_tokens<'a>(
456-
iter: &mut impl Iterator<Item = &'a TokenTree>,
457-
) -> Option<MetaItemKind> {
453+
fn name_value_from_tokens(iter: &mut TokenStreamIter<'_>) -> Option<MetaItemKind> {
458454
match iter.next() {
459455
Some(TokenTree::Delimited(.., Delimiter::Invisible(_), inner_tokens)) => {
460456
MetaItemKind::name_value_from_tokens(&mut inner_tokens.iter())
@@ -466,9 +462,7 @@ impl MetaItemKind {
466462
}
467463
}
468464

469-
fn from_tokens<'a>(
470-
iter: &mut iter::Peekable<impl Iterator<Item = &'a TokenTree>>,
471-
) -> Option<MetaItemKind> {
465+
fn from_tokens(iter: &mut TokenStreamIter<'_>) -> Option<MetaItemKind> {
472466
match iter.peek() {
473467
Some(TokenTree::Delimited(.., Delimiter::Parenthesis, inner_tokens)) => {
474468
let inner_tokens = inner_tokens.clone();
@@ -594,18 +588,15 @@ impl MetaItemInner {
594588
self.meta_item().is_some()
595589
}
596590

597-
fn from_tokens<'a, I>(iter: &mut iter::Peekable<I>) -> Option<MetaItemInner>
598-
where
599-
I: Iterator<Item = &'a TokenTree>,
600-
{
591+
fn from_tokens(iter: &mut TokenStreamIter<'_>) -> Option<MetaItemInner> {
601592
match iter.peek() {
602593
Some(TokenTree::Token(token, _)) if let Some(lit) = MetaItemLit::from_token(token) => {
603594
iter.next();
604595
return Some(MetaItemInner::Lit(lit));
605596
}
606597
Some(TokenTree::Delimited(.., Delimiter::Invisible(_), inner_tokens)) => {
607598
iter.next();
608-
return MetaItemInner::from_tokens(&mut inner_tokens.iter().peekable());
599+
return MetaItemInner::from_tokens(&mut inner_tokens.iter());
609600
}
610601
_ => {}
611602
}

compiler/rustc_ast/src/tokenstream.rs

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

679-
pub fn peek(&self) -> Option<&TokenTree> {
679+
// Peeking could be done via `Peekable`, but most iterators need peeking,
680+
// and this is simple and avoids the need to use `peekable` and `Peekable`
681+
// at all the use sites.
682+
pub fn peek(&self) -> Option<&'t TokenTree> {
680683
self.stream.0.get(self.index)
681684
}
682685
}

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)