@@ -13,7 +13,7 @@ use std::fmt;
1313use std:: hash:: { Hash , Hasher } ;
1414use std:: str;
1515
16- use crate :: { Span , DUMMY_SP , SESSION_GLOBALS } ;
16+ use crate :: { Edition , Span , DUMMY_SP , SESSION_GLOBALS } ;
1717
1818#[ cfg( test) ]
1919mod tests;
@@ -1609,12 +1609,32 @@ pub mod sym {
16091609}
16101610
16111611impl 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