Clean up tokenstream::Cursor and proc_macro.

This commit is contained in:
Jeffrey Seyfried 2017-03-17 23:23:12 +00:00
parent d4488b7df9
commit 7d41674b17
2 changed files with 38 additions and 44 deletions

View file

@ -48,7 +48,7 @@ use std::str::FromStr;
use syntax::errors::DiagnosticBuilder;
use syntax::parse;
use syntax::tokenstream::TokenStream as TokenStream_;
use syntax::tokenstream;
/// The main type provided by this crate, representing an abstract stream of
/// tokens.
@ -60,9 +60,7 @@ use syntax::tokenstream::TokenStream as TokenStream_;
/// The API of this type is intentionally bare-bones, but it'll be expanded over
/// time!
#[stable(feature = "proc_macro_lib", since = "1.15.0")]
pub struct TokenStream {
inner: TokenStream_,
}
pub struct TokenStream(tokenstream::TokenStream);
/// Error returned from `TokenStream::from_str`.
#[derive(Debug)]
@ -91,26 +89,22 @@ pub mod __internal {
use syntax::ext::hygiene::Mark;
use syntax::ptr::P;
use syntax::parse::{self, token, ParseSess};
use syntax::tokenstream::{TokenTree, TokenStream as TokenStream_};
use syntax::tokenstream;
use super::{TokenStream, LexError};
pub fn new_token_stream(item: P<ast::Item>) -> TokenStream {
TokenStream {
inner: TokenTree::Token(item.span, token::Interpolated(Rc::new(token::NtItem(item))))
.into()
}
let (span, token) = (item.span, token::Interpolated(Rc::new(token::NtItem(item))));
TokenStream(tokenstream::TokenTree::Token(span, token).into())
}
pub fn token_stream_wrap(inner: TokenStream_) -> TokenStream {
TokenStream {
inner: inner
}
pub fn token_stream_wrap(inner: tokenstream::TokenStream) -> TokenStream {
TokenStream(inner)
}
pub fn token_stream_parse_items(stream: TokenStream) -> Result<Vec<P<ast::Item>>, LexError> {
with_sess(move |(sess, _)| {
let mut parser = parse::stream_to_parser(sess, stream.inner);
let mut parser = parse::stream_to_parser(sess, stream.0);
let mut items = Vec::new();
while let Some(item) = try!(parser.parse_item().map_err(super::parse_to_lex_err)) {
@ -121,8 +115,8 @@ pub mod __internal {
})
}
pub fn token_stream_inner(stream: TokenStream) -> TokenStream_ {
stream.inner
pub fn token_stream_inner(stream: TokenStream) -> tokenstream::TokenStream {
stream.0
}
pub trait Registry {
@ -197,6 +191,6 @@ impl FromStr for TokenStream {
#[stable(feature = "proc_macro_lib", since = "1.15.0")]
impl fmt::Display for TokenStream {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.inner.fmt(f)
self.0.fmt(f)
}
}

View file

@ -199,7 +199,7 @@ impl TokenStream {
pub fn concat(mut streams: Vec<TokenStream>) -> TokenStream {
match streams.len() {
0 => TokenStream::empty(),
1 => TokenStream::from(streams.pop().unwrap()),
1 => streams.pop().unwrap(),
_ => TokenStream::concat_rc_slice(RcSlice::new(streams)),
}
}
@ -244,37 +244,22 @@ struct StreamCursor {
stack: Vec<(RcSlice<TokenStream>, usize)>,
}
impl Iterator for Cursor {
type Item = TokenTree;
impl StreamCursor {
fn next(&mut self) -> Option<TokenTree> {
let cursor = match self.0 {
CursorKind::Stream(ref mut cursor) => cursor,
CursorKind::Tree(ref tree, ref mut consumed @ false) => {
*consumed = true;
return Some(tree.clone());
}
_ => return None,
};
loop {
if cursor.index < cursor.stream.len() {
match cursor.stream[cursor.index].kind.clone() {
TokenStreamKind::Tree(tree) => {
cursor.index += 1;
return Some(tree);
}
if self.index < self.stream.len() {
self.index += 1;
match self.stream[self.index - 1].kind.clone() {
TokenStreamKind::Tree(tree) => return Some(tree),
TokenStreamKind::Stream(stream) => {
cursor.stack.push((mem::replace(&mut cursor.stream, stream),
mem::replace(&mut cursor.index, 0) + 1));
}
TokenStreamKind::Empty => {
cursor.index += 1;
self.stack.push((mem::replace(&mut self.stream, stream),
mem::replace(&mut self.index, 0)));
}
TokenStreamKind::Empty => {}
}
} else if let Some((stream, index)) = cursor.stack.pop() {
cursor.stream = stream;
cursor.index = index;
} else if let Some((stream, index)) = self.stack.pop() {
self.stream = stream;
self.index = index;
} else {
return None;
}
@ -282,6 +267,21 @@ impl Iterator for Cursor {
}
}
impl Iterator for Cursor {
type Item = TokenTree;
fn next(&mut self) -> Option<TokenTree> {
let (tree, consumed) = match self.0 {
CursorKind::Tree(ref tree, ref mut consumed @ false) => (tree, consumed),
CursorKind::Stream(ref mut cursor) => return cursor.next(),
_ => return None,
};
*consumed = true;
Some(tree.clone())
}
}
impl Cursor {
fn new(stream: TokenStream) -> Self {
Cursor(match stream.kind {