@@ -38,8 +38,6 @@ pub struct StringReader<'a> {
38
38
crate source_file : Lrc < syntax_pos:: SourceFile > ,
39
39
/// Stop reading src at this index.
40
40
crate end_src_index : usize ,
41
- // cached:
42
- peek_span_src_raw : Span ,
43
41
fatal_errs : Vec < DiagnosticBuilder < ' a > > ,
44
42
// cache a direct reference to the source text, so that we don't have to
45
43
// retrieve it via `self.source_file.src.as_ref().unwrap()` all the time.
@@ -59,7 +57,7 @@ impl<'a> StringReader<'a> {
59
57
( real, raw)
60
58
}
61
59
62
- fn unwrap_or_abort ( & mut self , res : Result < Token , ( ) > ) -> Token {
60
+ fn unwrap_or_abort < T > ( & mut self , res : Result < T , ( ) > ) -> T {
63
61
match res {
64
62
Ok ( tok) => tok,
65
63
Err ( _) => {
@@ -69,36 +67,52 @@ impl<'a> StringReader<'a> {
69
67
}
70
68
}
71
69
72
- fn next_token ( & mut self ) -> Token where Self : Sized {
73
- let res = self . try_next_token ( ) ;
74
- self . unwrap_or_abort ( res)
75
- }
76
-
77
70
/// Returns the next token. EFFECT: advances the string_reader.
78
71
pub fn try_next_token ( & mut self ) -> Result < Token , ( ) > {
79
- assert ! ( self . fatal_errs . is_empty ( ) ) ;
80
- self . advance_token ( )
72
+ let ( token , _raw_span ) = self . try_next_token_with_raw_span ( ) ? ;
73
+ Ok ( token )
81
74
}
82
75
83
- fn try_real_token ( & mut self ) -> Result < Token , ( ) > {
84
- let mut t = self . try_next_token ( ) ?;
76
+ pub fn next_token ( & mut self ) -> Token {
77
+ let res = self . try_next_token ( ) ;
78
+ self . unwrap_or_abort ( res)
79
+ }
80
+
81
+ fn try_real_token ( & mut self ) -> Result < ( Token , Span ) , ( ) > {
85
82
loop {
86
- match t. kind {
87
- token:: Whitespace | token:: Comment | token:: Shebang ( _) => {
88
- t = self . try_next_token ( ) ?;
89
- }
90
- _ => break ,
83
+ let t = self . try_next_token_with_raw_span ( ) ?;
84
+ match t. 0 . kind {
85
+ token:: Whitespace | token:: Comment | token:: Shebang ( _) => continue ,
86
+ _ => return Ok ( t) ,
91
87
}
92
88
}
93
-
94
- Ok ( t)
95
89
}
96
90
97
- pub fn real_token ( & mut self ) -> Token {
91
+ fn real_token ( & mut self ) -> ( Token , Span ) {
98
92
let res = self . try_real_token ( ) ;
99
93
self . unwrap_or_abort ( res)
100
94
}
101
95
96
+ fn try_next_token_with_raw_span ( & mut self ) -> Result < ( Token , Span ) , ( ) > {
97
+ assert ! ( self . fatal_errs. is_empty( ) ) ;
98
+ match self . scan_whitespace_or_comment ( ) {
99
+ Some ( comment) => {
100
+ let raw_span = comment. span ;
101
+ Ok ( ( comment, raw_span) )
102
+ }
103
+ None => {
104
+ let ( kind, start_pos, end_pos) = if self . is_eof ( ) {
105
+ ( token:: Eof , self . source_file . end_pos , self . source_file . end_pos )
106
+ } else {
107
+ let start_pos = self . pos ;
108
+ ( self . next_token_inner ( ) ?, start_pos, self . pos )
109
+ } ;
110
+ let ( real, raw) = self . mk_sp_and_raw ( start_pos, end_pos) ;
111
+ Ok ( ( Token :: new ( kind, real) , raw) )
112
+ }
113
+ }
114
+ }
115
+
102
116
#[ inline]
103
117
fn is_eof ( & self ) -> bool {
104
118
self . ch . is_none ( )
@@ -141,7 +155,6 @@ impl<'a> StringReader<'a> {
141
155
override_span : Option < Span > ) -> Self {
142
156
let mut sr = StringReader :: new_raw_internal ( sess, source_file, override_span) ;
143
157
sr. bump ( ) ;
144
-
145
158
sr
146
159
}
147
160
@@ -162,7 +175,6 @@ impl<'a> StringReader<'a> {
162
175
ch : Some ( '\n' ) ,
163
176
source_file,
164
177
end_src_index : src. len ( ) ,
165
- peek_span_src_raw : syntax_pos:: DUMMY_SP ,
166
178
src,
167
179
fatal_errs : Vec :: new ( ) ,
168
180
override_span,
@@ -172,12 +184,8 @@ impl<'a> StringReader<'a> {
172
184
pub fn new_or_buffered_errs ( sess : & ' a ParseSess ,
173
185
source_file : Lrc < syntax_pos:: SourceFile > ,
174
186
override_span : Option < Span > ) -> Result < Self , Vec < Diagnostic > > {
175
- let mut sr = StringReader :: new_raw ( sess, source_file, override_span) ;
176
- if sr. advance_token ( ) . is_err ( ) {
177
- Err ( sr. buffer_fatal_errors ( ) )
178
- } else {
179
- Ok ( sr)
180
- }
187
+ let sr = StringReader :: new_raw ( sess, source_file, override_span) ;
188
+ Ok ( sr)
181
189
}
182
190
183
191
pub fn retokenize ( sess : & ' a ParseSess , mut span : Span ) -> Self {
@@ -197,11 +205,6 @@ impl<'a> StringReader<'a> {
197
205
198
206
sr. bump ( ) ;
199
207
200
- if sr. advance_token ( ) . is_err ( ) {
201
- sr. emit_fatal_errors ( ) ;
202
- FatalError . raise ( ) ;
203
- }
204
-
205
208
sr
206
209
}
207
210
@@ -257,28 +260,6 @@ impl<'a> StringReader<'a> {
257
260
self . sess . span_diagnostic . struct_span_fatal ( self . mk_sp ( from_pos, to_pos) , & m[ ..] )
258
261
}
259
262
260
- /// Advance peek_token to refer to the next token, and
261
- /// possibly update the interner.
262
- fn advance_token ( & mut self ) -> Result < Token , ( ) > {
263
- match self . scan_whitespace_or_comment ( ) {
264
- Some ( comment) => {
265
- self . peek_span_src_raw = comment. span ;
266
- Ok ( comment)
267
- }
268
- None => {
269
- let ( kind, start_pos, end_pos) = if self . is_eof ( ) {
270
- ( token:: Eof , self . source_file . end_pos , self . source_file . end_pos )
271
- } else {
272
- let start_pos = self . pos ;
273
- ( self . next_token_inner ( ) ?, start_pos, self . pos )
274
- } ;
275
- let ( real, raw) = self . mk_sp_and_raw ( start_pos, end_pos) ;
276
- self . peek_span_src_raw = raw;
277
- Ok ( Token :: new ( kind, real) )
278
- }
279
- }
280
- }
281
-
282
263
#[ inline]
283
264
fn src_index ( & self , pos : BytePos ) -> usize {
284
265
( pos - self . source_file . start_pos ) . to_usize ( )
@@ -1447,12 +1428,7 @@ mod tests {
1447
1428
teststr : String )
1448
1429
-> StringReader < ' a > {
1449
1430
let sf = sm. new_source_file ( PathBuf :: from ( teststr. clone ( ) ) . into ( ) , teststr) ;
1450
- let mut sr = StringReader :: new_raw ( sess, sf, None ) ;
1451
- if sr. advance_token ( ) . is_err ( ) {
1452
- sr. emit_fatal_errors ( ) ;
1453
- FatalError . raise ( ) ;
1454
- }
1455
- sr
1431
+ StringReader :: new_raw ( sess, sf, None )
1456
1432
}
1457
1433
1458
1434
#[ test]
0 commit comments