Auto merge of #96683 - nnethercote:speed-up-Token-ident-lifetime, r=petrochenkov
Speed up `Token::{ident,lifetime}` Some speed and cleanliness improvements. r? `@petrochenkov`
This commit is contained in:
commit
343889b723
2 changed files with 21 additions and 11 deletions
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -521,7 +531,7 @@ impl Token {
|
||||||
/// (which happens while parsing the result of macro expansion)?
|
/// (which happens while parsing the result of macro expansion)?
|
||||||
pub fn is_whole_expr(&self) -> bool {
|
pub fn is_whole_expr(&self) -> bool {
|
||||||
if let Interpolated(ref nt) = self.kind
|
if let Interpolated(ref nt) = self.kind
|
||||||
&& let NtExpr(_) | NtLiteral(_) | NtPath(_) | NtIdent(..) | NtBlock(_) = **nt
|
&& let NtExpr(_) | NtLiteral(_) | NtPath(_) | NtBlock(_) = **nt
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,10 +217,10 @@ pub(super) fn transcribe<'a>(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replace the meta-var with the matched token tree from the invocation.
|
// Replace the meta-var with the matched token tree from the invocation.
|
||||||
mbe::TokenTree::MetaVar(mut sp, mut orignal_ident) => {
|
mbe::TokenTree::MetaVar(mut sp, mut original_ident) => {
|
||||||
// Find the matched nonterminal from the macro invocation, and use it to replace
|
// Find the matched nonterminal from the macro invocation, and use it to replace
|
||||||
// the meta-var.
|
// the meta-var.
|
||||||
let ident = MacroRulesNormalizedIdent::new(orignal_ident);
|
let ident = MacroRulesNormalizedIdent::new(original_ident);
|
||||||
if let Some(cur_matched) = lookup_cur_matched(ident, interp, &repeats) {
|
if let Some(cur_matched) = lookup_cur_matched(ident, interp, &repeats) {
|
||||||
match cur_matched {
|
match cur_matched {
|
||||||
MatchedTokenTree(ref tt) => {
|
MatchedTokenTree(ref tt) => {
|
||||||
|
@ -249,9 +249,9 @@ pub(super) fn transcribe<'a>(
|
||||||
// If we aren't able to match the meta-var, we push it back into the result but
|
// If we aren't able to match the meta-var, we push it back into the result but
|
||||||
// with modified syntax context. (I believe this supports nested macros).
|
// with modified syntax context. (I believe this supports nested macros).
|
||||||
marker.visit_span(&mut sp);
|
marker.visit_span(&mut sp);
|
||||||
marker.visit_ident(&mut orignal_ident);
|
marker.visit_ident(&mut original_ident);
|
||||||
result.push(TokenTree::token(token::Dollar, sp).into());
|
result.push(TokenTree::token(token::Dollar, sp).into());
|
||||||
result.push(TokenTree::Token(Token::from_ast_ident(orignal_ident)).into());
|
result.push(TokenTree::Token(Token::from_ast_ident(original_ident)).into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue