@@ -9,6 +9,8 @@ impl<'a> StringReader<'a> {
9
9
crate fn into_token_trees ( self ) -> ( PResult < ' a , TokenStream > , Vec < UnmatchedBrace > ) {
10
10
let mut tt_reader = TokenTreesReader {
11
11
string_reader : self ,
12
+ token : token:: Eof ,
13
+ span : syntax_pos:: DUMMY_SP ,
12
14
open_braces : Vec :: new ( ) ,
13
15
unmatched_braces : Vec :: new ( ) ,
14
16
matching_delim_spans : Vec :: new ( ) ,
@@ -21,6 +23,8 @@ impl<'a> StringReader<'a> {
21
23
22
24
struct TokenTreesReader < ' a > {
23
25
string_reader : StringReader < ' a > ,
26
+ token : token:: Token ,
27
+ span : Span ,
24
28
/// Stack of open delimiters and their spans. Used for error message.
25
29
open_braces : Vec < ( token:: DelimToken , Span ) > ,
26
30
unmatched_braces : Vec < UnmatchedBrace > ,
@@ -36,7 +40,8 @@ impl<'a> TokenTreesReader<'a> {
36
40
fn parse_all_token_trees ( & mut self ) -> PResult < ' a , TokenStream > {
37
41
let mut tts = Vec :: new ( ) ;
38
42
39
- while self . string_reader . token != token:: Eof {
43
+ self . real_token ( ) ;
44
+ while self . token != token:: Eof {
40
45
tts. push ( self . parse_token_tree ( ) ?) ;
41
46
}
42
47
@@ -47,7 +52,7 @@ impl<'a> TokenTreesReader<'a> {
47
52
fn parse_token_trees_until_close_delim ( & mut self ) -> TokenStream {
48
53
let mut tts = vec ! [ ] ;
49
54
loop {
50
- if let token:: CloseDelim ( ..) = self . string_reader . token {
55
+ if let token:: CloseDelim ( ..) = self . token {
51
56
return TokenStream :: new ( tts) ;
52
57
}
53
58
@@ -63,11 +68,11 @@ impl<'a> TokenTreesReader<'a> {
63
68
64
69
fn parse_token_tree ( & mut self ) -> PResult < ' a , TreeAndJoint > {
65
70
let sm = self . string_reader . sess . source_map ( ) ;
66
- match self . string_reader . token {
71
+ match self . token {
67
72
token:: Eof => {
68
73
let msg = "this file contains an un-closed delimiter" ;
69
74
let mut err = self . string_reader . sess . span_diagnostic
70
- . struct_span_err ( self . span ( ) , msg) ;
75
+ . struct_span_err ( self . span , msg) ;
71
76
for & ( _, sp) in & self . open_braces {
72
77
err. span_label ( sp, "un-closed delimiter" ) ;
73
78
}
@@ -97,21 +102,21 @@ impl<'a> TokenTreesReader<'a> {
97
102
} ,
98
103
token:: OpenDelim ( delim) => {
99
104
// The span for beginning of the delimited section
100
- let pre_span = self . span ( ) ;
105
+ let pre_span = self . span ;
101
106
102
107
// Parse the open delimiter.
103
- self . open_braces . push ( ( delim, self . span ( ) ) ) ;
104
- self . string_reader . real_token ( ) ;
108
+ self . open_braces . push ( ( delim, self . span ) ) ;
109
+ self . real_token ( ) ;
105
110
106
111
// Parse the token trees within the delimiters.
107
112
// We stop at any delimiter so we can try to recover if the user
108
113
// uses an incorrect delimiter.
109
114
let tts = self . parse_token_trees_until_close_delim ( ) ;
110
115
111
116
// Expand to cover the entire delimited token tree
112
- let delim_span = DelimSpan :: from_pair ( pre_span, self . span ( ) ) ;
117
+ let delim_span = DelimSpan :: from_pair ( pre_span, self . span ) ;
113
118
114
- match self . string_reader . token {
119
+ match self . token {
115
120
// Correct delimiter.
116
121
token:: CloseDelim ( d) if d == delim => {
117
122
let ( open_brace, open_brace_span) = self . open_braces . pop ( ) . unwrap ( ) ;
@@ -121,26 +126,26 @@ impl<'a> TokenTreesReader<'a> {
121
126
self . matching_delim_spans . clear ( ) ;
122
127
} else {
123
128
self . matching_delim_spans . push (
124
- ( open_brace, open_brace_span, self . span ( ) ) ,
129
+ ( open_brace, open_brace_span, self . span ) ,
125
130
) ;
126
131
}
127
132
// Parse the close delimiter.
128
- self . string_reader . real_token ( ) ;
133
+ self . real_token ( ) ;
129
134
}
130
135
// Incorrect delimiter.
131
136
token:: CloseDelim ( other) => {
132
137
let mut unclosed_delimiter = None ;
133
138
let mut candidate = None ;
134
- if self . last_unclosed_found_span != Some ( self . span ( ) ) {
139
+ if self . last_unclosed_found_span != Some ( self . span ) {
135
140
// do not complain about the same unclosed delimiter multiple times
136
- self . last_unclosed_found_span = Some ( self . span ( ) ) ;
141
+ self . last_unclosed_found_span = Some ( self . span ) ;
137
142
// This is a conservative error: only report the last unclosed
138
143
// delimiter. The previous unclosed delimiters could actually be
139
144
// closed! The parser just hasn't gotten to them yet.
140
145
if let Some ( & ( _, sp) ) = self . open_braces . last ( ) {
141
146
unclosed_delimiter = Some ( sp) ;
142
147
} ;
143
- if let Some ( current_padding) = sm. span_to_margin ( self . span ( ) ) {
148
+ if let Some ( current_padding) = sm. span_to_margin ( self . span ) {
144
149
for ( brace, brace_span) in & self . open_braces {
145
150
if let Some ( padding) = sm. span_to_margin ( * brace_span) {
146
151
// high likelihood of these two corresponding
@@ -154,7 +159,7 @@ impl<'a> TokenTreesReader<'a> {
154
159
self . unmatched_braces . push ( UnmatchedBrace {
155
160
expected_delim : tok,
156
161
found_delim : other,
157
- found_span : self . span ( ) ,
162
+ found_span : self . span ,
158
163
unclosed_span : unclosed_delimiter,
159
164
candidate_span : candidate,
160
165
} ) ;
@@ -170,7 +175,7 @@ impl<'a> TokenTreesReader<'a> {
170
175
// bar(baz(
171
176
// } // Incorrect delimiter but matches the earlier `{`
172
177
if !self . open_braces . iter ( ) . any ( |& ( b, _) | b == other) {
173
- self . string_reader . real_token ( ) ;
178
+ self . real_token ( ) ;
174
179
}
175
180
}
176
181
token:: Eof => {
@@ -190,28 +195,31 @@ impl<'a> TokenTreesReader<'a> {
190
195
token:: CloseDelim ( _) => {
191
196
// An unexpected closing delimiter (i.e., there is no
192
197
// matching opening delimiter).
193
- let token_str = token_to_string ( & self . string_reader . token ) ;
198
+ let token_str = token_to_string ( & self . token ) ;
194
199
let msg = format ! ( "unexpected close delimiter: `{}`" , token_str) ;
195
200
let mut err = self . string_reader . sess . span_diagnostic
196
- . struct_span_err ( self . span ( ) , & msg) ;
197
- err. span_label ( self . span ( ) , "unexpected close delimiter" ) ;
201
+ . struct_span_err ( self . span , & msg) ;
202
+ err. span_label ( self . span , "unexpected close delimiter" ) ;
198
203
Err ( err)
199
204
} ,
200
205
_ => {
201
- let tt = TokenTree :: Token ( self . span ( ) , self . string_reader . token . clone ( ) ) ;
206
+ let tt = TokenTree :: Token ( self . span , self . token . clone ( ) ) ;
202
207
// Note that testing for joint-ness here is done via the raw
203
208
// source span as the joint-ness is a property of the raw source
204
209
// rather than wanting to take `override_span` into account.
205
- let raw = self . string_reader . span_src_raw ;
206
- self . string_reader . real_token ( ) ;
207
- let is_joint = raw. hi ( ) == self . string_reader . span_src_raw . lo ( )
208
- && token:: is_op ( & self . string_reader . token ) ;
210
+ let raw = self . string_reader . peek_span_src_raw ;
211
+ self . real_token ( ) ;
212
+ let is_joint = raw. hi ( ) == self . string_reader . peek_span_src_raw . lo ( )
213
+ && token:: is_op ( & self . token ) ;
209
214
Ok ( ( tt, if is_joint { Joint } else { NonJoint } ) )
210
215
}
211
216
}
212
217
}
213
218
214
- fn span ( & self ) -> Span {
215
- self . string_reader . span
219
+ fn real_token ( & mut self ) {
220
+ let t = self . string_reader . real_token ( ) ;
221
+ self . token = t. tok ;
222
+ self . span = t. sp ;
216
223
}
217
224
}
225
+
0 commit comments