diff --git a/compiler/rustc_macros/src/symbols.rs b/compiler/rustc_macros/src/symbols.rs index f449900d5c2..5b932864dff 100644 --- a/compiler/rustc_macros/src/symbols.rs +++ b/compiler/rustc_macros/src/symbols.rs @@ -126,7 +126,6 @@ fn symbols_with_errors(input: TokenStream) -> (TokenStream, Vec) { let mut keyword_stream = quote! {}; let mut symbols_stream = quote! {}; - let mut digits_stream = quote! {}; let mut prefill_stream = quote! {}; let mut counter = 0u32; let mut keys = @@ -162,7 +161,6 @@ fn symbols_with_errors(input: TokenStream) -> (TokenStream, Vec) { #value, }); keyword_stream.extend(quote! { - #[allow(non_upper_case_globals)] pub const #name: Symbol = Symbol::new(#counter); }); counter += 1; @@ -182,42 +180,39 @@ fn symbols_with_errors(input: TokenStream) -> (TokenStream, Vec) { #value, }); symbols_stream.extend(quote! { - #[allow(rustc::default_hash_types)] - #[allow(non_upper_case_globals)] pub const #name: Symbol = Symbol::new(#counter); }); counter += 1; } // Generate symbols for the strings "0", "1", ..., "9". + let digits_base = counter; + counter += 10; for n in 0..10 { let n = n.to_string(); check_dup(Span::call_site(), &n, &mut errors); prefill_stream.extend(quote! { #n, }); - digits_stream.extend(quote! { - Symbol::new(#counter), - }); - counter += 1; } + let _ = counter; // for future use let output = quote! { - macro_rules! keywords { - () => { - #keyword_stream - } + const SYMBOL_DIGITS_BASE: u32 = #digits_base; + + #[doc(hidden)] + #[allow(non_upper_case_globals)] + mod kw_generated { + use super::Symbol; + #keyword_stream } - macro_rules! define_symbols { - () => { - #symbols_stream - - #[allow(non_upper_case_globals)] - pub const digits_array: &[Symbol; 10] = &[ - #digits_stream - ]; - } + #[allow(rustc::default_hash_types)] + #[allow(non_upper_case_globals)] + #[doc(hidden)] + pub mod sym_generated { + use super::Symbol; + #symbols_stream } impl Interner { diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index f61a32a0f79..cceede42cac 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -1577,8 +1577,7 @@ impl Interner { /// Given that `kw` is imported, use them like `kw::keyword_name`. /// For example `kw::Loop` or `kw::Break`. pub mod kw { - use super::Symbol; - keywords!(); + pub use super::kw_generated::*; } // This module has a very short name because it's used a lot. @@ -1586,22 +1585,23 @@ pub mod kw { /// /// Given that `sym` is imported, use them like `sym::symbol_name`. /// For example `sym::rustfmt` or `sym::u8`. -#[allow(rustc::default_hash_types)] pub mod sym { use super::Symbol; use std::convert::TryInto; - define_symbols!(); + pub use super::sym_generated::*; // Used from a macro in `librustc_feature/accepted.rs` pub use super::kw::MacroRules as macro_rules; - // Get the symbol for an integer. The first few non-negative integers each - // have a static symbol and therefore are fast. + /// Get the symbol for an integer. + /// + /// The first few non-negative integers each have a static symbol and therefore + /// are fast. pub fn integer + Copy + ToString>(n: N) -> Symbol { if let Result::Ok(idx) = n.try_into() { - if let Option::Some(&sym_) = digits_array.get(idx) { - return sym_; + if idx < 10 { + return Symbol::new(super::SYMBOL_DIGITS_BASE + idx as u32); } } Symbol::intern(&n.to_string())