@@ -35,7 +35,7 @@ use serialize::{Decoder, Decodable, Encoder, Encodable};
35
35
use symbol:: Symbol ;
36
36
use util:: RcSlice ;
37
37
38
- use std:: { fmt, iter} ;
38
+ use std:: { fmt, iter, mem } ;
39
39
use std:: rc:: Rc ;
40
40
41
41
/// A delimited sequence of token trees
@@ -338,87 +338,93 @@ impl TokenStream {
338
338
TokenStream { kind : TokenStreamKind :: Stream ( RcSlice :: new ( vec) ) }
339
339
}
340
340
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 {
342
346
Cursor :: new ( self )
343
347
}
344
348
345
349
/// Compares two TokenStreams, checking equality without regarding span information.
346
350
pub fn eq_unspanned ( & self , other : & TokenStream ) -> bool {
347
351
for ( t1, t2) in self . trees ( ) . zip ( other. trees ( ) ) {
348
- if !t1. eq_unspanned ( t2) {
352
+ if !t1. eq_unspanned ( & t2) {
349
353
return false ;
350
354
}
351
355
}
352
356
true
353
357
}
354
358
}
355
359
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 > ,
359
363
}
360
364
361
- impl < ' a > Iterator for Cursor < ' a > {
362
- type Item = & ' a TokenTree ;
365
+ impl Iterator for Cursor {
366
+ type Item = TokenTree ;
363
367
364
- fn next ( & mut self ) -> Option < & ' a TokenTree > {
368
+ fn next ( & mut self ) -> Option < TokenTree > {
365
369
let tree = self . peek ( ) ;
366
370
self . current_frame = self . stack . pop ( ) . unwrap_or ( CursorFrame :: Empty ) ;
367
371
tree
368
372
}
369
373
}
370
374
371
- enum CursorFrame < ' a > {
375
+ enum CursorFrame {
372
376
Empty ,
373
- Tree ( & ' a TokenTree ) ,
374
- Stream ( & ' a RcSlice < TokenStream > , usize ) ,
377
+ Tree ( TokenTree ) ,
378
+ Stream ( RcSlice < TokenStream > , usize ) ,
375
379
}
376
380
377
- impl < ' a > CursorFrame < ' a > {
378
- fn new ( stream : & ' a TokenStream ) -> Self {
381
+ impl CursorFrame {
382
+ fn new ( stream : TokenStream ) -> Self {
379
383
match stream. kind {
380
384
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 ) ,
383
387
}
384
388
}
385
389
}
386
390
387
- impl < ' a > Cursor < ' a > {
388
- fn new ( stream : & ' a TokenStream ) -> Self {
391
+ impl Cursor {
392
+ fn new ( stream : TokenStream ) -> Self {
389
393
Cursor {
390
394
current_frame : CursorFrame :: new ( stream) ,
391
395
stack : Vec :: new ( ) ,
392
396
}
393
397
}
394
398
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 ) {
397
402
self . current_frame = if index == stream. len ( ) {
398
403
self . stack . pop ( ) . unwrap_or ( CursorFrame :: Empty )
399
404
} else {
405
+ let frame = CursorFrame :: new ( stream[ index] . clone ( ) ) ;
400
406
self . stack . push ( CursorFrame :: Stream ( stream, index + 1 ) ) ;
401
- CursorFrame :: new ( & stream [ index ] )
407
+ frame
402
408
} ;
403
409
}
404
410
405
411
match self . current_frame {
406
412
CursorFrame :: Empty => None ,
407
- CursorFrame :: Tree ( tree) => Some ( tree) ,
413
+ CursorFrame :: Tree ( ref tree) => Some ( tree. clone ( ) ) ,
408
414
CursorFrame :: Stream ( ..) => unreachable ! ( ) ,
409
415
}
410
416
}
411
417
}
412
418
413
419
impl fmt:: Display for TokenStream {
414
420
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 < _ > > ( ) ) )
416
422
}
417
423
}
418
424
419
425
impl Encodable for TokenStream {
420
426
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)
422
428
}
423
429
}
424
430
@@ -464,14 +470,14 @@ mod tests {
464
470
fn test_from_to_bijection ( ) {
465
471
let test_start = string_to_tts ( "foo::bar(baz)" . to_string ( ) ) ;
466
472
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 ( ) ;
468
474
assert_eq ! ( test_start, test_end)
469
475
}
470
476
471
477
#[ test]
472
478
fn test_to_from_bijection ( ) {
473
479
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 ( ) ;
475
481
assert_eq ! ( test_start, test_end)
476
482
}
477
483
0 commit comments