@@ -13,7 +13,7 @@ use std::fmt;
13
13
use std:: hash:: { Hash , Hasher } ;
14
14
use std:: str;
15
15
16
- use crate :: { Span , DUMMY_SP , SESSION_GLOBALS } ;
16
+ use crate :: { Edition , Span , DUMMY_SP , SESSION_GLOBALS } ;
17
17
18
18
#[ cfg( test) ]
19
19
mod tests;
@@ -1609,12 +1609,32 @@ pub mod sym {
1609
1609
}
1610
1610
1611
1611
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
1614
1614
}
1615
1615
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)
1618
1638
}
1619
1639
1620
1640
/// A keyword or reserved identifier that can be used as a path segment.
@@ -1642,26 +1662,27 @@ impl Ident {
1642
1662
// Returns `true` for reserved identifiers used internally for elided lifetimes,
1643
1663
// unnamed method parameters, crate root module, error recovery etc.
1644
1664
pub fn is_special ( self ) -> bool {
1645
- self . name <= kw :: Underscore
1665
+ self . name . is_special ( )
1646
1666
}
1647
1667
1648
1668
/// Returns `true` if the token is a keyword used in the language.
1649
1669
pub fn is_used_keyword ( self ) -> bool {
1650
1670
// 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 ( ) )
1653
1673
}
1654
1674
1655
1675
/// Returns `true` if the token is a keyword reserved for possible future use.
1656
1676
pub fn is_unused_keyword ( self ) -> bool {
1657
1677
// 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 ( ) )
1660
1680
}
1661
1681
1662
1682
/// Returns `true` if the token is either a special identifier or a keyword.
1663
1683
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 ( ) )
1665
1686
}
1666
1687
1667
1688
/// A keyword or reserved identifier that can be used as a path segment.
0 commit comments