Skip to content

Commit 57e0a7e

Browse files
committed
derive: Skip PartialEq::ne for any zero-field enum or struct
Also detect unit structs and enums with zero field struct variants.
1 parent 190af51 commit 57e0a7e

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

src/libsyntax_ext/deriving/cmp/partial_eq.rs

+15-17
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,26 @@
1111
use deriving::generic::*;
1212
use deriving::generic::ty::*;
1313

14-
use syntax::ast::{MetaItem, Expr, BinOpKind, ItemKind, VariantData};
14+
use syntax::ast::{MetaItem, Expr, BinOpKind, ItemKind};
1515
use syntax::codemap::Span;
1616
use syntax::ext::base::{ExtCtxt, Annotatable};
1717
use syntax::ext::build::AstBuilder;
1818
use syntax::parse::token::InternedString;
1919
use syntax::ptr::P;
2020

21-
fn is_clike_enum(item: &Annotatable) -> bool {
22-
match *item {
23-
Annotatable::Item(ref item) => {
24-
match item.node {
25-
ItemKind::Enum(ref enum_def, _) => {
26-
enum_def.variants.iter().all(|v|
27-
if let VariantData::Unit(..) = v.node.data {
28-
true
29-
} else {
30-
false
31-
}
32-
)
33-
}
34-
_ => false,
21+
fn is_type_without_fields(item: &Annotatable) -> bool {
22+
if let Annotatable::Item(ref item) = *item {
23+
match item.node {
24+
ItemKind::Enum(ref enum_def, _) => {
25+
enum_def.variants.iter().all(|v| v.node.data.fields().is_empty())
3526
}
27+
ItemKind::Struct(ref variant_data, _) => {
28+
variant_data.fields().is_empty()
29+
}
30+
_ => false
3631
}
37-
_ => false,
32+
} else {
33+
false
3834
}
3935
}
4036

@@ -101,8 +97,10 @@ pub fn expand_deriving_partial_eq(cx: &mut ExtCtxt,
10197
}
10298

10399
// avoid defining `ne` if we can
100+
// c-like enums, enums without any fields and structs without fields
101+
// can safely define only `eq`.
104102
let mut methods = vec![md!("eq", cs_eq)];
105-
if !is_clike_enum(item) {
103+
if !is_type_without_fields(item) {
106104
methods.push(md!("ne", cs_ne));
107105
}
108106

0 commit comments

Comments
 (0)