Skip to content

Commit aa7cb4f

Browse files
Rollup merge of #80272 - petrochenkov:kwed, r=oli-obk
rustc_span: Provide a reserved identifier check for a specific edition while keeping edition evaluation lazy because it may be expensive. Needed for #80226.
2 parents 93690dc + 00ff7fe commit aa7cb4f

File tree

1 file changed

+32
-11
lines changed

1 file changed

+32
-11
lines changed

compiler/rustc_span/src/symbol.rs

+32-11
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::fmt;
1313
use std::hash::{Hash, Hasher};
1414
use std::str;
1515

16-
use crate::{Span, DUMMY_SP, SESSION_GLOBALS};
16+
use crate::{Edition, Span, DUMMY_SP, SESSION_GLOBALS};
1717

1818
#[cfg(test)]
1919
mod tests;
@@ -1609,12 +1609,32 @@ pub mod sym {
16091609
}
16101610

16111611
impl Symbol {
1612-
fn is_used_keyword_2018(self) -> bool {
1613-
self >= kw::Async && self <= kw::Dyn
1612+
fn is_special(self) -> bool {
1613+
self <= kw::Underscore
16141614
}
16151615

1616-
fn is_unused_keyword_2018(self) -> bool {
1617-
self == kw::Try
1616+
fn is_used_keyword_always(self) -> bool {
1617+
self >= kw::As && self <= kw::While
1618+
}
1619+
1620+
fn is_used_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
1621+
(self >= kw::Async && self <= kw::Dyn) && edition() >= Edition::Edition2018
1622+
}
1623+
1624+
fn is_unused_keyword_always(self) -> bool {
1625+
self >= kw::Abstract && self <= kw::Yield
1626+
}
1627+
1628+
fn is_unused_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
1629+
self == kw::Try && edition() >= Edition::Edition2018
1630+
}
1631+
1632+
pub fn is_reserved(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
1633+
self.is_special()
1634+
|| self.is_used_keyword_always()
1635+
|| self.is_unused_keyword_always()
1636+
|| self.is_used_keyword_conditional(edition)
1637+
|| self.is_unused_keyword_conditional(edition)
16181638
}
16191639

16201640
/// A keyword or reserved identifier that can be used as a path segment.
@@ -1642,26 +1662,27 @@ impl Ident {
16421662
// Returns `true` for reserved identifiers used internally for elided lifetimes,
16431663
// unnamed method parameters, crate root module, error recovery etc.
16441664
pub fn is_special(self) -> bool {
1645-
self.name <= kw::Underscore
1665+
self.name.is_special()
16461666
}
16471667

16481668
/// Returns `true` if the token is a keyword used in the language.
16491669
pub fn is_used_keyword(self) -> bool {
16501670
// Note: `span.edition()` is relatively expensive, don't call it unless necessary.
1651-
self.name >= kw::As && self.name <= kw::While
1652-
|| self.name.is_used_keyword_2018() && self.span.rust_2018()
1671+
self.name.is_used_keyword_always()
1672+
|| self.name.is_used_keyword_conditional(|| self.span.edition())
16531673
}
16541674

16551675
/// Returns `true` if the token is a keyword reserved for possible future use.
16561676
pub fn is_unused_keyword(self) -> bool {
16571677
// Note: `span.edition()` is relatively expensive, don't call it unless necessary.
1658-
self.name >= kw::Abstract && self.name <= kw::Yield
1659-
|| self.name.is_unused_keyword_2018() && self.span.rust_2018()
1678+
self.name.is_unused_keyword_always()
1679+
|| self.name.is_unused_keyword_conditional(|| self.span.edition())
16601680
}
16611681

16621682
/// Returns `true` if the token is either a special identifier or a keyword.
16631683
pub fn is_reserved(self) -> bool {
1664-
self.is_special() || self.is_used_keyword() || self.is_unused_keyword()
1684+
// Note: `span.edition()` is relatively expensive, don't call it unless necessary.
1685+
self.name.is_reserved(|| self.span.edition())
16651686
}
16661687

16671688
/// A keyword or reserved identifier that can be used as a path segment.

0 commit comments

Comments
 (0)