Allow derive(PartialEq, Eq) on shared types
diff --git a/macro/src/derive.rs b/macro/src/derive.rs
index d896afb..91d4c64 100644
--- a/macro/src/derive.rs
+++ b/macro/src/derive.rs
@@ -4,6 +4,7 @@
pub fn expand_struct(strct: &Struct, actual_derives: &mut Option<TokenStream>) -> TokenStream {
let mut expanded = TokenStream::new();
+ let mut traits = Vec::new();
for derive in &strct.derives {
let span = derive.span;
@@ -11,18 +12,27 @@
Trait::Copy => expanded.extend(struct_copy(strct, span)),
Trait::Clone => expanded.extend(struct_clone(strct, span)),
Trait::Debug => expanded.extend(struct_debug(strct, span)),
+ Trait::Eq => traits.push(quote_spanned!(span=> ::std::cmp::Eq)),
+ Trait::PartialEq => traits.push(quote_spanned!(span=> ::std::cmp::PartialEq)),
}
}
- *actual_derives = None;
+ if traits.is_empty() {
+ *actual_derives = None;
+ } else {
+ *actual_derives = Some(quote!(#[derive(#(#traits),*)]));
+ }
expanded
}
pub fn expand_enum(enm: &Enum, actual_derives: &mut Option<TokenStream>) -> TokenStream {
let mut expanded = TokenStream::new();
+ let mut traits = Vec::new();
let mut has_copy = false;
let mut has_clone = false;
+ let mut has_eq = false;
+ let mut has_partial_eq = false;
for derive in &enm.derives {
let span = derive.span;
@@ -36,6 +46,14 @@
has_clone = true;
}
Trait::Debug => expanded.extend(enum_debug(enm, span)),
+ Trait::Eq => {
+ traits.push(quote_spanned!(span=> ::std::cmp::Eq));
+ has_eq = true;
+ }
+ Trait::PartialEq => {
+ traits.push(quote_spanned!(span=> ::std::cmp::PartialEq));
+ has_partial_eq = true;
+ }
}
}
@@ -46,12 +64,16 @@
if !has_clone {
expanded.extend(enum_clone(enm, span));
}
-
- *actual_derives = Some(quote! {
+ if !has_eq {
// Required to be derived in order for the enum's "variants" to be
// usable in patterns.
- #[derive(::std::cmp::PartialEq, ::std::cmp::Eq)]
- });
+ traits.push(quote!(::std::cmp::Eq));
+ }
+ if !has_partial_eq {
+ traits.push(quote!(::std::cmp::PartialEq));
+ }
+
+ *actual_derives = Some(quote!(#[derive(#(#traits),*)]));
expanded
}