@@ -46,7 +46,7 @@ impl Delimited {
4646 } else {
4747 span. with_lo ( span. lo ( ) + BytePos ( self . delim . len ( ) as u32 ) )
4848 } ;
49- TokenTree :: Token ( open_span, self . open_token ( ) , false )
49+ TokenTree :: Token ( open_span, self . open_token ( ) , TokenHygiene :: DefSite )
5050 }
5151
5252 /// Return a `self::TokenTree` with a `Span` corresponding to the closing delimiter.
@@ -56,7 +56,7 @@ impl Delimited {
5656 } else {
5757 span. with_lo ( span. hi ( ) - BytePos ( self . delim . len ( ) as u32 ) )
5858 } ;
59- TokenTree :: Token ( close_span, self . close_token ( ) , false )
59+ TokenTree :: Token ( close_span, self . close_token ( ) , TokenHygiene :: DefSite )
6060 }
6161}
6262
@@ -88,20 +88,12 @@ pub enum KleeneOp {
8888/// are "first-class" token trees. Useful for parsing macros.
8989#[ derive( Debug , Clone , PartialEq , Eq , RustcEncodable , RustcDecodable , Hash ) ]
9090pub enum TokenTree {
91- Token (
92- Span ,
93- token:: Token ,
94- bool , /* escape hygiene */
95- ) ,
91+ Token ( Span , token:: Token , TokenHygiene ) ,
9692 Delimited ( Span , Lrc < Delimited > ) ,
9793 /// A Kleene-style repetition sequence
9894 Sequence ( Span , Lrc < SequenceRepetition > ) ,
9995 /// E.g. `$var`
100- MetaVar (
101- Span ,
102- ast:: Ident ,
103- bool , /* escape hygiene */
104- ) ,
96+ MetaVar ( Span , ast:: Ident , TokenHygiene ) ,
10597 /// E.g. `$var:expr`. This is only used in the left hand side of MBE macros.
10698 MetaVarDecl (
10799 Span ,
@@ -168,6 +160,13 @@ impl TokenTree {
168160 }
169161}
170162
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+
171170/// Takes a `tokenstream::TokenStream` and returns a `Vec<self::TokenTree>`. Specifically, this
172171/// takes a generic `TokenStream`, such as is used in the rest of the compiler, and returns a
173172/// collection of `TokenTree` for use in parsing a macro.
@@ -279,8 +278,8 @@ where
279278 tokenstream:: TokenTree :: Token ( span, token:: Pound ) if hygiene_optout => match trees. peek ( ) {
280279 Some ( tokenstream:: TokenTree :: Token ( _, token:: Dollar ) ) => {
281280 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 ,
284283 trees,
285284 hygiene_optout,
286285 expect_matchers,
@@ -295,7 +294,7 @@ where
295294 Some ( tokenstream:: TokenTree :: Token ( _, token:: Ident ( ..) ) ) => {
296295 if let tokenstream:: TokenTree :: Token ( span, tok @ token:: Ident ( ..) ) =
297296 trees. next ( ) . unwrap ( ) {
298- TokenTree :: Token ( span, tok, true )
297+ TokenTree :: Token ( span, tok, TokenHygiene :: CallSite )
299298 } else {
300299 unreachable ! ( ) ;
301300 }
@@ -304,19 +303,19 @@ where
304303 Some ( tokenstream:: TokenTree :: Token ( _, token:: Lifetime ( ..) ) ) => {
305304 if let tokenstream:: TokenTree :: Token ( span, tok @ token:: Lifetime ( ..) ) =
306305 trees. next ( ) . unwrap ( ) {
307- TokenTree :: Token ( span, tok, true )
306+ TokenTree :: Token ( span, tok, TokenHygiene :: CallSite )
308307 } else {
309308 unreachable ! ( ) ;
310309 }
311310 }
312311
313- _ => TokenTree :: Token ( span, token:: Pound , false ) ,
312+ _ => TokenTree :: Token ( span, token:: Pound , TokenHygiene :: DefSite ) ,
314313 }
315314
316315 // `tree` is a `$` token. Look at the next token in `trees`.
317316 tokenstream:: TokenTree :: Token ( span, token:: Dollar ) =>
318- parse_meta_var ( false ,
319- span ,
317+ parse_meta_var ( span ,
318+ TokenHygiene :: DefSite ,
320319 trees,
321320 hygiene_optout,
322321 expect_matchers,
@@ -325,7 +324,8 @@ where
325324 attrs) ,
326325
327326 // `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 ) ,
329329
330330 // `tree` is the beginning of a delimited set of tokens (e.g. `(` or `{`). We need to
331331 // descend into the delimited set and further parse it.
@@ -346,8 +346,8 @@ where
346346
347347/// Attempt to parse a single meta variable or meta variable sequence.
348348fn parse_meta_var < I > (
349- escape_hygiene : bool ,
350349 span : Span ,
350+ token_hygiene : TokenHygiene ,
351351 trees : & mut Peekable < I > ,
352352 hygiene_optout : bool ,
353353 expect_matchers : bool ,
@@ -399,9 +399,9 @@ where
399399 let span = ident_span. with_lo ( span. lo ( ) ) ;
400400 if ident. name == keywords:: Crate . name ( ) && !is_raw {
401401 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 )
403403 } else {
404- TokenTree :: MetaVar ( span, ident, escape_hygiene )
404+ TokenTree :: MetaVar ( span, ident, token_hygiene )
405405 }
406406 }
407407
@@ -412,11 +412,11 @@ where
412412 pprust:: token_to_string( & tok)
413413 ) ;
414414 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 )
416416 }
417417
418418 // 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 ) ,
420420 }
421421}
422422
0 commit comments