@@ -31,7 +31,8 @@ use tokenstream::{self, TokenStream, TokenTree};
3131
3232use std:: ascii;
3333use std:: io:: { self , Write , Read } ;
34- use std:: iter;
34+ use std:: iter:: { self , Peekable } ;
35+ use std:: vec;
3536
3637pub enum AnnNode < ' a > {
3738 NodeIdent ( & ' a ast:: Ident ) ,
@@ -53,18 +54,12 @@ pub struct NoAnn;
5354
5455impl PpAnn for NoAnn { }
5556
56- #[ derive( Copy , Clone ) ]
57- pub struct CurrentCommentAndLiteral {
58- pub cur_cmnt : usize ,
59- pub cur_lit : usize ,
60- }
61-
6257pub struct State < ' a > {
6358 pub s : pp:: Printer < ' a > ,
6459 cm : Option < & ' a CodeMap > ,
6560 comments : Option < Vec < comments:: Comment > > ,
66- literals : Option < Vec < comments:: Literal > > ,
67- cur_cmnt_and_lit : CurrentCommentAndLiteral ,
61+ literals : Peekable < vec :: IntoIter < comments:: Literal > > ,
62+ cur_cmnt : usize ,
6863 boxes : Vec < pp:: Breaks > ,
6964 ann : & ' a ( PpAnn +' a ) ,
7065}
@@ -80,11 +75,8 @@ pub fn rust_printer_annotated<'a>(writer: Box<Write+'a>,
8075 s : pp:: mk_printer ( writer, DEFAULT_COLUMNS ) ,
8176 cm : None ,
8277 comments : None ,
83- literals : None ,
84- cur_cmnt_and_lit : CurrentCommentAndLiteral {
85- cur_cmnt : 0 ,
86- cur_lit : 0
87- } ,
78+ literals : vec ! [ ] . into_iter ( ) . peekable ( ) ,
79+ cur_cmnt : 0 ,
8880 boxes : Vec :: new ( ) ,
8981 ann : ann,
9082 }
@@ -160,11 +152,8 @@ impl<'a> State<'a> {
160152 s : pp:: mk_printer ( out, DEFAULT_COLUMNS ) ,
161153 cm : Some ( cm) ,
162154 comments : comments,
163- literals : literals,
164- cur_cmnt_and_lit : CurrentCommentAndLiteral {
165- cur_cmnt : 0 ,
166- cur_lit : 0
167- } ,
155+ literals : literals. unwrap_or_default ( ) . into_iter ( ) . peekable ( ) ,
156+ cur_cmnt : 0 ,
168157 boxes : Vec :: new ( ) ,
169158 ann : ann,
170159 }
@@ -451,8 +440,9 @@ pub trait PrintState<'a> {
451440 fn writer ( & mut self ) -> & mut pp:: Printer < ' a > ;
452441 fn boxes ( & mut self ) -> & mut Vec < pp:: Breaks > ;
453442 fn comments ( & mut self ) -> & mut Option < Vec < comments:: Comment > > ;
454- fn cur_cmnt_and_lit ( & mut self ) -> & mut CurrentCommentAndLiteral ;
455- fn literals ( & self ) -> & Option < Vec < comments:: Literal > > ;
443+ fn cur_cmnt ( & mut self ) -> & mut usize ;
444+ fn cur_lit ( & mut self ) -> Option < & comments:: Literal > ;
445+ fn bump_lit ( & mut self ) -> Option < comments:: Literal > ;
456446
457447 fn word_space ( & mut self , w : & str ) -> io:: Result < ( ) > {
458448 self . writer ( ) . word ( w) ?;
@@ -518,31 +508,24 @@ pub trait PrintState<'a> {
518508 }
519509
520510 fn next_lit ( & mut self , pos : BytePos ) -> Option < comments:: Literal > {
521- let mut cur_lit = self . cur_cmnt_and_lit ( ) . cur_lit ;
522-
523- let mut result = None ;
511+ while let Some ( ltrl) = self . cur_lit ( ) . cloned ( ) {
512+ if ltrl. pos > pos { break ; }
524513
525- if let Some ( ref lits) = * self . literals ( ) {
526- while cur_lit < lits. len ( ) {
527- let ltrl = ( * lits) [ cur_lit] . clone ( ) ;
528- if ltrl. pos > pos { break ; }
529- cur_lit += 1 ;
530- if ltrl. pos == pos {
531- result = Some ( ltrl) ;
532- break ;
533- }
514+ // we don't need the value here since we're forced to clone cur_lit
515+ // due to lack of NLL.
516+ self . bump_lit ( ) ;
517+ if ltrl. pos == pos {
518+ return Some ( ltrl) ;
534519 }
535520 }
536521
537- self . cur_cmnt_and_lit ( ) . cur_lit = cur_lit;
538- result
522+ None
539523 }
540524
541525 fn maybe_print_comment ( & mut self , pos : BytePos ) -> io:: Result < ( ) > {
542526 while let Some ( ref cmnt) = self . next_comment ( ) {
543527 if cmnt. pos < pos {
544528 self . print_comment ( cmnt) ?;
545- self . cur_cmnt_and_lit ( ) . cur_cmnt += 1 ;
546529 } else {
547530 break
548531 }
@@ -552,7 +535,7 @@ pub trait PrintState<'a> {
552535
553536 fn print_comment ( & mut self ,
554537 cmnt : & comments:: Comment ) -> io:: Result < ( ) > {
555- match cmnt. style {
538+ let r = match cmnt. style {
556539 comments:: Mixed => {
557540 assert_eq ! ( cmnt. lines. len( ) , 1 ) ;
558541 self . writer ( ) . zerobreak ( ) ?;
@@ -600,11 +583,18 @@ pub trait PrintState<'a> {
600583 }
601584 self . writer ( ) . hardbreak ( )
602585 }
586+ } ;
587+ match r {
588+ Ok ( ( ) ) => {
589+ * self . cur_cmnt ( ) = * self . cur_cmnt ( ) + 1 ;
590+ Ok ( ( ) )
591+ }
592+ Err ( e) => Err ( e) ,
603593 }
604594 }
605595
606596 fn next_comment ( & mut self ) -> Option < comments:: Comment > {
607- let cur_cmnt = self . cur_cmnt_and_lit ( ) . cur_cmnt ;
597+ let cur_cmnt = * self . cur_cmnt ( ) ;
608598 match * self . comments ( ) {
609599 Some ( ref cmnts) => {
610600 if cur_cmnt < cmnts. len ( ) {
@@ -619,8 +609,8 @@ pub trait PrintState<'a> {
619609
620610 fn print_literal ( & mut self , lit : & ast:: Lit ) -> io:: Result < ( ) > {
621611 self . maybe_print_comment ( lit. span . lo ) ?;
622- if let Some ( ref ltrl) = self . next_lit ( lit. span . lo ) {
623- return self . writer ( ) . word ( & ( * ltrl) . lit ) ;
612+ if let Some ( ltrl) = self . next_lit ( lit. span . lo ) {
613+ return self . writer ( ) . word ( & ltrl. lit ) ;
624614 }
625615 match lit. node {
626616 ast:: LitKind :: Str ( st, style) => self . print_string ( & st. as_str ( ) , style) ,
@@ -860,12 +850,16 @@ impl<'a> PrintState<'a> for State<'a> {
860850 & mut self . comments
861851 }
862852
863- fn cur_cmnt_and_lit ( & mut self ) -> & mut CurrentCommentAndLiteral {
864- & mut self . cur_cmnt_and_lit
853+ fn cur_cmnt ( & mut self ) -> & mut usize {
854+ & mut self . cur_cmnt
855+ }
856+
857+ fn cur_lit ( & mut self ) -> Option < & comments:: Literal > {
858+ self . literals . peek ( )
865859 }
866860
867- fn literals ( & self ) -> & Option < Vec < comments:: Literal > > {
868- & self . literals
861+ fn bump_lit ( & mut self ) -> Option < comments:: Literal > {
862+ self . literals . next ( )
869863 }
870864}
871865
@@ -3021,7 +3015,6 @@ impl<'a> State<'a> {
30213015 let next = next_pos. unwrap_or ( cmnt. pos + BytePos ( 1 ) ) ;
30223016 if span. hi < cmnt. pos && cmnt. pos < next && span_line. line == comment_line. line {
30233017 self . print_comment ( cmnt) ?;
3024- self . cur_cmnt_and_lit . cur_cmnt += 1 ;
30253018 }
30263019 }
30273020 Ok ( ( ) )
@@ -3035,7 +3028,6 @@ impl<'a> State<'a> {
30353028 }
30363029 while let Some ( ref cmnt) = self . next_comment ( ) {
30373030 self . print_comment ( cmnt) ?;
3038- self . cur_cmnt_and_lit . cur_cmnt += 1 ;
30393031 }
30403032 Ok ( ( ) )
30413033 }
0 commit comments