From edcc02bfee262ce8bc3f087d9793ce68d73b1a40 Mon Sep 17 00:00:00 2001 From: Ulrik Sverdrup Date: Tue, 1 Mar 2016 02:27:27 +0100 Subject: derive: Emit only PartialOrd::partial_cmp for simple enums Using the same logic as for `PartialEq`, when possible define only `partial_cmp` and leave `lt, le, gt, ge` to their default implementations. This works well for c-like enums. --- src/libsyntax_ext/deriving/generic/mod.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/libsyntax_ext/deriving/generic') diff --git a/src/libsyntax_ext/deriving/generic/mod.rs b/src/libsyntax_ext/deriving/generic/mod.rs index c0237a5d29a..e8954b1a2fc 100644 --- a/src/libsyntax_ext/deriving/generic/mod.rs +++ b/src/libsyntax_ext/deriving/generic/mod.rs @@ -1638,3 +1638,21 @@ pub fn cs_same_method(f: F, } } } + +/// Return true if the type has no value fields +/// (for an enum, no variant has any fields) +pub fn is_type_without_fields(item: &Annotatable) -> bool { + if let Annotatable::Item(ref item) = *item { + match item.node { + ast::ItemKind::Enum(ref enum_def, _) => { + enum_def.variants.iter().all(|v| v.node.data.fields().is_empty()) + } + ast::ItemKind::Struct(ref variant_data, _) => { + variant_data.fields().is_empty() + } + _ => false + } + } else { + false + } +} -- cgit 1.4.1-3-g733a5