Skip to content

Commit 0143774

Browse files
committed
Remove lifetime parameter from syntax::tokenstream::Cursor.
1 parent c0b7112 commit 0143774

File tree

4 files changed

+40
-34
lines changed

4 files changed

+40
-34
lines changed

src/libproc_macro_plugin/qquote.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ macro_rules! quote_tree {
5151
fn delimit(delim: token::DelimToken, stream: TokenStream) -> TokenStream {
5252
TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
5353
delim: delim,
54-
tts: stream.trees().cloned().collect(),
54+
tts: stream.into_trees().collect(),
5555
})).into()
5656
}
5757

@@ -75,21 +75,21 @@ impl Quote for TokenStream {
7575
return quote!(::syntax::tokenstream::TokenStream::empty());
7676
}
7777

78-
struct Quote<'a>(tokenstream::Cursor<'a>);
78+
struct Quote(tokenstream::Cursor);
7979

80-
impl<'a> Iterator for Quote<'a> {
80+
impl Iterator for Quote {
8181
type Item = TokenStream;
8282

8383
fn next(&mut self) -> Option<TokenStream> {
8484
let is_unquote = match self.0.peek() {
85-
Some(&TokenTree::Token(_, Token::Ident(ident))) if ident.name == "unquote" => {
85+
Some(TokenTree::Token(_, Token::Ident(ident))) if ident.name == "unquote" => {
8686
self.0.next();
8787
true
8888
}
8989
_ => false,
9090
};
9191

92-
self.0.next().cloned().map(|tree| {
92+
self.0.next().map(|tree| {
9393
let quoted_tree = if is_unquote { tree.into() } else { tree.quote() };
9494
quote!(::syntax::tokenstream::TokenStream::from((unquote quoted_tree)),)
9595
})
@@ -104,7 +104,7 @@ impl Quote for TokenStream {
104104
impl Quote for Vec<TokenTree> {
105105
fn quote(&self) -> TokenStream {
106106
let stream = self.iter().cloned().collect::<TokenStream>();
107-
quote!((quote stream).trees().cloned().collect::<::std::vec::Vec<_> >())
107+
quote!((quote stream).into_trees().collect::<::std::vec::Vec<_> >())
108108
}
109109
}
110110

src/libsyntax/ext/expand.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
647647

648648
fn parse_expansion(&mut self, toks: TokenStream, kind: ExpansionKind, name: Name, span: Span)
649649
-> Expansion {
650-
let mut parser = self.cx.new_parser_from_tts(&toks.trees().cloned().collect::<Vec<_>>());
650+
let mut parser = self.cx.new_parser_from_tts(&toks.into_trees().collect::<Vec<_>>());
651651
let expansion = match parser.parse_expansion(kind, false) {
652652
Ok(expansion) => expansion,
653653
Err(mut err) => {

src/libsyntax/parse/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ pub fn new_parser_from_tts<'a>(sess: &'a ParseSess, tts: Vec<tokenstream::TokenT
192192
}
193193

194194
pub fn new_parser_from_ts<'a>(sess: &'a ParseSess, ts: tokenstream::TokenStream) -> Parser<'a> {
195-
tts_to_parser(sess, ts.trees().cloned().collect())
195+
tts_to_parser(sess, ts.into_trees().collect())
196196
}
197197

198198

src/libsyntax/tokenstream.rs

+32-26
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use serialize::{Decoder, Decodable, Encoder, Encodable};
3535
use symbol::Symbol;
3636
use util::RcSlice;
3737

38-
use std::{fmt, iter};
38+
use std::{fmt, iter, mem};
3939
use std::rc::Rc;
4040

4141
/// A delimited sequence of token trees
@@ -338,87 +338,93 @@ impl TokenStream {
338338
TokenStream { kind: TokenStreamKind::Stream(RcSlice::new(vec)) }
339339
}
340340

341-
pub fn trees<'a>(&'a self) -> Cursor {
341+
pub fn trees(&self) -> Cursor {
342+
self.clone().into_trees()
343+
}
344+
345+
pub fn into_trees(self) -> Cursor {
342346
Cursor::new(self)
343347
}
344348

345349
/// Compares two TokenStreams, checking equality without regarding span information.
346350
pub fn eq_unspanned(&self, other: &TokenStream) -> bool {
347351
for (t1, t2) in self.trees().zip(other.trees()) {
348-
if !t1.eq_unspanned(t2) {
352+
if !t1.eq_unspanned(&t2) {
349353
return false;
350354
}
351355
}
352356
true
353357
}
354358
}
355359

356-
pub struct Cursor<'a> {
357-
current_frame: CursorFrame<'a>,
358-
stack: Vec<CursorFrame<'a>>,
360+
pub struct Cursor {
361+
current_frame: CursorFrame,
362+
stack: Vec<CursorFrame>,
359363
}
360364

361-
impl<'a> Iterator for Cursor<'a> {
362-
type Item = &'a TokenTree;
365+
impl Iterator for Cursor {
366+
type Item = TokenTree;
363367

364-
fn next(&mut self) -> Option<&'a TokenTree> {
368+
fn next(&mut self) -> Option<TokenTree> {
365369
let tree = self.peek();
366370
self.current_frame = self.stack.pop().unwrap_or(CursorFrame::Empty);
367371
tree
368372
}
369373
}
370374

371-
enum CursorFrame<'a> {
375+
enum CursorFrame {
372376
Empty,
373-
Tree(&'a TokenTree),
374-
Stream(&'a RcSlice<TokenStream>, usize),
377+
Tree(TokenTree),
378+
Stream(RcSlice<TokenStream>, usize),
375379
}
376380

377-
impl<'a> CursorFrame<'a> {
378-
fn new(stream: &'a TokenStream) -> Self {
381+
impl CursorFrame {
382+
fn new(stream: TokenStream) -> Self {
379383
match stream.kind {
380384
TokenStreamKind::Empty => CursorFrame::Empty,
381-
TokenStreamKind::Tree(ref tree) => CursorFrame::Tree(tree),
382-
TokenStreamKind::Stream(ref stream) => CursorFrame::Stream(stream, 0),
385+
TokenStreamKind::Tree(tree) => CursorFrame::Tree(tree),
386+
TokenStreamKind::Stream(stream) => CursorFrame::Stream(stream, 0),
383387
}
384388
}
385389
}
386390

387-
impl<'a> Cursor<'a> {
388-
fn new(stream: &'a TokenStream) -> Self {
391+
impl Cursor {
392+
fn new(stream: TokenStream) -> Self {
389393
Cursor {
390394
current_frame: CursorFrame::new(stream),
391395
stack: Vec::new(),
392396
}
393397
}
394398

395-
pub fn peek(&mut self) -> Option<&'a TokenTree> {
396-
while let CursorFrame::Stream(stream, index) = self.current_frame {
399+
pub fn peek(&mut self) -> Option<TokenTree> {
400+
while let CursorFrame::Stream(stream, index) =
401+
mem::replace(&mut self.current_frame, CursorFrame::Empty) {
397402
self.current_frame = if index == stream.len() {
398403
self.stack.pop().unwrap_or(CursorFrame::Empty)
399404
} else {
405+
let frame = CursorFrame::new(stream[index].clone());
400406
self.stack.push(CursorFrame::Stream(stream, index + 1));
401-
CursorFrame::new(&stream[index])
407+
frame
402408
};
403409
}
404410

405411
match self.current_frame {
406412
CursorFrame::Empty => None,
407-
CursorFrame::Tree(tree) => Some(tree),
413+
CursorFrame::Tree(ref tree) => Some(tree.clone()),
408414
CursorFrame::Stream(..) => unreachable!(),
409415
}
410416
}
411417
}
412418

413419
impl fmt::Display for TokenStream {
414420
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
415-
f.write_str(&pprust::tts_to_string(&self.trees().cloned().collect::<Vec<_>>()))
421+
f.write_str(&pprust::tts_to_string(&self.trees().collect::<Vec<_>>()))
416422
}
417423
}
418424

419425
impl Encodable for TokenStream {
420426
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), E::Error> {
421-
self.trees().cloned().collect::<Vec<_>>().encode(encoder)
427+
self.trees().collect::<Vec<_>>().encode(encoder)
422428
}
423429
}
424430

@@ -464,14 +470,14 @@ mod tests {
464470
fn test_from_to_bijection() {
465471
let test_start = string_to_tts("foo::bar(baz)".to_string());
466472
let ts = test_start.iter().cloned().collect::<TokenStream>();
467-
let test_end: Vec<TokenTree> = ts.trees().cloned().collect();
473+
let test_end: Vec<TokenTree> = ts.trees().collect();
468474
assert_eq!(test_start, test_end)
469475
}
470476

471477
#[test]
472478
fn test_to_from_bijection() {
473479
let test_start = string_to_ts("foo::bar(baz)");
474-
let test_end = test_start.trees().cloned().collect();
480+
let test_end = test_start.trees().collect();
475481
assert_eq!(test_start, test_end)
476482
}
477483

0 commit comments

Comments
 (0)