From ea99e8b68635e2506dc5dfec5e9a0aba41d6652d Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 21 Jan 2017 12:18:55 -0800 Subject: [PATCH] Filter the slice of expected field and variant names --- serde_codegen/src/de.rs | 29 ++++++++++++++++------------- testing/tests/test_annotations.rs | 4 ++-- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 32f186ee..e9771247 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -489,24 +489,25 @@ fn deserialize_item_enum( let type_name = item_attrs.name().deserialize_name(); - let variant_names_idents = variants.iter() + let variant_names_idents: Vec<_> = variants.iter() .enumerate() .filter(|&(_, variant)| !variant.attrs.skip_deserializing()) .map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i))) .collect(); + let variants_stmt = { + let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name); + quote! { + const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ]; + } + }; + let variant_visitor = deserialize_field_visitor( variant_names_idents, item_attrs, true, ); - let variant_names = variants.iter().map(|variant| variant.attrs.name().deserialize_name()); - - let variants_stmt = quote! { - const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ]; - }; - // Match arms to extract a variant from a string let variant_arms = variants.iter() .enumerate() @@ -713,12 +714,19 @@ fn deserialize_struct_visitor( fields: &[Field], item_attrs: &attr::Item, ) -> (Tokens, Tokens, Tokens) { - let field_names_idents = fields.iter() + let field_names_idents: Vec<_> = fields.iter() .enumerate() .filter(|&(_, field)| !field.attrs.skip_deserializing()) .map(|(i, field)| (field.attrs.name().deserialize_name(), field_i(i))) .collect(); + let fields_stmt = { + let field_names = field_names_idents.iter().map(|&(ref name, _)| name); + quote! { + const FIELDS: &'static [&'static str] = &[ #(#field_names),* ]; + } + }; + let field_visitor = deserialize_field_visitor( field_names_idents, item_attrs, @@ -733,11 +741,6 @@ fn deserialize_struct_visitor( item_attrs, ); - let field_names = fields.iter().map(|field| field.attrs.name().deserialize_name()); - let fields_stmt = quote! { - const FIELDS: &'static [&'static str] = &[ #(#field_names),* ]; - }; - (field_visitor, fields_stmt, visit_map) } diff --git a/testing/tests/test_annotations.rs b/testing/tests/test_annotations.rs index 0649a8e7..e1774122 100644 --- a/testing/tests/test_annotations.rs +++ b/testing/tests/test_annotations.rs @@ -145,7 +145,7 @@ fn test_default_enum() { assert_de_tokens( &DefaultEnum::Struct { a1: 1, a2: 2, a3: 3, a4: 0, a5: 123 }, &[ - Token::EnumMapStart("DefaultEnum", "Struct", 5), + Token::EnumMapStart("DefaultEnum", "Struct", 3), Token::EnumMapSep, Token::Str("a1"), @@ -174,7 +174,7 @@ fn test_default_enum() { assert_de_tokens( &DefaultEnum::Struct { a1: 1, a2: 0, a3: 123, a4: 0, a5: 123 }, &[ - Token::EnumMapStart("DefaultEnum", "Struct", 5), + Token::EnumMapStart("DefaultEnum", "Struct", 3), Token::EnumMapSep, Token::Str("a1"),