From 5ea03dd7da0a8eddf0709713fc8e6d9b918385bc Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 12 Oct 2019 13:50:46 -0700 Subject: [PATCH] Support Display impl for void enums --- impl/src/expand.rs | 7 ++++++- impl/src/prop.rs | 8 +++++--- tests/test_display.rs | 4 ++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/impl/src/expand.rs b/impl/src/expand.rs index 197239a..6c04bd7 100644 --- a/impl/src/expand.rs +++ b/impl/src/expand.rs @@ -110,6 +110,11 @@ fn impl_enum(input: Enum) -> TokenStream { }; let display_impl = if input.has_display() { + let void_deref = if input.variants.is_empty() { + Some(quote!(*)) + } else { + None + }; let arms = input.variants.iter().map(|variant| { let display = variant.attrs.display.as_ref().expect(valid::CHECKED); let ident = &variant.ident; @@ -122,7 +127,7 @@ fn impl_enum(input: Enum) -> TokenStream { impl #impl_generics std::fmt::Display for #ty #ty_generics #where_clause { fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { #[allow(unused_variables)] - match self { + match #void_deref self { #(#arms,)* } } diff --git a/impl/src/prop.rs b/impl/src/prop.rs index 47bf65f..b2473f5 100644 --- a/impl/src/prop.rs +++ b/impl/src/prop.rs @@ -25,9 +25,11 @@ impl Enum<'_> { } pub(crate) fn has_display(&self) -> bool { - self.variants - .iter() - .any(|variant| variant.attrs.display.is_some()) + self.attrs.display.is_some() + || self + .variants + .iter() + .any(|variant| variant.attrs.display.is_some()) } } diff --git a/tests/test_display.rs b/tests/test_display.rs index 50a59e2..841029c 100644 --- a/tests/test_display.rs +++ b/tests/test_display.rs @@ -47,6 +47,10 @@ struct Arithmetic; #[error("!bool = {}", not(.0))] struct NestedShorthand(bool); +#[derive(Error, Debug)] +#[error("...")] +enum Void {} + fn not(bool: &bool) -> bool { !*bool }