diff options
| author | bors <bors@rust-lang.org> | 2019-05-23 01:50:55 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-05-23 01:50:55 +0000 |
| commit | 15ccaf77911d9261d0c254be8a3e878db84792c6 (patch) | |
| tree | e79e46b214341921d8bd56d2b302b84fff00f4df /src/libsyntax_pos | |
| parent | 11f01bfb9f79b569aee6ac724eea59c7105a7f19 (diff) | |
| parent | a1885cdba38a63448ceec02f951ddc0844d0ff38 (diff) | |
| download | rust-15ccaf77911d9261d0c254be8a3e878db84792c6.tar.gz rust-15ccaf77911d9261d0c254be8a3e878db84792c6.zip | |
Auto merge of #60740 - petrochenkov:kw, r=nnethercote
Simplify use of keyword symbols They mirror non-keyword symbols now (see https://github.com/rust-lang/rust/pull/60630). `keywords::MyKeyword.name()` -> `kw::MyKeyword` `keywords::MyKeyword.ident()` -> `Ident::with_empty_ctxt(kw::MyKeyword)` (not common) `keywords::Invalid.ident()` -> `Ident::invalid()` (more common) Keywords are simply `Symbol` constants now, the `Keyword` struct is eliminated. This means `kw::MyKeyword` can now be used in `match` in particular.
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/hygiene.rs | 14 | ||||
| -rw-r--r-- | src/libsyntax_pos/symbol.rs | 65 |
2 files changed, 36 insertions, 43 deletions
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs index 6e787c08504..e8dcd8171c9 100644 --- a/src/libsyntax_pos/hygiene.rs +++ b/src/libsyntax_pos/hygiene.rs @@ -8,7 +8,7 @@ use crate::GLOBALS; use crate::Span; use crate::edition::Edition; -use crate::symbol::{keywords, Symbol}; +use crate::symbol::{kw, Symbol}; use serialize::{Encodable, Decodable, Encoder, Decoder}; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; @@ -192,7 +192,7 @@ impl HygieneData { prev_ctxt: SyntaxContext(0), opaque: SyntaxContext(0), opaque_and_semitransparent: SyntaxContext(0), - dollar_crate_name: keywords::DollarCrate.name(), + dollar_crate_name: kw::DollarCrate, }], markings: FxHashMap::default(), } @@ -245,7 +245,7 @@ impl SyntaxContext { prev_ctxt: SyntaxContext::empty(), opaque: SyntaxContext::empty(), opaque_and_semitransparent: SyntaxContext::empty(), - dollar_crate_name: keywords::DollarCrate.name(), + dollar_crate_name: kw::DollarCrate, }); SyntaxContext(data.syntax_contexts.len() as u32 - 1) }) @@ -312,7 +312,7 @@ impl SyntaxContext { prev_ctxt, opaque: new_opaque, opaque_and_semitransparent: new_opaque, - dollar_crate_name: keywords::DollarCrate.name(), + dollar_crate_name: kw::DollarCrate, }); new_opaque }); @@ -330,7 +330,7 @@ impl SyntaxContext { prev_ctxt, opaque, opaque_and_semitransparent: new_opaque_and_semitransparent, - dollar_crate_name: keywords::DollarCrate.name(), + dollar_crate_name: kw::DollarCrate, }); new_opaque_and_semitransparent }); @@ -346,7 +346,7 @@ impl SyntaxContext { prev_ctxt, opaque, opaque_and_semitransparent, - dollar_crate_name: keywords::DollarCrate.name(), + dollar_crate_name: kw::DollarCrate, }); new_opaque_and_semitransparent_and_transparent }) @@ -512,7 +512,7 @@ impl SyntaxContext { &mut data.syntax_contexts[self.0 as usize].dollar_crate_name, dollar_crate_name ); assert!(dollar_crate_name == prev_dollar_crate_name || - prev_dollar_crate_name == keywords::DollarCrate.name(), + prev_dollar_crate_name == kw::DollarCrate, "$crate name is reset for a syntax context"); }) } diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index b59244283d7..f69b26e49d0 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -642,6 +642,11 @@ impl Ident { Ident::new(name, DUMMY_SP) } + #[inline] + pub fn invalid() -> Ident { + Ident::with_empty_ctxt(kw::Invalid) + } + /// Maps an interned string to an identifier with an empty syntax context. pub fn from_interned_str(string: InternedString) -> Ident { Ident::with_empty_ctxt(string.as_symbol()) @@ -693,7 +698,7 @@ impl Ident { /// Transforms an underscore identifier into one with the same name, but /// gensymed. Leaves non-underscore identifiers unchanged. pub fn gensym_if_underscore(self) -> Ident { - if self.name == keywords::Underscore.name() { self.gensym() } else { self } + if self.name == kw::Underscore { self.gensym() } else { self } } // WARNING: this function is deprecated and will be removed in the future. @@ -865,8 +870,8 @@ impl Interner { this.strings.reserve(init.len()); // We can't allocate empty strings in the arena, so handle this here. - assert!(keywords::Invalid.name().as_u32() == 0 && init[0].is_empty()); - this.names.insert("", keywords::Invalid.name()); + assert!(kw::Invalid.as_u32() == 0 && init[0].is_empty()); + this.names.insert("", kw::Invalid); this.strings.push(""); for string in &init[1..] { @@ -927,26 +932,9 @@ impl Interner { } } -pub mod keywords { - use super::{Symbol, Ident}; - - #[derive(Clone, Copy, PartialEq, Eq)] - pub struct Keyword { - ident: Ident, - } - - impl Keyword { - #[inline] - pub fn ident(self) -> Ident { - self.ident - } - - #[inline] - pub fn name(self) -> Symbol { - self.ident.name - } - } - +// This module has a very short name because it's used a lot. +pub mod kw { + use super::Symbol; keywords!(); } @@ -958,11 +946,16 @@ pub mod sym { impl Symbol { fn is_used_keyword_2018(self) -> bool { - self == keywords::Dyn.name() + self == kw::Dyn } fn is_unused_keyword_2018(self) -> bool { - self >= keywords::Async.name() && self <= keywords::Try.name() + self >= kw::Async && self <= kw::Try + } + + /// Used for sanity checking rustdoc keyword sections. + pub fn is_doc_keyword(self) -> bool { + self <= kw::Union } } @@ -970,20 +963,20 @@ impl Ident { // Returns `true` for reserved identifiers used internally for elided lifetimes, // unnamed method parameters, crate root module, error recovery etc. pub fn is_special(self) -> bool { - self.name <= keywords::Underscore.name() + self.name <= kw::Underscore } /// Returns `true` if the token is a keyword used in the language. pub fn is_used_keyword(self) -> bool { // Note: `span.edition()` is relatively expensive, don't call it unless necessary. - self.name >= keywords::As.name() && self.name <= keywords::While.name() || + self.name >= kw::As && self.name <= kw::While || self.name.is_used_keyword_2018() && self.span.rust_2018() } /// Returns `true` if the token is a keyword reserved for possible future use. pub fn is_unused_keyword(self) -> bool { // Note: `span.edition()` is relatively expensive, don't call it unless necessary. - self.name >= keywords::Abstract.name() && self.name <= keywords::Yield.name() || + self.name >= kw::Abstract && self.name <= kw::Yield || self.name.is_unused_keyword_2018() && self.span.rust_2018() } @@ -994,17 +987,17 @@ impl Ident { /// A keyword or reserved identifier that can be used as a path segment. pub fn is_path_segment_keyword(self) -> bool { - self.name == keywords::Super.name() || - self.name == keywords::SelfLower.name() || - self.name == keywords::SelfUpper.name() || - self.name == keywords::Crate.name() || - self.name == keywords::PathRoot.name() || - self.name == keywords::DollarCrate.name() + self.name == kw::Super || + self.name == kw::SelfLower || + self.name == kw::SelfUpper || + self.name == kw::Crate || + self.name == kw::PathRoot || + self.name == kw::DollarCrate } /// This identifier can be a raw identifier. pub fn can_be_raw(self) -> bool { - self.name != keywords::Invalid.name() && self.name != keywords::Underscore.name() && + self.name != kw::Invalid && self.name != kw::Underscore && !self.is_path_segment_keyword() } @@ -1268,7 +1261,7 @@ mod tests { fn without_first_quote_test() { GLOBALS.set(&Globals::new(edition::DEFAULT_EDITION), || { let i = Ident::from_str("'break"); - assert_eq!(i.without_first_quote().name, keywords::Break.name()); + assert_eq!(i.without_first_quote().name, kw::Break); }); } } |
