@@ -46,7 +46,7 @@ impl Delimited {
46
46
} else {
47
47
span. with_lo ( span. lo ( ) + BytePos ( self . delim . len ( ) as u32 ) )
48
48
} ;
49
- TokenTree :: Token ( open_span, self . open_token ( ) , false )
49
+ TokenTree :: Token ( open_span, self . open_token ( ) , TokenHygiene :: DefSite )
50
50
}
51
51
52
52
/// Return a `self::TokenTree` with a `Span` corresponding to the closing delimiter.
@@ -56,7 +56,7 @@ impl Delimited {
56
56
} else {
57
57
span. with_lo ( span. hi ( ) - BytePos ( self . delim . len ( ) as u32 ) )
58
58
} ;
59
- TokenTree :: Token ( close_span, self . close_token ( ) , false )
59
+ TokenTree :: Token ( close_span, self . close_token ( ) , TokenHygiene :: DefSite )
60
60
}
61
61
}
62
62
@@ -88,20 +88,12 @@ pub enum KleeneOp {
88
88
/// are "first-class" token trees. Useful for parsing macros.
89
89
#[ derive( Debug , Clone , PartialEq , Eq , RustcEncodable , RustcDecodable , Hash ) ]
90
90
pub enum TokenTree {
91
- Token (
92
- Span ,
93
- token:: Token ,
94
- bool , /* escape hygiene */
95
- ) ,
91
+ Token ( Span , token:: Token , TokenHygiene ) ,
96
92
Delimited ( Span , Lrc < Delimited > ) ,
97
93
/// A Kleene-style repetition sequence
98
94
Sequence ( Span , Lrc < SequenceRepetition > ) ,
99
95
/// E.g. `$var`
100
- MetaVar (
101
- Span ,
102
- ast:: Ident ,
103
- bool , /* escape hygiene */
104
- ) ,
96
+ MetaVar ( Span , ast:: Ident , TokenHygiene ) ,
105
97
/// E.g. `$var:expr`. This is only used in the left hand side of MBE macros.
106
98
MetaVarDecl (
107
99
Span ,
@@ -168,6 +160,13 @@ impl TokenTree {
168
160
}
169
161
}
170
162
163
+ /// Syntaxt context to apply to a token when invoking a macro.
164
+ #[ derive( Clone , PartialEq , Eq , RustcEncodable , RustcDecodable , Hash , Debug , Copy ) ]
165
+ pub enum TokenHygiene {
166
+ DefSite ,
167
+ CallSite ,
168
+ }
169
+
171
170
/// Takes a `tokenstream::TokenStream` and returns a `Vec<self::TokenTree>`. Specifically, this
172
171
/// takes a generic `TokenStream`, such as is used in the rest of the compiler, and returns a
173
172
/// collection of `TokenTree` for use in parsing a macro.
@@ -279,8 +278,8 @@ where
279
278
tokenstream:: TokenTree :: Token ( span, token:: Pound ) if hygiene_optout => match trees. peek ( ) {
280
279
Some ( tokenstream:: TokenTree :: Token ( _, token:: Dollar ) ) => {
281
280
if let tokenstream:: TokenTree :: Token ( span, token:: Dollar ) = trees. next ( ) . unwrap ( ) {
282
- parse_meta_var ( true ,
283
- span ,
281
+ parse_meta_var ( span ,
282
+ TokenHygiene :: CallSite ,
284
283
trees,
285
284
hygiene_optout,
286
285
expect_matchers,
@@ -295,7 +294,7 @@ where
295
294
Some ( tokenstream:: TokenTree :: Token ( _, token:: Ident ( ..) ) ) => {
296
295
if let tokenstream:: TokenTree :: Token ( span, tok @ token:: Ident ( ..) ) =
297
296
trees. next ( ) . unwrap ( ) {
298
- TokenTree :: Token ( span, tok, true )
297
+ TokenTree :: Token ( span, tok, TokenHygiene :: CallSite )
299
298
} else {
300
299
unreachable ! ( ) ;
301
300
}
@@ -304,19 +303,19 @@ where
304
303
Some ( tokenstream:: TokenTree :: Token ( _, token:: Lifetime ( ..) ) ) => {
305
304
if let tokenstream:: TokenTree :: Token ( span, tok @ token:: Lifetime ( ..) ) =
306
305
trees. next ( ) . unwrap ( ) {
307
- TokenTree :: Token ( span, tok, true )
306
+ TokenTree :: Token ( span, tok, TokenHygiene :: CallSite )
308
307
} else {
309
308
unreachable ! ( ) ;
310
309
}
311
310
}
312
311
313
- _ => TokenTree :: Token ( span, token:: Pound , false ) ,
312
+ _ => TokenTree :: Token ( span, token:: Pound , TokenHygiene :: DefSite ) ,
314
313
}
315
314
316
315
// `tree` is a `$` token. Look at the next token in `trees`.
317
316
tokenstream:: TokenTree :: Token ( span, token:: Dollar ) =>
318
- parse_meta_var ( false ,
319
- span ,
317
+ parse_meta_var ( span ,
318
+ TokenHygiene :: DefSite ,
320
319
trees,
321
320
hygiene_optout,
322
321
expect_matchers,
@@ -325,7 +324,8 @@ where
325
324
attrs) ,
326
325
327
326
// `tree` is an arbitrary token. Keep it.
328
- tokenstream:: TokenTree :: Token ( span, tok) => TokenTree :: Token ( span, tok, false ) ,
327
+ tokenstream:: TokenTree :: Token ( span, tok) =>
328
+ TokenTree :: Token ( span, tok, TokenHygiene :: DefSite ) ,
329
329
330
330
// `tree` is the beginning of a delimited set of tokens (e.g. `(` or `{`). We need to
331
331
// descend into the delimited set and further parse it.
@@ -346,8 +346,8 @@ where
346
346
347
347
/// Attempt to parse a single meta variable or meta variable sequence.
348
348
fn parse_meta_var < I > (
349
- escape_hygiene : bool ,
350
349
span : Span ,
350
+ token_hygiene : TokenHygiene ,
351
351
trees : & mut Peekable < I > ,
352
352
hygiene_optout : bool ,
353
353
expect_matchers : bool ,
@@ -399,9 +399,9 @@ where
399
399
let span = ident_span. with_lo ( span. lo ( ) ) ;
400
400
if ident. name == keywords:: Crate . name ( ) && !is_raw {
401
401
let ident = ast:: Ident :: new ( keywords:: DollarCrate . name ( ) , ident. span ) ;
402
- TokenTree :: Token ( span, token:: Ident ( ident, is_raw) , escape_hygiene )
402
+ TokenTree :: Token ( span, token:: Ident ( ident, is_raw) , token_hygiene )
403
403
} else {
404
- TokenTree :: MetaVar ( span, ident, escape_hygiene )
404
+ TokenTree :: MetaVar ( span, ident, token_hygiene )
405
405
}
406
406
}
407
407
@@ -412,11 +412,11 @@ where
412
412
pprust:: token_to_string( & tok)
413
413
) ;
414
414
sess. span_diagnostic . span_err ( span, & msg) ;
415
- TokenTree :: MetaVar ( span, keywords:: Invalid . ident ( ) , escape_hygiene )
415
+ TokenTree :: MetaVar ( span, keywords:: Invalid . ident ( ) , token_hygiene )
416
416
}
417
417
418
418
// There are no more tokens. Just return the `$` we already have.
419
- None => TokenTree :: Token ( span, token:: Dollar , false ) ,
419
+ None => TokenTree :: Token ( span, token:: Dollar , TokenHygiene :: DefSite ) ,
420
420
}
421
421
}
422
422
0 commit comments