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.
This commit is contained in:
Ulrik Sverdrup
2016-03-01 02:27:27 +01:00
parent 57e0a7e5d8
commit edcc02bfee
3 changed files with 35 additions and 24 deletions

View File

@@ -1638,3 +1638,21 @@ pub fn cs_same_method<F>(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
}
}