diff options
| author | Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> | 2022-12-18 21:37:38 +0100 |
|---|---|---|
| committer | Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> | 2022-12-18 21:37:38 +0100 |
| commit | d679764fb6b84a5cb72f6a9c9fefce4c6b41f16c (patch) | |
| tree | 926ed2d285303de0a64f833a46fee04744d0d7de /compiler/rustc_macros/src | |
| parent | 91c3c2040ce109d6e9ea00ffb8e8f69f3fd6d9bb (diff) | |
| download | rust-d679764fb6b84a5cb72f6a9c9fefce4c6b41f16c.tar.gz rust-d679764fb6b84a5cb72f6a9c9fefce4c6b41f16c.zip | |
Make `#[debug_format]` an attribute in `newtype_index`
This removes the `custom` format functionality as its only user was trivially migrated to using a normal format. If a new use case for a custom formatting impl pops up, you can add it back.
Diffstat (limited to 'compiler/rustc_macros/src')
| -rw-r--r-- | compiler/rustc_macros/src/newtype.rs | 66 |
1 files changed, 21 insertions, 45 deletions
diff --git a/compiler/rustc_macros/src/newtype.rs b/compiler/rustc_macros/src/newtype.rs index 99f3f638d2f..7b7e475da5b 100644 --- a/compiler/rustc_macros/src/newtype.rs +++ b/compiler/rustc_macros/src/newtype.rs @@ -3,22 +3,6 @@ use quote::quote; use syn::parse::*; use syn::*; -mod kw { - syn::custom_keyword!(DEBUG_FORMAT); - syn::custom_keyword!(MAX); - syn::custom_keyword!(custom); -} - -#[derive(Debug)] -enum DebugFormat { - // The user will provide a custom `Debug` impl, so we shouldn't generate - // one - Custom, - // Use the specified format string in the generated `Debug` impl - // By default, this is "{}" - Format(String), -} - // We parse the input and emit the output in a single step. // This field stores the final macro output struct Newtype(TokenStream); @@ -35,7 +19,7 @@ impl Parse for Newtype { // Any additional `#[derive]` macro paths to apply let mut derive_paths: Vec<Path> = Vec::new(); - let mut debug_format: Option<DebugFormat> = None; + let mut debug_format: Option<Lit> = None; let mut max = None; let mut consts = Vec::new(); let mut encodable = true; @@ -65,7 +49,18 @@ impl Parse for Newtype { }; if let Some(old) = max.replace(literal.lit) { - panic!("Specified multiple MAX: {:?}", old); + panic!("Specified multiple max: {:?}", old); + } + + false + } + "debug_format" => { + let Ok(Meta::NameValue(literal) )= attr.parse_meta() else { + panic!("#[debug_format = FMT] attribute requires a format"); + }; + + if let Some(old) = debug_format.replace(literal.lit) { + panic!("Specified multiple debug format options: {:?}", old); } false @@ -79,23 +74,6 @@ impl Parse for Newtype { body.parse::<Token![..]>()?; } else { loop { - if body.lookahead1().peek(kw::DEBUG_FORMAT) { - body.parse::<kw::DEBUG_FORMAT>()?; - body.parse::<Token![=]>()?; - let new_debug_format = if body.lookahead1().peek(kw::custom) { - body.parse::<kw::custom>()?; - DebugFormat::Custom - } else { - let format_str: LitStr = body.parse()?; - DebugFormat::Format(format_str.value()) - }; - try_comma()?; - if let Some(old) = debug_format.replace(new_debug_format) { - panic!("Specified multiple debug format options: {:?}", old); - } - continue; - } - // We've parsed everything that the user provided, so we're done if body.is_empty() { break; @@ -112,7 +90,9 @@ impl Parse for Newtype { } } - let debug_format = debug_format.unwrap_or(DebugFormat::Format("{}".to_string())); + let debug_format = + debug_format.unwrap_or_else(|| Lit::Str(LitStr::new("{}", Span::call_site()))); + // shave off 256 indices at the end to allow space for packing these indices into enums let max = max.unwrap_or_else(|| Lit::Int(LitInt::new("0xFFFF_FF00", Span::call_site()))); @@ -167,18 +147,14 @@ impl Parse for Newtype { quote! {} }; - let debug_impl = match debug_format { - DebugFormat::Custom => quote! {}, - DebugFormat::Format(format) => { - quote! { - impl ::std::fmt::Debug for #name { - fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write!(fmt, #format, self.as_u32()) - } - } + let debug_impl = quote! { + impl ::std::fmt::Debug for #name { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + write!(fmt, #debug_format, self.as_u32()) } } }; + let spec_partial_eq_impl = if let Lit::Int(max) = &max { if let Ok(max_val) = max.base10_parse::<u32>() { quote! { |
