@@ -14,8 +14,8 @@ use rustc_macros::HashStable_Generic;
1414use rustc_span:: symbol:: kw;
1515use rustc_span:: symbol:: Symbol ;
1616use rustc_span:: { self , Span , DUMMY_SP } ;
17- use std:: fmt ;
18- use std:: mem;
17+ use std:: borrow :: Cow ;
18+ use std:: { fmt , mem} ;
1919
2020#[ derive( Clone , PartialEq , RustcEncodable , RustcDecodable , Hash , Debug , Copy ) ]
2121#[ derive( HashStable_Generic ) ]
@@ -457,6 +457,22 @@ impl Token {
457457 }
458458 }
459459
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+
460476 /// Returns an identifier if this token is an identifier.
461477 pub fn ident ( & self ) -> Option < ( ast:: Ident , /* is_raw */ bool ) > {
462478 match self . kind {
0 commit comments