@@ -14,8 +14,8 @@ use rustc_macros::HashStable_Generic;
14
14
use rustc_span:: symbol:: kw;
15
15
use rustc_span:: symbol:: Symbol ;
16
16
use rustc_span:: { self , Span , DUMMY_SP } ;
17
- use std:: fmt ;
18
- use std:: mem;
17
+ use std:: borrow :: Cow ;
18
+ use std:: { fmt , mem} ;
19
19
20
20
#[ derive( Clone , PartialEq , RustcEncodable , RustcDecodable , Hash , Debug , Copy ) ]
21
21
#[ derive( HashStable_Generic ) ]
@@ -457,6 +457,22 @@ impl Token {
457
457
}
458
458
}
459
459
460
+ // Turns interpolated identifier (`$i: ident`) or lifetime (`$l: lifetime`) token
461
+ // into the regular identifier or lifetime token it refers to,
462
+ // otherwise returns the original token.
463
+ pub fn uninterpolate ( & self ) -> Cow < ' _ , Token > {
464
+ match & self . kind {
465
+ Interpolated ( nt) => match * * nt {
466
+ NtIdent ( ident, is_raw) => {
467
+ Cow :: Owned ( Token :: new ( Ident ( ident. name , is_raw) , ident. span ) )
468
+ }
469
+ NtLifetime ( ident) => Cow :: Owned ( Token :: new ( Lifetime ( ident. name ) , ident. span ) ) ,
470
+ _ => Cow :: Borrowed ( self ) ,
471
+ } ,
472
+ _ => Cow :: Borrowed ( self ) ,
473
+ }
474
+ }
475
+
460
476
/// Returns an identifier if this token is an identifier.
461
477
pub fn ident ( & self ) -> Option < ( ast:: Ident , /* is_raw */ bool ) > {
462
478
match self . kind {
0 commit comments