@@ -414,27 +414,30 @@ impl<'a> StringReader<'a> {
414
414
/// Advance the StringReader by one character. If a newline is
415
415
/// discovered, add it to the FileMap's list of line start offsets.
416
416
pub fn bump ( & mut self ) {
417
- self . pos = self . next_pos ;
418
- let current_byte_offset = self . byte_offset ( self . next_pos ) . to_usize ( ) ;
419
- if current_byte_offset < self . source_text . len ( ) {
420
- let last_char = self . ch . unwrap ( ) ;
421
- let ch = char_at ( & self . source_text , current_byte_offset) ;
422
- let byte_offset_diff = ch. len_utf8 ( ) ;
423
- self . next_pos = self . next_pos + Pos :: from_usize ( byte_offset_diff) ;
424
- self . ch = Some ( ch) ;
425
- self . col = self . col + CharPos ( 1 ) ;
426
- if last_char == '\n' {
417
+ let new_pos = self . next_pos ;
418
+ let new_byte_offset = self . byte_offset ( new_pos) . to_usize ( ) ;
419
+ if new_byte_offset < self . source_text . len ( ) {
420
+ let old_ch_is_newline = self . ch . unwrap ( ) == '\n' ;
421
+ let new_ch = char_at ( & self . source_text , new_byte_offset) ;
422
+ let new_ch_len = new_ch. len_utf8 ( ) ;
423
+
424
+ self . ch = Some ( new_ch) ;
425
+ self . pos = new_pos;
426
+ self . next_pos = new_pos + Pos :: from_usize ( new_ch_len) ;
427
+ if old_ch_is_newline {
427
428
if self . save_new_lines {
428
429
self . filemap . next_line ( self . pos ) ;
429
430
}
430
431
self . col = CharPos ( 0 ) ;
432
+ } else {
433
+ self . col = self . col + CharPos ( 1 ) ;
431
434
}
432
-
433
- if byte_offset_diff > 1 {
434
- self . filemap . record_multibyte_char ( self . pos , byte_offset_diff) ;
435
+ if new_ch_len > 1 {
436
+ self . filemap . record_multibyte_char ( self . pos , new_ch_len) ;
435
437
}
436
438
} else {
437
439
self . ch = None ;
440
+ self . pos = new_pos;
438
441
}
439
442
}
440
443
0 commit comments