@@ -167,14 +167,9 @@ pub enum Token {
167
167
Break ( BreakToken ) ,
168
168
Begin ( BeginToken ) ,
169
169
End ,
170
- Eof ,
171
170
}
172
171
173
172
impl Token {
174
- crate fn is_eof ( & self ) -> bool {
175
- matches ! ( self , Token :: Eof )
176
- }
177
-
178
173
pub fn is_hardbreak_tok ( & self ) -> bool {
179
174
matches ! ( self , Token :: Break ( BreakToken { offset: 0 , blank_space: SIZE_INFINITY } ) )
180
175
}
@@ -187,7 +182,6 @@ impl fmt::Display for Token {
187
182
Token :: Break ( _) => f. write_str ( "BREAK" ) ,
188
183
Token :: Begin ( _) => f. write_str ( "BEGIN" ) ,
189
184
Token :: End => f. write_str ( "END" ) ,
190
- Token :: Eof => f. write_str ( "EOF" ) ,
191
185
}
192
186
}
193
187
}
@@ -233,6 +227,9 @@ pub struct Printer {
233
227
print_stack : Vec < PrintStackElem > ,
234
228
/// Buffered indentation to avoid writing trailing whitespace
235
229
pending_indentation : isize ,
230
+ /// The token most recently popped from the left boundary of the
231
+ /// ring-buffer for printing
232
+ last_printed : Option < Token > ,
236
233
}
237
234
238
235
#[ derive( Clone ) ]
@@ -241,39 +238,36 @@ struct BufEntry {
241
238
size : isize ,
242
239
}
243
240
244
- impl Default for BufEntry {
245
- fn default ( ) -> Self {
246
- BufEntry { token : Token :: Eof , size : 0 }
247
- }
248
- }
249
-
250
241
impl Printer {
251
242
pub fn new ( ) -> Self {
252
243
let linewidth = 78 ;
253
- let mut buf = RingBuffer :: new ( ) ;
254
- buf. advance_right ( ) ;
255
244
Printer {
256
245
out : String :: new ( ) ,
257
246
margin : linewidth as isize ,
258
247
space : linewidth as isize ,
259
248
left : 0 ,
260
249
right : 0 ,
261
- buf,
250
+ buf : RingBuffer :: new ( ) ,
262
251
left_total : 0 ,
263
252
right_total : 0 ,
264
253
scan_stack : VecDeque :: new ( ) ,
265
254
print_stack : Vec :: new ( ) ,
266
255
pending_indentation : 0 ,
256
+ last_printed : None ,
267
257
}
268
258
}
269
259
270
- pub fn last_token ( & self ) -> Token {
271
- self . buf [ self . right ] . token . clone ( )
260
+ pub fn last_token ( & self ) -> Option < & Token > {
261
+ self . last_token_still_buffered ( ) . or_else ( || self . last_printed . as_ref ( ) )
262
+ }
263
+
264
+ pub fn last_token_still_buffered ( & self ) -> Option < & Token > {
265
+ self . buf . last ( ) . map ( |last| & last. token )
272
266
}
273
267
274
268
/// Be very careful with this!
275
- pub fn replace_last_token ( & mut self , t : Token ) {
276
- self . buf [ self . right ] . token = t;
269
+ pub fn replace_last_token_still_buffered ( & mut self , t : Token ) {
270
+ self . buf . last_mut ( ) . unwrap ( ) . token = t;
277
271
}
278
272
279
273
fn scan_eof ( & mut self ) {
@@ -323,7 +317,7 @@ impl Printer {
323
317
324
318
fn scan_string ( & mut self , s : Cow < ' static , str > ) {
325
319
if self . scan_stack . is_empty ( ) {
326
- self . print_string ( s) ;
320
+ self . print_string ( & s) ;
327
321
} else {
328
322
self . right += 1 ;
329
323
let len = s. len ( ) as isize ;
@@ -459,7 +453,7 @@ impl Printer {
459
453
}
460
454
}
461
455
462
- fn print_string ( & mut self , s : Cow < ' static , str > ) {
456
+ fn print_string ( & mut self , s : & str ) {
463
457
let len = s. len ( ) as isize ;
464
458
// assert!(len <= space);
465
459
self . space -= len;
@@ -473,21 +467,21 @@ impl Printer {
473
467
self . out . reserve ( self . pending_indentation as usize ) ;
474
468
self . out . extend ( std:: iter:: repeat ( ' ' ) . take ( self . pending_indentation as usize ) ) ;
475
469
self . pending_indentation = 0 ;
476
- self . out . push_str ( & s) ;
470
+ self . out . push_str ( s) ;
477
471
}
478
472
479
473
fn print ( & mut self , token : Token , l : isize ) {
480
- match token {
481
- Token :: Begin ( b) => self . print_begin ( b, l) ,
474
+ match & token {
475
+ Token :: Begin ( b) => self . print_begin ( * b, l) ,
482
476
Token :: End => self . print_end ( ) ,
483
- Token :: Break ( b) => self . print_break ( b, l) ,
477
+ Token :: Break ( b) => self . print_break ( * b, l) ,
484
478
Token :: String ( s) => {
485
479
let len = s. len ( ) as isize ;
486
480
assert_eq ! ( len, l) ;
487
481
self . print_string ( s) ;
488
482
}
489
- Token :: Eof => panic ! ( ) , // Eof should never get here.
490
483
}
484
+ self . last_printed = Some ( token) ;
491
485
}
492
486
493
487
// Convenience functions to talk to the printer.
@@ -542,7 +536,10 @@ impl Printer {
542
536
}
543
537
544
538
pub fn is_beginning_of_line ( & self ) -> bool {
545
- self . last_token ( ) . is_eof ( ) || self . last_token ( ) . is_hardbreak_tok ( )
539
+ match self . last_token ( ) {
540
+ Some ( last_token) => last_token. is_hardbreak_tok ( ) ,
541
+ None => true ,
542
+ }
546
543
}
547
544
548
545
pub fn hardbreak_tok_offset ( off : isize ) -> Token {
0 commit comments