From 2df529cac5fff53047556662fd2fb98ee590ff9a Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 12 Jan 2017 21:41:27 -0800 Subject: [PATCH] Simplify codegen logic in deserializing seq --- serde_codegen/src/de.rs | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 4658117c..a324582d 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -302,15 +302,15 @@ fn deserialize_seq( fields: &[Field], is_struct: bool, ) -> Tokens { + let vars = (0..fields.len()).map(field_i as fn(_) -> _); + let mut index_in_seq = 0usize; - let let_values = fields.iter() - .enumerate() - .map(|(i, field)| { - let name = Ident::new(format!("__field{}", i)); + let let_values = vars.clone().zip(fields) + .map(|(var, field)| { if field.attrs.skip_deserializing() { let default = expr_is_missing(&field.attrs); quote! { - let #name = #default; + let #var = #default; } } else { let visit = match field.attrs.deserialize_with() { @@ -329,7 +329,7 @@ fn deserialize_seq( } }; let assign = quote! { - let #name = match #visit { + let #var = match #visit { Some(value) => { value }, None => { try!(visitor.end()); @@ -343,20 +343,13 @@ fn deserialize_seq( }); let result = if is_struct { - let args = fields.iter() - .enumerate() - .map(|(i, field)| { - let ident = field.ident.clone().expect("struct contains unnamed fields"); - let value = Ident::new(format!("__field{}", i)); - quote!(#ident: #value) - }); + let names = fields.iter().map(|f| &f.ident); quote! { - #type_path { #(#args),* } + #type_path { #( #names: #vars ),* } } } else { - let args = (0..fields.len()).map(|i| Ident::new(format!("__field{}", i))); quote! { - #type_path ( #(#args),* ) + #type_path ( #(#vars),* ) } }; @@ -871,6 +864,10 @@ fn deserialize_map( } } +fn field_i(i: usize) -> Ident { + Ident::new(format!("__field{}", i)) +} + /// This function wraps the expression in `#[serde(deserialize_with="...")]` in /// a trait to prevent it from accessing the internal `Deserialize` state. fn wrap_deserialize_with(