Skip to content
This repository was archived by the owner on Dec 27, 2022. It is now read-only.

Commit 091e136

Browse files
committed
Wrap token iterator in a new type
This is in prepration for building better behavior into it, such as transparently stepping into None-delimited groups.
1 parent 7bdb83b commit 091e136

File tree

3 files changed

+42
-17
lines changed

3 files changed

+42
-17
lines changed

src/iter.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use proc_macro::{token_stream, TokenStream, TokenTree};
2+
use std::iter::Peekable;
3+
4+
pub type Iter<'a> = &'a mut IterImpl;
5+
6+
pub struct IterImpl {
7+
tokens: Peekable<token_stream::IntoIter>,
8+
}
9+
10+
pub fn new(tokens: TokenStream) -> IterImpl {
11+
IterImpl {
12+
tokens: tokens.into_iter().peekable(),
13+
}
14+
}
15+
16+
impl IterImpl {
17+
pub fn peek(&mut self) -> Option<&TokenTree> {
18+
self.tokens.peek()
19+
}
20+
}
21+
22+
impl Iterator for IterImpl {
23+
type Item = TokenTree;
24+
25+
fn next(&mut self) -> Option<Self::Item> {
26+
self.tokens.next()
27+
}
28+
}

src/lib.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,17 @@ extern crate proc_macro;
131131
mod quote;
132132

133133
mod error;
134+
mod iter;
134135
mod parse;
135136

136137
use crate::error::{compile_error, Error};
138+
use crate::iter::Iter;
137139
use crate::parse::{
138140
parse_define_args, parse_enum_hack, parse_export_args, parse_fake_call_site, parse_input,
139141
};
140-
use proc_macro::{token_stream, Ident, Punct, Spacing, Span, TokenStream, TokenTree};
142+
use proc_macro::{Ident, Punct, Spacing, Span, TokenStream, TokenTree};
141143
use std::fmt::Write;
142-
use std::iter::Peekable;
143144

144-
type Iter<'a> = &'a mut Peekable<token_stream::IntoIter>;
145145
type Visibility = Option<Span>;
146146

147147
enum Input {
@@ -171,8 +171,8 @@ struct Macro {
171171

172172
#[proc_macro_attribute]
173173
pub fn proc_macro_hack(args: TokenStream, input: TokenStream) -> TokenStream {
174-
let ref mut args = args.into_iter().peekable();
175-
let ref mut input = input.into_iter().peekable();
174+
let ref mut args = iter::new(args);
175+
let ref mut input = iter::new(input);
176176
expand_proc_macro_hack(args, input).unwrap_or_else(compile_error)
177177
}
178178

@@ -192,7 +192,7 @@ fn expand_proc_macro_hack(args: Iter, input: Iter) -> Result<TokenStream, Error>
192192
#[doc(hidden)]
193193
#[proc_macro_derive(ProcMacroHack)]
194194
pub fn enum_hack(input: TokenStream) -> TokenStream {
195-
let ref mut input = input.into_iter().peekable();
195+
let ref mut input = iter::new(input);
196196
parse_enum_hack(input).unwrap_or_else(compile_error)
197197
}
198198

@@ -204,8 +204,8 @@ struct FakeCallSite {
204204
#[doc(hidden)]
205205
#[proc_macro_attribute]
206206
pub fn fake_call_site(args: TokenStream, input: TokenStream) -> TokenStream {
207-
let ref mut args = args.into_iter().peekable();
208-
let ref mut input = input.into_iter().peekable();
207+
let ref mut args = iter::new(args);
208+
let ref mut input = iter::new(input);
209209
expand_fake_call_site(args, input).unwrap_or_else(compile_error)
210210
}
211211

src/parse.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use crate::{Define, Error, Export, ExportArgs, FakeCallSite, Input, Iter, Macro, Visibility};
1+
use crate::iter::{self, Iter, IterImpl};
2+
use crate::{Define, Error, Export, ExportArgs, FakeCallSite, Input, Macro, Visibility};
23
use proc_macro::Delimiter::{Brace, Bracket, Parenthesis};
3-
use proc_macro::{token_stream, Delimiter, Ident, Span, TokenStream, TokenTree};
4-
use std::iter::Peekable;
4+
use proc_macro::{Delimiter, Ident, Span, TokenStream, TokenTree};
55

66
pub(crate) fn parse_input(tokens: Iter) -> Result<Input, Error> {
77
let attrs = parse_attributes(tokens)?;
@@ -29,7 +29,7 @@ fn parse_export(attrs: TokenStream, vis: Visibility, tokens: Iter) -> Result<Exp
2929
let mut macros = Vec::new();
3030
match tokens.peek() {
3131
Some(TokenTree::Group(group)) if group.delimiter() == Brace => {
32-
let ref mut content = group.stream().into_iter().peekable();
32+
let ref mut content = iter::new(group.stream());
3333
loop {
3434
macros.push(parse_macro(content)?);
3535
if content.peek().is_none() {
@@ -124,13 +124,10 @@ fn parse_int(tokens: Iter) -> Result<u16, Span> {
124124
}
125125
}
126126

127-
fn parse_group(
128-
tokens: Iter,
129-
delimiter: Delimiter,
130-
) -> Result<Peekable<token_stream::IntoIter>, Error> {
127+
fn parse_group(tokens: Iter, delimiter: Delimiter) -> Result<IterImpl, Error> {
131128
match &tokens.next() {
132129
Some(TokenTree::Group(group)) if group.delimiter() == delimiter => {
133-
Ok(group.stream().into_iter().peekable())
130+
Ok(iter::new(group.stream()))
134131
}
135132
tt => Err(Error::new(
136133
tt.as_ref().map_or_else(Span::call_site, TokenTree::span),

0 commit comments

Comments
 (0)