@@ -62,7 +62,10 @@ pub(super) fn parse(
62
62
match tree {
63
63
TokenTree :: MetaVar ( start_sp, ident) if parsing_patterns => {
64
64
let span = match trees. next ( ) {
65
- Some ( & tokenstream:: TokenTree :: Token ( Token { kind : token:: Colon , span } , _) ) => {
65
+ Some ( & tokenstream:: TokenTree :: Token (
66
+ Token { kind : token:: Colon , span : colon_span } ,
67
+ _,
68
+ ) ) => {
66
69
match trees. next ( ) {
67
70
Some ( tokenstream:: TokenTree :: Token ( token, _) ) => match token. ident ( ) {
68
71
Some ( ( fragment, _) ) => {
@@ -126,10 +129,12 @@ pub(super) fn parse(
126
129
}
127
130
_ => token. span ,
128
131
} ,
129
- tree => tree. map_or ( span, tokenstream:: TokenTree :: span) ,
132
+ Some ( tree) => tree. span ( ) ,
133
+ None => colon_span,
130
134
}
131
135
}
132
- tree => tree. map_or ( start_sp, tokenstream:: TokenTree :: span) ,
136
+ Some ( tree) => tree. span ( ) ,
137
+ None => start_sp,
133
138
} ;
134
139
135
140
result. push ( TokenTree :: MetaVarDecl ( span, ident, None ) ) ;
@@ -176,7 +181,7 @@ fn parse_tree<'a>(
176
181
// Depending on what `tree` is, we could be parsing different parts of a macro
177
182
match tree {
178
183
// `tree` is a `$` token. Look at the next token in `trees`
179
- & tokenstream:: TokenTree :: Token ( Token { kind : token:: Dollar , span } , _) => {
184
+ & tokenstream:: TokenTree :: Token ( Token { kind : token:: Dollar , span : dollar_span } , _) => {
180
185
// FIXME: Handle `Invisible`-delimited groups in a more systematic way
181
186
// during parsing.
182
187
let mut next = outer_trees. next ( ) ;
@@ -209,7 +214,7 @@ fn parse_tree<'a>(
209
214
err. emit ( ) ;
210
215
// Returns early the same read `$` to avoid spanning
211
216
// unrelated diagnostics that could be performed afterwards
212
- return TokenTree :: token ( token:: Dollar , span ) ;
217
+ return TokenTree :: token ( token:: Dollar , dollar_span ) ;
213
218
}
214
219
Ok ( elem) => {
215
220
maybe_emit_macro_metavar_expr_feature (
@@ -251,7 +256,7 @@ fn parse_tree<'a>(
251
256
// special metavariable that names the crate of the invocation.
252
257
Some ( tokenstream:: TokenTree :: Token ( token, _) ) if token. is_ident ( ) => {
253
258
let ( ident, is_raw) = token. ident ( ) . unwrap ( ) ;
254
- let span = ident. span . with_lo ( span . lo ( ) ) ;
259
+ let span = ident. span . with_lo ( dollar_span . lo ( ) ) ;
255
260
if ident. name == kw:: Crate && matches ! ( is_raw, IdentIsRaw :: No ) {
256
261
TokenTree :: token ( token:: Ident ( kw:: DollarCrate , is_raw) , span)
257
262
} else {
@@ -260,16 +265,19 @@ fn parse_tree<'a>(
260
265
}
261
266
262
267
// `tree` is followed by another `$`. This is an escaped `$`.
263
- Some ( & tokenstream:: TokenTree :: Token ( Token { kind : token:: Dollar , span } , _) ) => {
268
+ Some ( & tokenstream:: TokenTree :: Token (
269
+ Token { kind : token:: Dollar , span : dollar_span2 } ,
270
+ _,
271
+ ) ) => {
264
272
if parsing_patterns {
265
273
span_dollar_dollar_or_metavar_in_the_lhs_err (
266
274
sess,
267
- & Token { kind : token:: Dollar , span } ,
275
+ & Token { kind : token:: Dollar , span : dollar_span2 } ,
268
276
) ;
269
277
} else {
270
- maybe_emit_macro_metavar_expr_feature ( features, sess, span ) ;
278
+ maybe_emit_macro_metavar_expr_feature ( features, sess, dollar_span2 ) ;
271
279
}
272
- TokenTree :: token ( token:: Dollar , span )
280
+ TokenTree :: token ( token:: Dollar , dollar_span2 )
273
281
}
274
282
275
283
// `tree` is followed by some other token. This is an error.
@@ -281,7 +289,7 @@ fn parse_tree<'a>(
281
289
}
282
290
283
291
// There are no more tokens. Just return the `$` we already have.
284
- None => TokenTree :: token ( token:: Dollar , span ) ,
292
+ None => TokenTree :: token ( token:: Dollar , dollar_span ) ,
285
293
}
286
294
}
287
295
0 commit comments