From abe305dbfe4a36935fed5fab6593965e934ba6da Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 12 Jan 2017 20:17:02 +0100 Subject: [PATCH 1/4] fix deserialize_struct passing the original field names instead of the renamed ones --- serde_codegen/src/de.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 8eb69970..8c1aace0 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -717,6 +717,7 @@ fn deserialize_struct_visitor( let field_exprs = fields.iter() .map(|field| field.attrs.name().deserialize_name()) .collect(); + let field_names = field_exprs.clone(); let field_visitor = deserialize_field_visitor( field_exprs, @@ -732,10 +733,6 @@ fn deserialize_struct_visitor( item_attrs, ); - let field_names = fields.iter().map(|field| { - field.ident.clone().expect("struct contains unnamed field").to_string() - }); - let fields_stmt = quote! { const FIELDS: &'static [&'static str] = &[ #(#field_names),* ]; }; From 5b668ed87ae326543ef43763761240330892c62e Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 12 Jan 2017 20:17:55 +0100 Subject: [PATCH 2/4] attempt to test the field names, but deem it too complex and opt to at least improve the code --- serde_test/src/de.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/serde_test/src/de.rs b/serde_test/src/de.rs index 39e14faa..2ad0c9be 100644 --- a/serde_test/src/de.rs +++ b/serde_test/src/de.rs @@ -85,12 +85,12 @@ impl Deserializer }) } - fn visit_struct(&mut self, len: Option, mut visitor: V) -> Result + fn visit_struct(&mut self, fields: &'static [&'static str], mut visitor: V) -> Result where V: Visitor, { visitor.visit_map(DeserializerStructVisitor { de: self, - len: len, + len: fields.len(), }) } @@ -433,7 +433,7 @@ impl de::Deserializer for Deserializer Some(&Token::StructStart(n, _)) => { self.tokens.next(); if name == n { - self.visit_struct(Some(fields.len()), visitor) + self.visit_struct(fields, visitor) } else { Err(Error::InvalidName(n)) } @@ -725,7 +725,7 @@ impl<'a, I> MapVisitor for DeserializerMapVisitor<'a, I> struct DeserializerStructVisitor<'a, I: 'a> where I: Iterator> { de: &'a mut Deserializer, - len: Option, + len: usize, } impl<'a, I> MapVisitor for DeserializerStructVisitor<'a, I> @@ -739,7 +739,7 @@ impl<'a, I> MapVisitor for DeserializerStructVisitor<'a, I> match self.de.tokens.peek() { Some(&Token::StructSep) => { self.de.tokens.next(); - self.len = self.len.map(|len| if len > 0 { len - 1} else { 0 }); + self.len = self.len.saturating_sub(1); Ok(Some(try!(Deserialize::deserialize(self.de)))) } Some(&Token::StructEnd) => Ok(None), @@ -767,8 +767,7 @@ impl<'a, I> MapVisitor for DeserializerStructVisitor<'a, I> } fn size_hint(&self) -> (usize, Option) { - let len = self.len.unwrap_or(0); - (len, self.len) + (self.len, Some(self.len)) } } From 8dd06eed2fc18ec0c7e41ddaeb78330ab2209ab0 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 12 Jan 2017 20:19:00 +0100 Subject: [PATCH 3/4] type inference failure --- serde_codegen/src/de.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 8c1aace0..4a9820a0 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -714,7 +714,7 @@ fn deserialize_struct_visitor( fields: &[Field], item_attrs: &attr::Item, ) -> (Tokens, Tokens, Tokens) { - let field_exprs = fields.iter() + let field_exprs: Vec<_> = fields.iter() .map(|field| field.attrs.name().deserialize_name()) .collect(); let field_names = field_exprs.clone(); From a07b6bd9e7cbe5ece3fce0485e2cf57d327c4b9f Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 12 Jan 2017 20:21:59 +0100 Subject: [PATCH 4/4] also use the renamed variant names during deserialization --- serde_codegen/src/de.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 4a9820a0..84cbaa7d 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -503,7 +503,7 @@ fn deserialize_item_enum( true, ); - let variant_names = variants.iter().map(|variant| variant.ident.to_string()); + let variant_names = variants.iter().map(|variant| variant.attrs.name().deserialize_name()); let variants_stmt = quote! { const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];