1
Fork 0

Speed up Token::{ident,lifetime}.

They're hot enough that the repeated matching done by `uninterpolate`
has a measurable effect.
This commit is contained in:
Nicholas Nethercote 2022-05-03 12:40:35 +10:00
parent baaa3b6829
commit 637a93cb5d

View file

@ -475,19 +475,29 @@ impl Token {
} }
/// Returns an identifier if this token is an identifier. /// Returns an identifier if this token is an identifier.
#[inline]
pub fn ident(&self) -> Option<(Ident, /* is_raw */ bool)> { pub fn ident(&self) -> Option<(Ident, /* is_raw */ bool)> {
let token = self.uninterpolate(); // We avoid using `Token::uninterpolate` here because it's slow.
match token.kind { match &self.kind {
Ident(name, is_raw) => Some((Ident::new(name, token.span), is_raw)), &Ident(name, is_raw) => Some((Ident::new(name, self.span), is_raw)),
Interpolated(nt) => match **nt {
NtIdent(ident, is_raw) => Some((ident, is_raw)),
_ => None,
},
_ => None, _ => None,
} }
} }
/// Returns a lifetime identifier if this token is a lifetime. /// Returns a lifetime identifier if this token is a lifetime.
#[inline]
pub fn lifetime(&self) -> Option<Ident> { pub fn lifetime(&self) -> Option<Ident> {
let token = self.uninterpolate(); // We avoid using `Token::uninterpolate` here because it's slow.
match token.kind { match &self.kind {
Lifetime(name) => Some(Ident::new(name, token.span)), &Lifetime(name) => Some(Ident::new(name, self.span)),
Interpolated(nt) => match **nt {
NtLifetime(ident) => Some(ident),
_ => None,
},
_ => None, _ => None,
} }
} }