Fix case of skipped variant followed by other variants

This commit is contained in:
David Tolnay 2017-01-12 23:35:39 -08:00
parent 4ef1128546
commit cb5e7c6264
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
2 changed files with 21 additions and 19 deletions

View File

@ -499,25 +499,27 @@ fn deserialize_item_enum(
};
// Match arms to extract a variant from a string
let mut variant_arms = vec![];
for (i, variant) in variants.iter().filter(|variant| !variant.attrs.skip_deserializing()).enumerate() {
let variant_name = field_i(i);
let variant_arms = variants.iter()
.enumerate()
.filter(|&(_, variant)| !variant.attrs.skip_deserializing())
.map(|(i, variant)| {
let variant_name = field_i(i);
let block = deserialize_variant(
type_ident,
impl_generics,
ty.clone(),
variant,
item_attrs,
);
let block = deserialize_variant(
type_ident,
impl_generics,
ty.clone(),
variant,
item_attrs,
);
let arm = quote! {
__Field::#variant_name => #block
};
variant_arms.push(arm);
}
quote! {
__Field::#variant_name => #block
}
});
let match_variant = if variant_arms.is_empty() {
let all_skipped = variants.iter().all(|variant| variant.attrs.skip_deserializing());
let match_variant = if all_skipped {
// This is an empty enum like `enum Impossible {}` or an enum in which
// all variants have `#[serde(skip_deserializing)]`.
quote! {

View File

@ -42,13 +42,13 @@ struct StructDenyUnknown {
#[derive(PartialEq, Debug, Deserialize)]
enum Enum {
#[allow(dead_code)]
#[serde(skip_deserializing)]
Skipped,
Unit,
Simple(i32),
Seq(i32, i32, i32),
Map { a: i32, b: i32, c: i32 },
#[allow(dead_code)]
#[serde(skip_deserializing)]
Skipped,
}
//////////////////////////////////////////////////////////////////////////