@@ -9,6 +9,8 @@ impl<'a> StringReader<'a> {
99 crate fn into_token_trees ( self ) -> ( PResult < ' a , TokenStream > , Vec < UnmatchedBrace > ) {
1010 let mut tt_reader = TokenTreesReader {
1111 string_reader : self ,
12+ token : token:: Eof ,
13+ span : syntax_pos:: DUMMY_SP ,
1214 open_braces : Vec :: new ( ) ,
1315 unmatched_braces : Vec :: new ( ) ,
1416 matching_delim_spans : Vec :: new ( ) ,
@@ -21,6 +23,8 @@ impl<'a> StringReader<'a> {
2123
2224struct TokenTreesReader < ' a > {
2325 string_reader : StringReader < ' a > ,
26+ token : token:: Token ,
27+ span : Span ,
2428 /// Stack of open delimiters and their spans. Used for error message.
2529 open_braces : Vec < ( token:: DelimToken , Span ) > ,
2630 unmatched_braces : Vec < UnmatchedBrace > ,
@@ -36,7 +40,8 @@ impl<'a> TokenTreesReader<'a> {
3640 fn parse_all_token_trees ( & mut self ) -> PResult < ' a , TokenStream > {
3741 let mut tts = Vec :: new ( ) ;
3842
39- while self . string_reader . token != token:: Eof {
43+ self . real_token ( ) ;
44+ while self . token != token:: Eof {
4045 tts. push ( self . parse_token_tree ( ) ?) ;
4146 }
4247
@@ -47,7 +52,7 @@ impl<'a> TokenTreesReader<'a> {
4752 fn parse_token_trees_until_close_delim ( & mut self ) -> TokenStream {
4853 let mut tts = vec ! [ ] ;
4954 loop {
50- if let token:: CloseDelim ( ..) = self . string_reader . token {
55+ if let token:: CloseDelim ( ..) = self . token {
5156 return TokenStream :: new ( tts) ;
5257 }
5358
@@ -63,11 +68,11 @@ impl<'a> TokenTreesReader<'a> {
6368
6469 fn parse_token_tree ( & mut self ) -> PResult < ' a , TreeAndJoint > {
6570 let sm = self . string_reader . sess . source_map ( ) ;
66- match self . string_reader . token {
71+ match self . token {
6772 token:: Eof => {
6873 let msg = "this file contains an un-closed delimiter" ;
6974 let mut err = self . string_reader . sess . span_diagnostic
70- . struct_span_err ( self . span ( ) , msg) ;
75+ . struct_span_err ( self . span , msg) ;
7176 for & ( _, sp) in & self . open_braces {
7277 err. span_label ( sp, "un-closed delimiter" ) ;
7378 }
@@ -97,21 +102,21 @@ impl<'a> TokenTreesReader<'a> {
97102 } ,
98103 token:: OpenDelim ( delim) => {
99104 // The span for beginning of the delimited section
100- let pre_span = self . span ( ) ;
105+ let pre_span = self . span ;
101106
102107 // 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 ( ) ;
105110
106111 // Parse the token trees within the delimiters.
107112 // We stop at any delimiter so we can try to recover if the user
108113 // uses an incorrect delimiter.
109114 let tts = self . parse_token_trees_until_close_delim ( ) ;
110115
111116 // 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 ) ;
113118
114- match self . string_reader . token {
119+ match self . token {
115120 // Correct delimiter.
116121 token:: CloseDelim ( d) if d == delim => {
117122 let ( open_brace, open_brace_span) = self . open_braces . pop ( ) . unwrap ( ) ;
@@ -121,26 +126,26 @@ impl<'a> TokenTreesReader<'a> {
121126 self . matching_delim_spans . clear ( ) ;
122127 } else {
123128 self . matching_delim_spans . push (
124- ( open_brace, open_brace_span, self . span ( ) ) ,
129+ ( open_brace, open_brace_span, self . span ) ,
125130 ) ;
126131 }
127132 // Parse the close delimiter.
128- self . string_reader . real_token ( ) ;
133+ self . real_token ( ) ;
129134 }
130135 // Incorrect delimiter.
131136 token:: CloseDelim ( other) => {
132137 let mut unclosed_delimiter = None ;
133138 let mut candidate = None ;
134- if self . last_unclosed_found_span != Some ( self . span ( ) ) {
139+ if self . last_unclosed_found_span != Some ( self . span ) {
135140 // 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 ) ;
137142 // This is a conservative error: only report the last unclosed
138143 // delimiter. The previous unclosed delimiters could actually be
139144 // closed! The parser just hasn't gotten to them yet.
140145 if let Some ( & ( _, sp) ) = self . open_braces . last ( ) {
141146 unclosed_delimiter = Some ( sp) ;
142147 } ;
143- if let Some ( current_padding) = sm. span_to_margin ( self . span ( ) ) {
148+ if let Some ( current_padding) = sm. span_to_margin ( self . span ) {
144149 for ( brace, brace_span) in & self . open_braces {
145150 if let Some ( padding) = sm. span_to_margin ( * brace_span) {
146151 // high likelihood of these two corresponding
@@ -154,7 +159,7 @@ impl<'a> TokenTreesReader<'a> {
154159 self . unmatched_braces . push ( UnmatchedBrace {
155160 expected_delim : tok,
156161 found_delim : other,
157- found_span : self . span ( ) ,
162+ found_span : self . span ,
158163 unclosed_span : unclosed_delimiter,
159164 candidate_span : candidate,
160165 } ) ;
@@ -170,7 +175,7 @@ impl<'a> TokenTreesReader<'a> {
170175 // bar(baz(
171176 // } // Incorrect delimiter but matches the earlier `{`
172177 if !self . open_braces . iter ( ) . any ( |& ( b, _) | b == other) {
173- self . string_reader . real_token ( ) ;
178+ self . real_token ( ) ;
174179 }
175180 }
176181 token:: Eof => {
@@ -190,28 +195,31 @@ impl<'a> TokenTreesReader<'a> {
190195 token:: CloseDelim ( _) => {
191196 // An unexpected closing delimiter (i.e., there is no
192197 // matching opening delimiter).
193- let token_str = token_to_string ( & self . string_reader . token ) ;
198+ let token_str = token_to_string ( & self . token ) ;
194199 let msg = format ! ( "unexpected close delimiter: `{}`" , token_str) ;
195200 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" ) ;
198203 Err ( err)
199204 } ,
200205 _ => {
201- let tt = TokenTree :: Token ( self . span ( ) , self . string_reader . token . clone ( ) ) ;
206+ let tt = TokenTree :: Token ( self . span , self . token . clone ( ) ) ;
202207 // Note that testing for joint-ness here is done via the raw
203208 // source span as the joint-ness is a property of the raw source
204209 // 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 ) ;
209214 Ok ( ( tt, if is_joint { Joint } else { NonJoint } ) )
210215 }
211216 }
212217 }
213218
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 ;
216223 }
217224}
225+
0 commit comments