@@ -61,7 +61,7 @@ pub struct StringReader<'a> {
61
61
pub fatal_errs : Vec < DiagnosticBuilder < ' a > > ,
62
62
// cache a direct reference to the source text, so that we don't have to
63
63
// retrieve it via `self.filemap.src.as_ref().unwrap()` all the time.
64
- source_text : Lrc < String > ,
64
+ src : Lrc < String > ,
65
65
/// Stack of open delimiters and their spans. Used for error message.
66
66
token : token:: Token ,
67
67
span : Span ,
@@ -176,7 +176,7 @@ impl<'a> StringReader<'a> {
176
176
filemap. name) ) ;
177
177
}
178
178
179
- let source_text = ( * filemap. src . as_ref ( ) . unwrap ( ) ) . clone ( ) ;
179
+ let src = ( * filemap. src . as_ref ( ) . unwrap ( ) ) . clone ( ) ;
180
180
181
181
StringReader {
182
182
sess,
@@ -190,7 +190,7 @@ impl<'a> StringReader<'a> {
190
190
// dummy values; not read
191
191
peek_tok : token:: Eof ,
192
192
peek_span : syntax_pos:: DUMMY_SP ,
193
- source_text ,
193
+ src ,
194
194
fatal_errs : Vec :: new ( ) ,
195
195
token : token:: Eof ,
196
196
span : syntax_pos:: DUMMY_SP ,
@@ -326,9 +326,7 @@ impl<'a> StringReader<'a> {
326
326
/// offending string to the error message
327
327
fn fatal_span_verbose ( & self , from_pos : BytePos , to_pos : BytePos , mut m : String ) -> FatalError {
328
328
m. push_str ( ": " ) ;
329
- let from = self . byte_offset ( from_pos) . to_usize ( ) ;
330
- let to = self . byte_offset ( to_pos) . to_usize ( ) ;
331
- m. push_str ( & self . source_text [ from..to] ) ;
329
+ m. push_str ( & self . src [ self . src_index ( from_pos) ..self . src_index ( to_pos) ] ) ;
332
330
self . fatal_span_ ( from_pos, to_pos, & m[ ..] )
333
331
}
334
332
@@ -354,8 +352,9 @@ impl<'a> StringReader<'a> {
354
352
Ok ( ( ) )
355
353
}
356
354
357
- fn byte_offset ( & self , pos : BytePos ) -> BytePos {
358
- ( pos - self . filemap . start_pos )
355
+ #[ inline]
356
+ fn src_index ( & self , pos : BytePos ) -> usize {
357
+ ( pos - self . filemap . start_pos ) . to_usize ( )
359
358
}
360
359
361
360
/// Calls `f` with a string slice of the source text spanning from `start`
@@ -386,7 +385,7 @@ impl<'a> StringReader<'a> {
386
385
fn with_str_from_to < T , F > ( & self , start : BytePos , end : BytePos , f : F ) -> T
387
386
where F : FnOnce ( & str ) -> T
388
387
{
389
- f ( & self . source_text [ self . byte_offset ( start) . to_usize ( ) .. self . byte_offset ( end) . to_usize ( ) ] )
388
+ f ( & self . src [ self . src_index ( start) .. self . src_index ( end) ] )
390
389
}
391
390
392
391
/// Converts CRLF to LF in the given string, raising an error on bare CR.
@@ -438,16 +437,13 @@ impl<'a> StringReader<'a> {
438
437
}
439
438
}
440
439
441
-
442
440
/// Advance the StringReader by one character. If a newline is
443
441
/// discovered, add it to the FileMap's list of line start offsets.
444
442
pub fn bump ( & mut self ) {
445
- let next_byte_offset = self . byte_offset ( self . next_pos ) . to_usize ( ) ;
446
- let end = self . terminator . map_or ( self . source_text . len ( ) , |t| {
447
- self . byte_offset ( t) . to_usize ( )
448
- } ) ;
449
- if next_byte_offset < end {
450
- let next_ch = char_at ( & self . source_text , next_byte_offset) ;
443
+ let next_src_index = self . src_index ( self . next_pos ) ;
444
+ let end_src_index = self . terminator . map_or ( self . src . len ( ) , |t| self . src_index ( t) ) ;
445
+ if next_src_index < end_src_index {
446
+ let next_ch = char_at ( & self . src , next_src_index) ;
451
447
let next_ch_len = next_ch. len_utf8 ( ) ;
452
448
453
449
if self . ch . unwrap ( ) == '\n' {
@@ -475,9 +471,9 @@ impl<'a> StringReader<'a> {
475
471
}
476
472
477
473
pub fn nextch ( & self ) -> Option < char > {
478
- let offset = self . byte_offset ( self . next_pos ) . to_usize ( ) ;
479
- if offset < self . source_text . len ( ) {
480
- Some ( char_at ( & self . source_text , offset ) )
474
+ let next_src_index = self . src_index ( self . next_pos ) ;
475
+ if next_src_index < self . src . len ( ) {
476
+ Some ( char_at ( & self . src , next_src_index ) )
481
477
} else {
482
478
None
483
479
}
@@ -488,14 +484,14 @@ impl<'a> StringReader<'a> {
488
484
}
489
485
490
486
pub fn nextnextch ( & self ) -> Option < char > {
491
- let offset = self . byte_offset ( self . next_pos ) . to_usize ( ) ;
492
- let s = & self . source_text [ ..] ;
493
- if offset >= s. len ( ) {
487
+ let next_src_index = self . src_index ( self . next_pos ) ;
488
+ let s = & self . src [ ..] ;
489
+ if next_src_index >= s. len ( ) {
494
490
return None ;
495
491
}
496
- let next = offset + char_at ( s, offset ) . len_utf8 ( ) ;
497
- if next < s. len ( ) {
498
- Some ( char_at ( s, next ) )
492
+ let next_next_src_index = next_src_index + char_at ( s, next_src_index ) . len_utf8 ( ) ;
493
+ if next_next_src_index < s. len ( ) {
494
+ Some ( char_at ( s, next_next_src_index ) )
499
495
} else {
500
496
None
501
497
}
@@ -1358,8 +1354,8 @@ impl<'a> StringReader<'a> {
1358
1354
loop {
1359
1355
self . bump ( ) ;
1360
1356
if self . ch_is ( '\'' ) {
1361
- let start = self . byte_offset ( start) . to_usize ( ) ;
1362
- let end = self . byte_offset ( self . pos ) . to_usize ( ) ;
1357
+ let start = self . src_index ( start) ;
1358
+ let end = self . src_index ( self . pos ) ;
1363
1359
self . bump ( ) ;
1364
1360
let span = self . mk_sp ( start_with_quote, self . pos ) ;
1365
1361
self . sess . span_diagnostic
@@ -1368,8 +1364,7 @@ impl<'a> StringReader<'a> {
1368
1364
. span_suggestion ( span,
1369
1365
"if you meant to write a `str` literal, \
1370
1366
use double quotes",
1371
- format ! ( "\" {}\" " ,
1372
- & self . source_text[ start..end] ) )
1367
+ format ! ( "\" {}\" " , & self . src[ start..end] ) )
1373
1368
. emit ( ) ;
1374
1369
return Ok ( token:: Literal ( token:: Str_ ( Symbol :: intern ( "??" ) ) , None ) )
1375
1370
}
0 commit comments