Remove Iterator
impl for TokenTreeCursor
.
This is surprising, but the new comment explains why. It's a logical conclusion in the drive to avoid `TokenTree` clones. `TokenTreeCursor` is now only used within `Parser`. It's still needed due to `replace_prev_and_rewind`.
This commit is contained in:
parent
ee6ed60373
commit
4ebf2be8bb
3 changed files with 13 additions and 18 deletions
|
@ -597,26 +597,21 @@ impl<'t> Iterator for RefTokenTreeCursor<'t> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Owning by-value iterator over a [`TokenStream`], that produces `TokenTree`
|
/// Owning by-value iterator over a [`TokenStream`], that produces `&TokenTree`
|
||||||
/// items.
|
/// items.
|
||||||
// FIXME: Many uses of this can be replaced with by-reference iterator to avoid clones.
|
///
|
||||||
|
/// Doesn't impl `Iterator` because Rust doesn't permit an owning iterator to
|
||||||
|
/// return `&T` from `next`; the need for an explicit lifetime in the `Item`
|
||||||
|
/// associated type gets in the way. Instead, use `next_ref` (which doesn't
|
||||||
|
/// involve associated types) for getting individual elements, or
|
||||||
|
/// `RefTokenTreeCursor` if you really want an `Iterator`, e.g. in a `for`
|
||||||
|
/// loop.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct TokenTreeCursor {
|
pub struct TokenTreeCursor {
|
||||||
pub stream: TokenStream,
|
pub stream: TokenStream,
|
||||||
index: usize,
|
index: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Iterator for TokenTreeCursor {
|
|
||||||
type Item = TokenTree;
|
|
||||||
|
|
||||||
fn next(&mut self) -> Option<TokenTree> {
|
|
||||||
self.stream.0.get(self.index).map(|tree| {
|
|
||||||
self.index += 1;
|
|
||||||
tree.clone()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TokenTreeCursor {
|
impl TokenTreeCursor {
|
||||||
fn new(stream: TokenStream) -> Self {
|
fn new(stream: TokenStream) -> Self {
|
||||||
TokenTreeCursor { stream, index: 0 }
|
TokenTreeCursor { stream, index: 0 }
|
||||||
|
|
|
@ -365,9 +365,9 @@ impl<'a> StripUnconfigured<'a> {
|
||||||
|
|
||||||
// Use the `#` in `#[cfg_attr(pred, attr)]` as the `#` token
|
// Use the `#` in `#[cfg_attr(pred, attr)]` as the `#` token
|
||||||
// for `attr` when we expand it to `#[attr]`
|
// for `attr` when we expand it to `#[attr]`
|
||||||
let mut orig_trees = orig_tokens.into_trees();
|
let mut orig_trees = orig_tokens.trees();
|
||||||
let TokenTree::Token(pound_token @ Token { kind: TokenKind::Pound, .. }, _) =
|
let TokenTree::Token(pound_token @ Token { kind: TokenKind::Pound, .. }, _) =
|
||||||
orig_trees.next().unwrap()
|
orig_trees.next().unwrap().clone()
|
||||||
else {
|
else {
|
||||||
panic!("Bad tokens for attribute {:?}", attr);
|
panic!("Bad tokens for attribute {:?}", attr);
|
||||||
};
|
};
|
||||||
|
@ -377,7 +377,7 @@ impl<'a> StripUnconfigured<'a> {
|
||||||
if attr.style == AttrStyle::Inner {
|
if attr.style == AttrStyle::Inner {
|
||||||
// For inner attributes, we do the same thing for the `!` in `#![some_attr]`
|
// For inner attributes, we do the same thing for the `!` in `#![some_attr]`
|
||||||
let TokenTree::Token(bang_token @ Token { kind: TokenKind::Not, .. }, _) =
|
let TokenTree::Token(bang_token @ Token { kind: TokenKind::Not, .. }, _) =
|
||||||
orig_trees.next().unwrap()
|
orig_trees.next().unwrap().clone()
|
||||||
else {
|
else {
|
||||||
panic!("Bad tokens for attribute {:?}", attr);
|
panic!("Bad tokens for attribute {:?}", attr);
|
||||||
};
|
};
|
||||||
|
|
|
@ -94,10 +94,10 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStre
|
||||||
// Estimate the capacity as `stream.len()` rounded up to the next power
|
// Estimate the capacity as `stream.len()` rounded up to the next power
|
||||||
// of two to limit the number of required reallocations.
|
// of two to limit the number of required reallocations.
|
||||||
let mut trees = Vec::with_capacity(stream.len().next_power_of_two());
|
let mut trees = Vec::with_capacity(stream.len().next_power_of_two());
|
||||||
let mut cursor = stream.into_trees();
|
let mut cursor = stream.trees();
|
||||||
|
|
||||||
while let Some(tree) = cursor.next() {
|
while let Some(tree) = cursor.next() {
|
||||||
let (Token { kind, span }, joint) = match tree {
|
let (Token { kind, span }, joint) = match tree.clone() {
|
||||||
tokenstream::TokenTree::Delimited(span, delim, tts) => {
|
tokenstream::TokenTree::Delimited(span, delim, tts) => {
|
||||||
let delimiter = pm::Delimiter::from_internal(delim);
|
let delimiter = pm::Delimiter::from_internal(delim);
|
||||||
trees.push(TokenTree::Group(Group {
|
trees.push(TokenTree::Group(Group {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue