|
11 | 11 | use deriving::generic::*;
|
12 | 12 | use deriving::generic::ty::*;
|
13 | 13 |
|
14 |
| -use syntax::ast::{MetaItem, Expr, BinOpKind, ItemKind, VariantData}; |
| 14 | +use syntax::ast::{MetaItem, Expr, BinOpKind, ItemKind}; |
15 | 15 | use syntax::codemap::Span;
|
16 | 16 | use syntax::ext::base::{ExtCtxt, Annotatable};
|
17 | 17 | use syntax::ext::build::AstBuilder;
|
18 | 18 | use syntax::parse::token::InternedString;
|
19 | 19 | use syntax::ptr::P;
|
20 | 20 |
|
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()) |
35 | 26 | }
|
| 27 | + ItemKind::Struct(ref variant_data, _) => { |
| 28 | + variant_data.fields().is_empty() |
| 29 | + } |
| 30 | + _ => false |
36 | 31 | }
|
37 |
| - _ => false, |
| 32 | + } else { |
| 33 | + false |
38 | 34 | }
|
39 | 35 | }
|
40 | 36 |
|
@@ -101,8 +97,10 @@ pub fn expand_deriving_partial_eq(cx: &mut ExtCtxt,
|
101 | 97 | }
|
102 | 98 |
|
103 | 99 | // avoid defining `ne` if we can
|
| 100 | + // c-like enums, enums without any fields and structs without fields |
| 101 | + // can safely define only `eq`. |
104 | 102 | let mut methods = vec![md!("eq", cs_eq)];
|
105 |
| - if !is_clike_enum(item) { |
| 103 | + if !is_type_without_fields(item) { |
106 | 104 | methods.push(md!("ne", cs_ne));
|
107 | 105 | }
|
108 | 106 |
|
|
0 commit comments