1 use proc_macro2::{Literal, Span, TokenStream};
2 use quote::ToTokens;
3 use syn::punctuated::Punctuated;
4 use syn::spanned::Spanned;
5 use syn::{self, Ident, Index, Member};
6 
7 use bound;
8 use dummy;
9 use fragment::{Expr, Fragment, Match, Stmts};
10 use internals::ast::{Container, Data, Field, Style, Variant};
11 use internals::{attr, Ctxt, Derive};
12 use pretend;
13 
14 use std::collections::BTreeSet;
15 
expand_derive_deserialize(input: &syn::DeriveInput) -> Result<TokenStream, Vec<syn::Error>>16 pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<TokenStream, Vec<syn::Error>> {
17     let ctxt = Ctxt::new();
18     let cont = match Container::from_ast(&ctxt, input, Derive::Deserialize) {
19         Some(cont) => cont,
20         None => return Err(ctxt.check().unwrap_err()),
21     };
22     precondition(&ctxt, &cont);
23     ctxt.check()?;
24 
25     let ident = &cont.ident;
26     let params = Parameters::new(&cont);
27     let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(&params);
28     let body = Stmts(deserialize_body(&cont, &params));
29     let delife = params.borrowed.de_lifetime();
30     let serde = cont.attrs.serde_path();
31 
32     let impl_block = if let Some(remote) = cont.attrs.remote() {
33         let vis = &input.vis;
34         let used = pretend::pretend_used(&cont);
35         quote! {
36             impl #de_impl_generics #ident #ty_generics #where_clause {
37                 #vis fn deserialize<__D>(__deserializer: __D) -> #serde::export::Result<#remote #ty_generics, __D::Error>
38                 where
39                     __D: #serde::Deserializer<#delife>,
40                 {
41                     #used
42                     #body
43                 }
44             }
45         }
46     } else {
47         let fn_deserialize_in_place = deserialize_in_place_body(&cont, &params);
48 
49         quote! {
50             #[automatically_derived]
51             impl #de_impl_generics #serde::Deserialize<#delife> for #ident #ty_generics #where_clause {
52                 fn deserialize<__D>(__deserializer: __D) -> #serde::export::Result<Self, __D::Error>
53                 where
54                     __D: #serde::Deserializer<#delife>,
55                 {
56                     #body
57                 }
58 
59                 #fn_deserialize_in_place
60             }
61         }
62     };
63 
64     Ok(dummy::wrap_in_const(
65         cont.attrs.custom_serde_path(),
66         "DESERIALIZE",
67         ident,
68         impl_block,
69     ))
70 }
71 
precondition(cx: &Ctxt, cont: &Container)72 fn precondition(cx: &Ctxt, cont: &Container) {
73     precondition_sized(cx, cont);
74     precondition_no_de_lifetime(cx, cont);
75 }
76 
precondition_sized(cx: &Ctxt, cont: &Container)77 fn precondition_sized(cx: &Ctxt, cont: &Container) {
78     if let Data::Struct(_, fields) = &cont.data {
79         if let Some(last) = fields.last() {
80             if let syn::Type::Slice(_) = *last.ty {
81                 cx.error_spanned_by(
82                     cont.original,
83                     "cannot deserialize a dynamically sized struct",
84                 );
85             }
86         }
87     }
88 }
89 
precondition_no_de_lifetime(cx: &Ctxt, cont: &Container)90 fn precondition_no_de_lifetime(cx: &Ctxt, cont: &Container) {
91     if let BorrowedLifetimes::Borrowed(_) = borrowed_lifetimes(cont) {
92         for param in cont.generics.lifetimes() {
93             if param.lifetime.to_string() == "'de" {
94                 cx.error_spanned_by(
95                     &param.lifetime,
96                     "cannot deserialize when there is a lifetime parameter called 'de",
97                 );
98                 return;
99             }
100         }
101     }
102 }
103 
104 struct Parameters {
105     /// Name of the type the `derive` is on.
106     local: syn::Ident,
107 
108     /// Path to the type the impl is for. Either a single `Ident` for local
109     /// types or `some::remote::Ident` for remote types. Does not include
110     /// generic parameters.
111     this: syn::Path,
112 
113     /// Generics including any explicit and inferred bounds for the impl.
114     generics: syn::Generics,
115 
116     /// Lifetimes borrowed from the deserializer. These will become bounds on
117     /// the `'de` lifetime of the deserializer.
118     borrowed: BorrowedLifetimes,
119 
120     /// At least one field has a serde(getter) attribute, implying that the
121     /// remote type has a private field.
122     has_getter: bool,
123 }
124 
125 impl Parameters {
new(cont: &Container) -> Self126     fn new(cont: &Container) -> Self {
127         let local = cont.ident.clone();
128         let this = match cont.attrs.remote() {
129             Some(remote) => remote.clone(),
130             None => cont.ident.clone().into(),
131         };
132         let borrowed = borrowed_lifetimes(cont);
133         let generics = build_generics(cont, &borrowed);
134         let has_getter = cont.data.has_getter();
135 
136         Parameters {
137             local,
138             this,
139             generics,
140             borrowed,
141             has_getter,
142         }
143     }
144 
145     /// Type name to use in error messages and `&'static str` arguments to
146     /// various Deserializer methods.
type_name(&self) -> String147     fn type_name(&self) -> String {
148         self.this.segments.last().unwrap().ident.to_string()
149     }
150 }
151 
152 // All the generics in the input, plus a bound `T: Deserialize` for each generic
153 // field type that will be deserialized by us, plus a bound `T: Default` for
154 // each generic field type that will be set to a default value.
build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generics155 fn build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generics {
156     let generics = bound::without_defaults(cont.generics);
157 
158     let generics = bound::with_where_predicates_from_fields(cont, &generics, attr::Field::de_bound);
159 
160     let generics =
161         bound::with_where_predicates_from_variants(cont, &generics, attr::Variant::de_bound);
162 
163     match cont.attrs.de_bound() {
164         Some(predicates) => bound::with_where_predicates(&generics, predicates),
165         None => {
166             let generics = match *cont.attrs.default() {
167                 attr::Default::Default => {
168                     bound::with_self_bound(cont, &generics, &parse_quote!(_serde::export::Default))
169                 }
170                 attr::Default::None | attr::Default::Path(_) => generics,
171             };
172 
173             let delife = borrowed.de_lifetime();
174             let generics = bound::with_bound(
175                 cont,
176                 &generics,
177                 needs_deserialize_bound,
178                 &parse_quote!(_serde::Deserialize<#delife>),
179             );
180 
181             bound::with_bound(
182                 cont,
183                 &generics,
184                 requires_default,
185                 &parse_quote!(_serde::export::Default),
186             )
187         }
188     }
189 }
190 
191 // Fields with a `skip_deserializing` or `deserialize_with` attribute, or which
192 // belong to a variant with a `skip_deserializing` or `deserialize_with`
193 // attribute, are not deserialized by us so we do not generate a bound. Fields
194 // with a `bound` attribute specify their own bound so we do not generate one.
195 // All other fields may need a `T: Deserialize` bound where T is the type of the
196 // field.
needs_deserialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool197 fn needs_deserialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
198     !field.skip_deserializing()
199         && field.deserialize_with().is_none()
200         && field.de_bound().is_none()
201         && variant.map_or(true, |variant| {
202             !variant.skip_deserializing()
203                 && variant.deserialize_with().is_none()
204                 && variant.de_bound().is_none()
205         })
206 }
207 
208 // Fields with a `default` attribute (not `default=...`), and fields with a
209 // `skip_deserializing` attribute that do not also have `default=...`.
requires_default(field: &attr::Field, _variant: Option<&attr::Variant>) -> bool210 fn requires_default(field: &attr::Field, _variant: Option<&attr::Variant>) -> bool {
211     if let attr::Default::Default = *field.default() {
212         true
213     } else {
214         false
215     }
216 }
217 
218 enum BorrowedLifetimes {
219     Borrowed(BTreeSet<syn::Lifetime>),
220     Static,
221 }
222 
223 impl BorrowedLifetimes {
de_lifetime(&self) -> syn::Lifetime224     fn de_lifetime(&self) -> syn::Lifetime {
225         match *self {
226             BorrowedLifetimes::Borrowed(_) => syn::Lifetime::new("'de", Span::call_site()),
227             BorrowedLifetimes::Static => syn::Lifetime::new("'static", Span::call_site()),
228         }
229     }
230 
de_lifetime_def(&self) -> Option<syn::LifetimeDef>231     fn de_lifetime_def(&self) -> Option<syn::LifetimeDef> {
232         match self {
233             BorrowedLifetimes::Borrowed(bounds) => Some(syn::LifetimeDef {
234                 attrs: Vec::new(),
235                 lifetime: syn::Lifetime::new("'de", Span::call_site()),
236                 colon_token: None,
237                 bounds: bounds.iter().cloned().collect(),
238             }),
239             BorrowedLifetimes::Static => None,
240         }
241     }
242 }
243 
244 // The union of lifetimes borrowed by each field of the container.
245 //
246 // These turn into bounds on the `'de` lifetime of the Deserialize impl. If
247 // lifetimes `'a` and `'b` are borrowed but `'c` is not, the impl is:
248 //
249 //     impl<'de: 'a + 'b, 'a, 'b, 'c> Deserialize<'de> for S<'a, 'b, 'c>
250 //
251 // If any borrowed lifetime is `'static`, then `'de: 'static` would be redundant
252 // and we use plain `'static` instead of `'de`.
borrowed_lifetimes(cont: &Container) -> BorrowedLifetimes253 fn borrowed_lifetimes(cont: &Container) -> BorrowedLifetimes {
254     let mut lifetimes = BTreeSet::new();
255     for field in cont.data.all_fields() {
256         if !field.attrs.skip_deserializing() {
257             lifetimes.extend(field.attrs.borrowed_lifetimes().iter().cloned());
258         }
259     }
260     if lifetimes.iter().any(|b| b.to_string() == "'static") {
261         BorrowedLifetimes::Static
262     } else {
263         BorrowedLifetimes::Borrowed(lifetimes)
264     }
265 }
266 
deserialize_body(cont: &Container, params: &Parameters) -> Fragment267 fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
268     if cont.attrs.transparent() {
269         deserialize_transparent(cont, params)
270     } else if let Some(type_from) = cont.attrs.type_from() {
271         deserialize_from(type_from)
272     } else if let Some(type_try_from) = cont.attrs.type_try_from() {
273         deserialize_try_from(type_try_from)
274     } else if let attr::Identifier::No = cont.attrs.identifier() {
275         match &cont.data {
276             Data::Enum(variants) => deserialize_enum(params, variants, &cont.attrs),
277             Data::Struct(Style::Struct, fields) => {
278                 deserialize_struct(None, params, fields, &cont.attrs, None, &Untagged::No)
279             }
280             Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => {
281                 deserialize_tuple(None, params, fields, &cont.attrs, None)
282             }
283             Data::Struct(Style::Unit, _) => deserialize_unit_struct(params, &cont.attrs),
284         }
285     } else {
286         match &cont.data {
287             Data::Enum(variants) => deserialize_custom_identifier(params, variants, &cont.attrs),
288             Data::Struct(_, _) => unreachable!("checked in serde_derive_internals"),
289         }
290     }
291 }
292 
293 #[cfg(feature = "deserialize_in_place")]
deserialize_in_place_body(cont: &Container, params: &Parameters) -> Option<Stmts>294 fn deserialize_in_place_body(cont: &Container, params: &Parameters) -> Option<Stmts> {
295     // Only remote derives have getters, and we do not generate
296     // deserialize_in_place for remote derives.
297     assert!(!params.has_getter);
298 
299     if cont.attrs.transparent()
300         || cont.attrs.type_from().is_some()
301         || cont.attrs.type_try_from().is_some()
302         || cont.attrs.identifier().is_some()
303         || cont
304             .data
305             .all_fields()
306             .all(|f| f.attrs.deserialize_with().is_some())
307     {
308         return None;
309     }
310 
311     let code = match &cont.data {
312         Data::Struct(Style::Struct, fields) => {
313             deserialize_struct_in_place(None, params, fields, &cont.attrs, None)?
314         }
315         Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => {
316             deserialize_tuple_in_place(None, params, fields, &cont.attrs, None)
317         }
318         Data::Enum(_) | Data::Struct(Style::Unit, _) => {
319             return None;
320         }
321     };
322 
323     let delife = params.borrowed.de_lifetime();
324     let stmts = Stmts(code);
325 
326     let fn_deserialize_in_place = quote_block! {
327         fn deserialize_in_place<__D>(__deserializer: __D, __place: &mut Self) -> _serde::export::Result<(), __D::Error>
328         where
329             __D: _serde::Deserializer<#delife>,
330         {
331             #stmts
332         }
333     };
334 
335     Some(Stmts(fn_deserialize_in_place))
336 }
337 
338 #[cfg(not(feature = "deserialize_in_place"))]
deserialize_in_place_body(_cont: &Container, _params: &Parameters) -> Option<Stmts>339 fn deserialize_in_place_body(_cont: &Container, _params: &Parameters) -> Option<Stmts> {
340     None
341 }
342 
deserialize_transparent(cont: &Container, params: &Parameters) -> Fragment343 fn deserialize_transparent(cont: &Container, params: &Parameters) -> Fragment {
344     let fields = match &cont.data {
345         Data::Struct(_, fields) => fields,
346         Data::Enum(_) => unreachable!(),
347     };
348 
349     let this = &params.this;
350     let transparent_field = fields.iter().find(|f| f.attrs.transparent()).unwrap();
351 
352     let path = match transparent_field.attrs.deserialize_with() {
353         Some(path) => quote!(#path),
354         None => {
355             let span = transparent_field.original.span();
356             quote_spanned!(span=> _serde::Deserialize::deserialize)
357         }
358     };
359 
360     let assign = fields.iter().map(|field| {
361         let member = &field.member;
362         if field as *const Field == transparent_field as *const Field {
363             quote!(#member: __transparent)
364         } else {
365             let value = match field.attrs.default() {
366                 attr::Default::Default => quote!(_serde::export::Default::default()),
367                 attr::Default::Path(path) => quote!(#path()),
368                 attr::Default::None => quote!(_serde::export::PhantomData),
369             };
370             quote!(#member: #value)
371         }
372     });
373 
374     quote_block! {
375         _serde::export::Result::map(
376             #path(__deserializer),
377             |__transparent| #this { #(#assign),* })
378     }
379 }
380 
deserialize_from(type_from: &syn::Type) -> Fragment381 fn deserialize_from(type_from: &syn::Type) -> Fragment {
382     quote_block! {
383         _serde::export::Result::map(
384             <#type_from as _serde::Deserialize>::deserialize(__deserializer),
385             _serde::export::From::from)
386     }
387 }
388 
deserialize_try_from(type_try_from: &syn::Type) -> Fragment389 fn deserialize_try_from(type_try_from: &syn::Type) -> Fragment {
390     quote_block! {
391         _serde::export::Result::and_then(
392             <#type_try_from as _serde::Deserialize>::deserialize(__deserializer),
393             |v| _serde::export::TryFrom::try_from(v).map_err(_serde::de::Error::custom))
394     }
395 }
396 
deserialize_unit_struct(params: &Parameters, cattrs: &attr::Container) -> Fragment397 fn deserialize_unit_struct(params: &Parameters, cattrs: &attr::Container) -> Fragment {
398     let this = &params.this;
399     let type_name = cattrs.name().deserialize_name();
400 
401     let expecting = format!("unit struct {}", params.type_name());
402 
403     quote_block! {
404         struct __Visitor;
405 
406         impl<'de> _serde::de::Visitor<'de> for __Visitor {
407             type Value = #this;
408 
409             fn expecting(&self, __formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
410                 _serde::export::Formatter::write_str(__formatter, #expecting)
411             }
412 
413             #[inline]
414             fn visit_unit<__E>(self) -> _serde::export::Result<Self::Value, __E>
415             where
416                 __E: _serde::de::Error,
417             {
418                 _serde::export::Ok(#this)
419             }
420         }
421 
422         _serde::Deserializer::deserialize_unit_struct(__deserializer, #type_name, __Visitor)
423     }
424 }
425 
deserialize_tuple( variant_ident: Option<&syn::Ident>, params: &Parameters, fields: &[Field], cattrs: &attr::Container, deserializer: Option<TokenStream>, ) -> Fragment426 fn deserialize_tuple(
427     variant_ident: Option<&syn::Ident>,
428     params: &Parameters,
429     fields: &[Field],
430     cattrs: &attr::Container,
431     deserializer: Option<TokenStream>,
432 ) -> Fragment {
433     let this = &params.this;
434     let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
435         split_with_de_lifetime(params);
436     let delife = params.borrowed.de_lifetime();
437 
438     assert!(!cattrs.has_flatten());
439 
440     // If there are getters (implying private fields), construct the local type
441     // and use an `Into` conversion to get the remote type. If there are no
442     // getters then construct the target type directly.
443     let construct = if params.has_getter {
444         let local = &params.local;
445         quote!(#local)
446     } else {
447         quote!(#this)
448     };
449 
450     let is_enum = variant_ident.is_some();
451     let type_path = match variant_ident {
452         Some(variant_ident) => quote!(#construct::#variant_ident),
453         None => construct,
454     };
455     let expecting = match variant_ident {
456         Some(variant_ident) => format!("tuple variant {}::{}", params.type_name(), variant_ident),
457         None => format!("tuple struct {}", params.type_name()),
458     };
459 
460     let nfields = fields.len();
461 
462     let visit_newtype_struct = if !is_enum && nfields == 1 {
463         Some(deserialize_newtype_struct(&type_path, params, &fields[0]))
464     } else {
465         None
466     };
467 
468     let visit_seq = Stmts(deserialize_seq(
469         &type_path, params, fields, false, cattrs, &expecting,
470     ));
471 
472     let visitor_expr = quote! {
473         __Visitor {
474             marker: _serde::export::PhantomData::<#this #ty_generics>,
475             lifetime: _serde::export::PhantomData,
476         }
477     };
478     let dispatch = if let Some(deserializer) = deserializer {
479         quote!(_serde::Deserializer::deserialize_tuple(#deserializer, #nfields, #visitor_expr))
480     } else if is_enum {
481         quote!(_serde::de::VariantAccess::tuple_variant(__variant, #nfields, #visitor_expr))
482     } else if nfields == 1 {
483         let type_name = cattrs.name().deserialize_name();
484         quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
485     } else {
486         let type_name = cattrs.name().deserialize_name();
487         quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #nfields, #visitor_expr))
488     };
489 
490     let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
491     let visitor_var = if all_skipped {
492         quote!(_)
493     } else {
494         quote!(mut __seq)
495     };
496 
497     quote_block! {
498         struct __Visitor #de_impl_generics #where_clause {
499             marker: _serde::export::PhantomData<#this #ty_generics>,
500             lifetime: _serde::export::PhantomData<&#delife ()>,
501         }
502 
503         impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
504             type Value = #this #ty_generics;
505 
506             fn expecting(&self, __formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
507                 _serde::export::Formatter::write_str(__formatter, #expecting)
508             }
509 
510             #visit_newtype_struct
511 
512             #[inline]
513             fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
514             where
515                 __A: _serde::de::SeqAccess<#delife>,
516             {
517                 #visit_seq
518             }
519         }
520 
521         #dispatch
522     }
523 }
524 
525 #[cfg(feature = "deserialize_in_place")]
deserialize_tuple_in_place( variant_ident: Option<syn::Ident>, params: &Parameters, fields: &[Field], cattrs: &attr::Container, deserializer: Option<TokenStream>, ) -> Fragment526 fn deserialize_tuple_in_place(
527     variant_ident: Option<syn::Ident>,
528     params: &Parameters,
529     fields: &[Field],
530     cattrs: &attr::Container,
531     deserializer: Option<TokenStream>,
532 ) -> Fragment {
533     let this = &params.this;
534     let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
535         split_with_de_lifetime(params);
536     let delife = params.borrowed.de_lifetime();
537 
538     assert!(!cattrs.has_flatten());
539 
540     let is_enum = variant_ident.is_some();
541     let expecting = match variant_ident {
542         Some(variant_ident) => format!("tuple variant {}::{}", params.type_name(), variant_ident),
543         None => format!("tuple struct {}", params.type_name()),
544     };
545 
546     let nfields = fields.len();
547 
548     let visit_newtype_struct = if !is_enum && nfields == 1 {
549         Some(deserialize_newtype_struct_in_place(params, &fields[0]))
550     } else {
551         None
552     };
553 
554     let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, &expecting));
555 
556     let visitor_expr = quote! {
557         __Visitor {
558             place: __place,
559             lifetime: _serde::export::PhantomData,
560         }
561     };
562 
563     let dispatch = if let Some(deserializer) = deserializer {
564         quote!(_serde::Deserializer::deserialize_tuple(#deserializer, #nfields, #visitor_expr))
565     } else if is_enum {
566         quote!(_serde::de::VariantAccess::tuple_variant(__variant, #nfields, #visitor_expr))
567     } else if nfields == 1 {
568         let type_name = cattrs.name().deserialize_name();
569         quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
570     } else {
571         let type_name = cattrs.name().deserialize_name();
572         quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #nfields, #visitor_expr))
573     };
574 
575     let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
576     let visitor_var = if all_skipped {
577         quote!(_)
578     } else {
579         quote!(mut __seq)
580     };
581 
582     let in_place_impl_generics = de_impl_generics.in_place();
583     let in_place_ty_generics = de_ty_generics.in_place();
584     let place_life = place_lifetime();
585 
586     quote_block! {
587         struct __Visitor #in_place_impl_generics #where_clause {
588             place: &#place_life mut #this #ty_generics,
589             lifetime: _serde::export::PhantomData<&#delife ()>,
590         }
591 
592         impl #in_place_impl_generics _serde::de::Visitor<#delife> for __Visitor #in_place_ty_generics #where_clause {
593             type Value = ();
594 
595             fn expecting(&self, __formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
596                 _serde::export::Formatter::write_str(__formatter, #expecting)
597             }
598 
599             #visit_newtype_struct
600 
601             #[inline]
602             fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
603             where
604                 __A: _serde::de::SeqAccess<#delife>,
605             {
606                 #visit_seq
607             }
608         }
609 
610         #dispatch
611     }
612 }
613 
deserialize_seq( type_path: &TokenStream, params: &Parameters, fields: &[Field], is_struct: bool, cattrs: &attr::Container, expecting: &str, ) -> Fragment614 fn deserialize_seq(
615     type_path: &TokenStream,
616     params: &Parameters,
617     fields: &[Field],
618     is_struct: bool,
619     cattrs: &attr::Container,
620     expecting: &str,
621 ) -> Fragment {
622     let vars = (0..fields.len()).map(field_i as fn(_) -> _);
623 
624     let deserialized_count = fields
625         .iter()
626         .filter(|field| !field.attrs.skip_deserializing())
627         .count();
628     let expecting = if deserialized_count == 1 {
629         format!("{} with 1 element", expecting)
630     } else {
631         format!("{} with {} elements", expecting, deserialized_count)
632     };
633 
634     let mut index_in_seq = 0_usize;
635     let let_values = vars.clone().zip(fields).map(|(var, field)| {
636         if field.attrs.skip_deserializing() {
637             let default = Expr(expr_is_missing(field, cattrs));
638             quote! {
639                 let #var = #default;
640             }
641         } else {
642             let visit = match field.attrs.deserialize_with() {
643                 None => {
644                     let field_ty = field.ty;
645                     let span = field.original.span();
646                     let func =
647                         quote_spanned!(span=> _serde::de::SeqAccess::next_element::<#field_ty>);
648                     quote!(try!(#func(&mut __seq)))
649                 }
650                 Some(path) => {
651                     let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
652                     quote!({
653                         #wrapper
654                         _serde::export::Option::map(
655                             try!(_serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)),
656                             |__wrap| __wrap.value)
657                     })
658                 }
659             };
660             let value_if_none = match field.attrs.default() {
661                 attr::Default::Default => quote!(_serde::export::Default::default()),
662                 attr::Default::Path(path) => quote!(#path()),
663                 attr::Default::None => quote!(
664                     return _serde::export::Err(_serde::de::Error::invalid_length(#index_in_seq, &#expecting));
665                 ),
666             };
667             let assign = quote! {
668                 let #var = match #visit {
669                     _serde::export::Some(__value) => __value,
670                     _serde::export::None => {
671                         #value_if_none
672                     }
673                 };
674             };
675             index_in_seq += 1;
676             assign
677         }
678     });
679 
680     let mut result = if is_struct {
681         let names = fields.iter().map(|f| &f.member);
682         quote! {
683             #type_path { #( #names: #vars ),* }
684         }
685     } else {
686         quote! {
687             #type_path ( #(#vars),* )
688         }
689     };
690 
691     if params.has_getter {
692         let this = &params.this;
693         result = quote! {
694             _serde::export::Into::<#this>::into(#result)
695         };
696     }
697 
698     let let_default = match cattrs.default() {
699         attr::Default::Default => Some(quote!(
700             let __default: Self::Value = _serde::export::Default::default();
701         )),
702         attr::Default::Path(path) => Some(quote!(
703             let __default: Self::Value = #path();
704         )),
705         attr::Default::None => {
706             // We don't need the default value, to prevent an unused variable warning
707             // we'll leave the line empty.
708             None
709         }
710     };
711 
712     quote_block! {
713         #let_default
714         #(#let_values)*
715         _serde::export::Ok(#result)
716     }
717 }
718 
719 #[cfg(feature = "deserialize_in_place")]
deserialize_seq_in_place( params: &Parameters, fields: &[Field], cattrs: &attr::Container, expecting: &str, ) -> Fragment720 fn deserialize_seq_in_place(
721     params: &Parameters,
722     fields: &[Field],
723     cattrs: &attr::Container,
724     expecting: &str,
725 ) -> Fragment {
726     let deserialized_count = fields
727         .iter()
728         .filter(|field| !field.attrs.skip_deserializing())
729         .count();
730     let expecting = if deserialized_count == 1 {
731         format!("{} with 1 element", expecting)
732     } else {
733         format!("{} with {} elements", expecting, deserialized_count)
734     };
735 
736     let mut index_in_seq = 0usize;
737     let write_values = fields.iter().map(|field| {
738         let member = &field.member;
739 
740         if field.attrs.skip_deserializing() {
741             let default = Expr(expr_is_missing(field, cattrs));
742             quote! {
743                 self.place.#member = #default;
744             }
745         } else {
746             let value_if_none = match field.attrs.default() {
747                 attr::Default::Default => quote!(
748                     self.place.#member = _serde::export::Default::default();
749                 ),
750                 attr::Default::Path(path) => quote!(
751                     self.place.#member = #path();
752                 ),
753                 attr::Default::None => quote!(
754                     return _serde::export::Err(_serde::de::Error::invalid_length(#index_in_seq, &#expecting));
755                 ),
756             };
757             let write = match field.attrs.deserialize_with() {
758                 None => {
759                     quote! {
760                         if let _serde::export::None = try!(_serde::de::SeqAccess::next_element_seed(&mut __seq,
761                             _serde::private::de::InPlaceSeed(&mut self.place.#member)))
762                         {
763                             #value_if_none
764                         }
765                     }
766                 }
767                 Some(path) => {
768                     let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
769                     quote!({
770                         #wrapper
771                         match try!(_serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)) {
772                             _serde::export::Some(__wrap) => {
773                                 self.place.#member = __wrap.value;
774                             }
775                             _serde::export::None => {
776                                 #value_if_none
777                             }
778                         }
779                     })
780                 }
781             };
782             index_in_seq += 1;
783             write
784         }
785     });
786 
787     let this = &params.this;
788     let (_, ty_generics, _) = params.generics.split_for_impl();
789     let let_default = match cattrs.default() {
790         attr::Default::Default => Some(quote!(
791             let __default: #this #ty_generics  = _serde::export::Default::default();
792         )),
793         attr::Default::Path(path) => Some(quote!(
794             let __default: #this #ty_generics  = #path();
795         )),
796         attr::Default::None => {
797             // We don't need the default value, to prevent an unused variable warning
798             // we'll leave the line empty.
799             None
800         }
801     };
802 
803     quote_block! {
804         #let_default
805         #(#write_values)*
806         _serde::export::Ok(())
807     }
808 }
809 
deserialize_newtype_struct( type_path: &TokenStream, params: &Parameters, field: &Field, ) -> TokenStream810 fn deserialize_newtype_struct(
811     type_path: &TokenStream,
812     params: &Parameters,
813     field: &Field,
814 ) -> TokenStream {
815     let delife = params.borrowed.de_lifetime();
816     let field_ty = field.ty;
817 
818     let value = match field.attrs.deserialize_with() {
819         None => {
820             let span = field.original.span();
821             let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);
822             quote! {
823                 try!(#func(__e))
824             }
825         }
826         Some(path) => {
827             quote! {
828                 try!(#path(__e))
829             }
830         }
831     };
832 
833     let mut result = quote!(#type_path(__field0));
834     if params.has_getter {
835         let this = &params.this;
836         result = quote! {
837             _serde::export::Into::<#this>::into(#result)
838         };
839     }
840 
841     quote! {
842         #[inline]
843         fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::export::Result<Self::Value, __E::Error>
844         where
845             __E: _serde::Deserializer<#delife>,
846         {
847             let __field0: #field_ty = #value;
848             _serde::export::Ok(#result)
849         }
850     }
851 }
852 
853 #[cfg(feature = "deserialize_in_place")]
deserialize_newtype_struct_in_place(params: &Parameters, field: &Field) -> TokenStream854 fn deserialize_newtype_struct_in_place(params: &Parameters, field: &Field) -> TokenStream {
855     // We do not generate deserialize_in_place if every field has a
856     // deserialize_with.
857     assert!(field.attrs.deserialize_with().is_none());
858 
859     let delife = params.borrowed.de_lifetime();
860 
861     quote! {
862         #[inline]
863         fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::export::Result<Self::Value, __E::Error>
864         where
865             __E: _serde::Deserializer<#delife>,
866         {
867             _serde::Deserialize::deserialize_in_place(__e, &mut self.place.0)
868         }
869     }
870 }
871 
872 enum Untagged {
873     Yes,
874     No,
875 }
876 
deserialize_struct( variant_ident: Option<&syn::Ident>, params: &Parameters, fields: &[Field], cattrs: &attr::Container, deserializer: Option<TokenStream>, untagged: &Untagged, ) -> Fragment877 fn deserialize_struct(
878     variant_ident: Option<&syn::Ident>,
879     params: &Parameters,
880     fields: &[Field],
881     cattrs: &attr::Container,
882     deserializer: Option<TokenStream>,
883     untagged: &Untagged,
884 ) -> Fragment {
885     let is_enum = variant_ident.is_some();
886 
887     let this = &params.this;
888     let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
889         split_with_de_lifetime(params);
890     let delife = params.borrowed.de_lifetime();
891 
892     // If there are getters (implying private fields), construct the local type
893     // and use an `Into` conversion to get the remote type. If there are no
894     // getters then construct the target type directly.
895     let construct = if params.has_getter {
896         let local = &params.local;
897         quote!(#local)
898     } else {
899         quote!(#this)
900     };
901 
902     let type_path = match variant_ident {
903         Some(variant_ident) => quote!(#construct::#variant_ident),
904         None => construct,
905     };
906     let expecting = match variant_ident {
907         Some(variant_ident) => format!("struct variant {}::{}", params.type_name(), variant_ident),
908         None => format!("struct {}", params.type_name()),
909     };
910 
911     let visit_seq = Stmts(deserialize_seq(
912         &type_path, params, fields, true, cattrs, &expecting,
913     ));
914 
915     let (field_visitor, fields_stmt, visit_map) = if cattrs.has_flatten() {
916         deserialize_struct_as_map_visitor(&type_path, params, fields, cattrs)
917     } else {
918         deserialize_struct_as_struct_visitor(&type_path, params, fields, cattrs)
919     };
920     let field_visitor = Stmts(field_visitor);
921     let fields_stmt = fields_stmt.map(Stmts);
922     let visit_map = Stmts(visit_map);
923 
924     let visitor_expr = quote! {
925         __Visitor {
926             marker: _serde::export::PhantomData::<#this #ty_generics>,
927             lifetime: _serde::export::PhantomData,
928         }
929     };
930     let dispatch = if let Some(deserializer) = deserializer {
931         quote! {
932             _serde::Deserializer::deserialize_any(#deserializer, #visitor_expr)
933         }
934     } else if is_enum && cattrs.has_flatten() {
935         quote! {
936             _serde::de::VariantAccess::newtype_variant_seed(__variant, #visitor_expr)
937         }
938     } else if is_enum {
939         quote! {
940             _serde::de::VariantAccess::struct_variant(__variant, FIELDS, #visitor_expr)
941         }
942     } else if cattrs.has_flatten() {
943         quote! {
944             _serde::Deserializer::deserialize_map(__deserializer, #visitor_expr)
945         }
946     } else {
947         let type_name = cattrs.name().deserialize_name();
948         quote! {
949             _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, #visitor_expr)
950         }
951     };
952 
953     let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
954     let visitor_var = if all_skipped {
955         quote!(_)
956     } else {
957         quote!(mut __seq)
958     };
959 
960     // untagged struct variants do not get a visit_seq method. The same applies to
961     // structs that only have a map representation.
962     let visit_seq = match *untagged {
963         Untagged::No if !cattrs.has_flatten() => Some(quote! {
964             #[inline]
965             fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
966             where
967                 __A: _serde::de::SeqAccess<#delife>,
968             {
969                 #visit_seq
970             }
971         }),
972         _ => None,
973     };
974 
975     let visitor_seed = if is_enum && cattrs.has_flatten() {
976         Some(quote! {
977             impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Visitor #de_ty_generics #where_clause {
978                 type Value = #this #ty_generics;
979 
980                 fn deserialize<__D>(self, __deserializer: __D) -> _serde::export::Result<Self::Value, __D::Error>
981                 where
982                     __D: _serde::Deserializer<'de>,
983                 {
984                     _serde::Deserializer::deserialize_map(__deserializer, self)
985                 }
986             }
987         })
988     } else {
989         None
990     };
991 
992     quote_block! {
993         #field_visitor
994 
995         struct __Visitor #de_impl_generics #where_clause {
996             marker: _serde::export::PhantomData<#this #ty_generics>,
997             lifetime: _serde::export::PhantomData<&#delife ()>,
998         }
999 
1000         impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
1001             type Value = #this #ty_generics;
1002 
1003             fn expecting(&self, __formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
1004                 _serde::export::Formatter::write_str(__formatter, #expecting)
1005             }
1006 
1007             #visit_seq
1008 
1009             #[inline]
1010             fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
1011             where
1012                 __A: _serde::de::MapAccess<#delife>,
1013             {
1014                 #visit_map
1015             }
1016         }
1017 
1018         #visitor_seed
1019 
1020         #fields_stmt
1021 
1022         #dispatch
1023     }
1024 }
1025 
1026 #[cfg(feature = "deserialize_in_place")]
deserialize_struct_in_place( variant_ident: Option<syn::Ident>, params: &Parameters, fields: &[Field], cattrs: &attr::Container, deserializer: Option<TokenStream>, ) -> Option<Fragment>1027 fn deserialize_struct_in_place(
1028     variant_ident: Option<syn::Ident>,
1029     params: &Parameters,
1030     fields: &[Field],
1031     cattrs: &attr::Container,
1032     deserializer: Option<TokenStream>,
1033 ) -> Option<Fragment> {
1034     let is_enum = variant_ident.is_some();
1035 
1036     // for now we do not support in_place deserialization for structs that
1037     // are represented as map.
1038     if cattrs.has_flatten() {
1039         return None;
1040     }
1041 
1042     let this = &params.this;
1043     let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
1044         split_with_de_lifetime(params);
1045     let delife = params.borrowed.de_lifetime();
1046 
1047     let expecting = match variant_ident {
1048         Some(variant_ident) => format!("struct variant {}::{}", params.type_name(), variant_ident),
1049         None => format!("struct {}", params.type_name()),
1050     };
1051 
1052     let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, &expecting));
1053 
1054     let (field_visitor, fields_stmt, visit_map) =
1055         deserialize_struct_as_struct_in_place_visitor(params, fields, cattrs);
1056 
1057     let field_visitor = Stmts(field_visitor);
1058     let fields_stmt = Stmts(fields_stmt);
1059     let visit_map = Stmts(visit_map);
1060 
1061     let visitor_expr = quote! {
1062         __Visitor {
1063             place: __place,
1064             lifetime: _serde::export::PhantomData,
1065         }
1066     };
1067     let dispatch = if let Some(deserializer) = deserializer {
1068         quote! {
1069             _serde::Deserializer::deserialize_any(#deserializer, #visitor_expr)
1070         }
1071     } else if is_enum {
1072         quote! {
1073             _serde::de::VariantAccess::struct_variant(__variant, FIELDS, #visitor_expr)
1074         }
1075     } else {
1076         let type_name = cattrs.name().deserialize_name();
1077         quote! {
1078             _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, #visitor_expr)
1079         }
1080     };
1081 
1082     let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
1083     let visitor_var = if all_skipped {
1084         quote!(_)
1085     } else {
1086         quote!(mut __seq)
1087     };
1088 
1089     let visit_seq = quote! {
1090         #[inline]
1091         fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
1092         where
1093             __A: _serde::de::SeqAccess<#delife>,
1094         {
1095             #visit_seq
1096         }
1097     };
1098 
1099     let in_place_impl_generics = de_impl_generics.in_place();
1100     let in_place_ty_generics = de_ty_generics.in_place();
1101     let place_life = place_lifetime();
1102 
1103     Some(quote_block! {
1104         #field_visitor
1105 
1106         struct __Visitor #in_place_impl_generics #where_clause {
1107             place: &#place_life mut #this #ty_generics,
1108             lifetime: _serde::export::PhantomData<&#delife ()>,
1109         }
1110 
1111         impl #in_place_impl_generics _serde::de::Visitor<#delife> for __Visitor #in_place_ty_generics #where_clause {
1112             type Value = ();
1113 
1114             fn expecting(&self, __formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
1115                 _serde::export::Formatter::write_str(__formatter, #expecting)
1116             }
1117 
1118             #visit_seq
1119 
1120             #[inline]
1121             fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
1122             where
1123                 __A: _serde::de::MapAccess<#delife>,
1124             {
1125                 #visit_map
1126             }
1127         }
1128 
1129         #fields_stmt
1130 
1131         #dispatch
1132     })
1133 }
1134 
deserialize_enum( params: &Parameters, variants: &[Variant], cattrs: &attr::Container, ) -> Fragment1135 fn deserialize_enum(
1136     params: &Parameters,
1137     variants: &[Variant],
1138     cattrs: &attr::Container,
1139 ) -> Fragment {
1140     match cattrs.tag() {
1141         attr::TagType::External => deserialize_externally_tagged_enum(params, variants, cattrs),
1142         attr::TagType::Internal { tag } => {
1143             deserialize_internally_tagged_enum(params, variants, cattrs, tag)
1144         }
1145         attr::TagType::Adjacent { tag, content } => {
1146             deserialize_adjacently_tagged_enum(params, variants, cattrs, tag, content)
1147         }
1148         attr::TagType::None => deserialize_untagged_enum(params, variants, cattrs),
1149     }
1150 }
1151 
prepare_enum_variant_enum( variants: &[Variant], cattrs: &attr::Container, ) -> (TokenStream, Stmts)1152 fn prepare_enum_variant_enum(
1153     variants: &[Variant],
1154     cattrs: &attr::Container,
1155 ) -> (TokenStream, Stmts) {
1156     let mut deserialized_variants = variants
1157         .iter()
1158         .enumerate()
1159         .filter(|&(_, variant)| !variant.attrs.skip_deserializing());
1160 
1161     let variant_names_idents: Vec<_> = deserialized_variants
1162         .clone()
1163         .map(|(i, variant)| {
1164             (
1165                 variant.attrs.name().deserialize_name(),
1166                 field_i(i),
1167                 variant.attrs.aliases(),
1168             )
1169         })
1170         .collect();
1171 
1172     let other_idx = deserialized_variants.position(|(_, variant)| variant.attrs.other());
1173 
1174     let variants_stmt = {
1175         let variant_names = variant_names_idents.iter().map(|(name, _, _)| name);
1176         quote! {
1177             const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
1178         }
1179     };
1180 
1181     let variant_visitor = Stmts(deserialize_generated_identifier(
1182         &variant_names_idents,
1183         cattrs,
1184         true,
1185         other_idx,
1186     ));
1187 
1188     (variants_stmt, variant_visitor)
1189 }
1190 
deserialize_externally_tagged_enum( params: &Parameters, variants: &[Variant], cattrs: &attr::Container, ) -> Fragment1191 fn deserialize_externally_tagged_enum(
1192     params: &Parameters,
1193     variants: &[Variant],
1194     cattrs: &attr::Container,
1195 ) -> Fragment {
1196     let this = &params.this;
1197     let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
1198         split_with_de_lifetime(params);
1199     let delife = params.borrowed.de_lifetime();
1200 
1201     let type_name = cattrs.name().deserialize_name();
1202     let expecting = format!("enum {}", params.type_name());
1203 
1204     let (variants_stmt, variant_visitor) = prepare_enum_variant_enum(variants, cattrs);
1205 
1206     // Match arms to extract a variant from a string
1207     let variant_arms = variants
1208         .iter()
1209         .enumerate()
1210         .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
1211         .map(|(i, variant)| {
1212             let variant_name = field_i(i);
1213 
1214             let block = Match(deserialize_externally_tagged_variant(
1215                 params, variant, cattrs,
1216             ));
1217 
1218             quote! {
1219                 (__Field::#variant_name, __variant) => #block
1220             }
1221         });
1222 
1223     let all_skipped = variants
1224         .iter()
1225         .all(|variant| variant.attrs.skip_deserializing());
1226     let match_variant = if all_skipped {
1227         // This is an empty enum like `enum Impossible {}` or an enum in which
1228         // all variants have `#[serde(skip_deserializing)]`.
1229         quote! {
1230             // FIXME: Once we drop support for Rust 1.15:
1231             // let _serde::export::Err(__err) = _serde::de::EnumAccess::variant::<__Field>(__data);
1232             // _serde::export::Err(__err)
1233             _serde::export::Result::map(
1234                 _serde::de::EnumAccess::variant::<__Field>(__data),
1235                 |(__impossible, _)| match __impossible {})
1236         }
1237     } else {
1238         quote! {
1239             match try!(_serde::de::EnumAccess::variant(__data)) {
1240                 #(#variant_arms)*
1241             }
1242         }
1243     };
1244 
1245     quote_block! {
1246         #variant_visitor
1247 
1248         struct __Visitor #de_impl_generics #where_clause {
1249             marker: _serde::export::PhantomData<#this #ty_generics>,
1250             lifetime: _serde::export::PhantomData<&#delife ()>,
1251         }
1252 
1253         impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
1254             type Value = #this #ty_generics;
1255 
1256             fn expecting(&self, __formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
1257                 _serde::export::Formatter::write_str(__formatter, #expecting)
1258             }
1259 
1260             fn visit_enum<__A>(self, __data: __A) -> _serde::export::Result<Self::Value, __A::Error>
1261             where
1262                 __A: _serde::de::EnumAccess<#delife>,
1263             {
1264                 #match_variant
1265             }
1266         }
1267 
1268         #variants_stmt
1269 
1270         _serde::Deserializer::deserialize_enum(
1271             __deserializer,
1272             #type_name,
1273             VARIANTS,
1274             __Visitor {
1275                 marker: _serde::export::PhantomData::<#this #ty_generics>,
1276                 lifetime: _serde::export::PhantomData,
1277             },
1278         )
1279     }
1280 }
1281 
deserialize_internally_tagged_enum( params: &Parameters, variants: &[Variant], cattrs: &attr::Container, tag: &str, ) -> Fragment1282 fn deserialize_internally_tagged_enum(
1283     params: &Parameters,
1284     variants: &[Variant],
1285     cattrs: &attr::Container,
1286     tag: &str,
1287 ) -> Fragment {
1288     let (variants_stmt, variant_visitor) = prepare_enum_variant_enum(variants, cattrs);
1289 
1290     // Match arms to extract a variant from a string
1291     let variant_arms = variants
1292         .iter()
1293         .enumerate()
1294         .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
1295         .map(|(i, variant)| {
1296             let variant_name = field_i(i);
1297 
1298             let block = Match(deserialize_internally_tagged_variant(
1299                 params,
1300                 variant,
1301                 cattrs,
1302                 quote! {
1303                     _serde::private::de::ContentDeserializer::<__D::Error>::new(__tagged.content)
1304                 },
1305             ));
1306 
1307             quote! {
1308                 __Field::#variant_name => #block
1309             }
1310         });
1311 
1312     quote_block! {
1313         #variant_visitor
1314 
1315         #variants_stmt
1316 
1317         let __tagged = try!(_serde::Deserializer::deserialize_any(
1318             __deserializer,
1319             _serde::private::de::TaggedContentVisitor::<__Field>::new(#tag)));
1320 
1321         match __tagged.tag {
1322             #(#variant_arms)*
1323         }
1324     }
1325 }
1326 
deserialize_adjacently_tagged_enum( params: &Parameters, variants: &[Variant], cattrs: &attr::Container, tag: &str, content: &str, ) -> Fragment1327 fn deserialize_adjacently_tagged_enum(
1328     params: &Parameters,
1329     variants: &[Variant],
1330     cattrs: &attr::Container,
1331     tag: &str,
1332     content: &str,
1333 ) -> Fragment {
1334     let this = &params.this;
1335     let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
1336         split_with_de_lifetime(params);
1337     let delife = params.borrowed.de_lifetime();
1338 
1339     let (variants_stmt, variant_visitor) = prepare_enum_variant_enum(variants, cattrs);
1340 
1341     let variant_arms: &Vec<_> = &variants
1342         .iter()
1343         .enumerate()
1344         .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
1345         .map(|(i, variant)| {
1346             let variant_index = field_i(i);
1347 
1348             let block = Match(deserialize_untagged_variant(
1349                 params,
1350                 variant,
1351                 cattrs,
1352                 quote!(__deserializer),
1353             ));
1354 
1355             quote! {
1356                 __Field::#variant_index => #block
1357             }
1358         })
1359         .collect();
1360 
1361     let expecting = format!("adjacently tagged enum {}", params.type_name());
1362     let type_name = cattrs.name().deserialize_name();
1363     let deny_unknown_fields = cattrs.deny_unknown_fields();
1364 
1365     // If unknown fields are allowed, we pick the visitor that can step over
1366     // those. Otherwise we pick the visitor that fails on unknown keys.
1367     let field_visitor_ty = if deny_unknown_fields {
1368         quote! { _serde::private::de::TagOrContentFieldVisitor }
1369     } else {
1370         quote! { _serde::private::de::TagContentOtherFieldVisitor }
1371     };
1372 
1373     let tag_or_content = quote! {
1374         #field_visitor_ty {
1375             tag: #tag,
1376             content: #content,
1377         }
1378     };
1379 
1380     let mut missing_content = quote! {
1381         _serde::export::Err(<__A::Error as _serde::de::Error>::missing_field(#content))
1382     };
1383     let mut missing_content_fallthrough = quote!();
1384     let missing_content_arms = variants
1385         .iter()
1386         .enumerate()
1387         .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
1388         .filter_map(|(i, variant)| {
1389             let variant_index = field_i(i);
1390             let variant_ident = &variant.ident;
1391 
1392             let arm = match variant.style {
1393                 Style::Unit => quote! {
1394                     _serde::export::Ok(#this::#variant_ident)
1395                 },
1396                 Style::Newtype if variant.attrs.deserialize_with().is_none() => {
1397                     let span = variant.original.span();
1398                     let func = quote_spanned!(span=> _serde::private::de::missing_field);
1399                     quote! {
1400                         #func(#content).map(#this::#variant_ident)
1401                     }
1402                 }
1403                 _ => {
1404                     missing_content_fallthrough = quote!(_ => #missing_content);
1405                     return None;
1406                 }
1407             };
1408             Some(quote! {
1409                 __Field::#variant_index => #arm,
1410             })
1411         })
1412         .collect::<Vec<_>>();
1413     if !missing_content_arms.is_empty() {
1414         missing_content = quote! {
1415             match __field {
1416                 #(#missing_content_arms)*
1417                 #missing_content_fallthrough
1418             }
1419         };
1420     }
1421 
1422     // Advance the map by one key, returning early in case of error.
1423     let next_key = quote! {
1424         try!(_serde::de::MapAccess::next_key_seed(&mut __map, #tag_or_content))
1425     };
1426 
1427     // When allowing unknown fields, we want to transparently step through keys
1428     // we don't care about until we find `tag`, `content`, or run out of keys.
1429     let next_relevant_key = if deny_unknown_fields {
1430         next_key
1431     } else {
1432         quote!({
1433             let mut __rk : _serde::export::Option<_serde::private::de::TagOrContentField> = _serde::export::None;
1434             while let _serde::export::Some(__k) = #next_key {
1435                 match __k {
1436                     _serde::private::de::TagContentOtherField::Other => {
1437                         try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map));
1438                         continue;
1439                     },
1440                     _serde::private::de::TagContentOtherField::Tag => {
1441                         __rk = _serde::export::Some(_serde::private::de::TagOrContentField::Tag);
1442                         break;
1443                     }
1444                     _serde::private::de::TagContentOtherField::Content => {
1445                         __rk = _serde::export::Some(_serde::private::de::TagOrContentField::Content);
1446                         break;
1447                     }
1448                 }
1449             }
1450 
1451             __rk
1452         })
1453     };
1454 
1455     // Step through remaining keys, looking for duplicates of previously-seen
1456     // keys. When unknown fields are denied, any key that isn't a duplicate will
1457     // at this point immediately produce an error.
1458     let visit_remaining_keys = quote! {
1459         match #next_relevant_key {
1460             _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
1461                 _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#tag))
1462             }
1463             _serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
1464                 _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#content))
1465             }
1466             _serde::export::None => _serde::export::Ok(__ret),
1467         }
1468     };
1469 
1470     let finish_content_then_tag = if variant_arms.is_empty() {
1471         quote! {
1472             match try!(_serde::de::MapAccess::next_value::<__Field>(&mut __map)) {}
1473         }
1474     } else {
1475         quote! {
1476             let __ret = try!(match try!(_serde::de::MapAccess::next_value(&mut __map)) {
1477                 // Deserialize the buffered content now that we know the variant.
1478                 #(#variant_arms)*
1479             });
1480             // Visit remaining keys, looking for duplicates.
1481             #visit_remaining_keys
1482         }
1483     };
1484 
1485     quote_block! {
1486         #variant_visitor
1487 
1488         #variants_stmt
1489 
1490         struct __Seed #de_impl_generics #where_clause {
1491             field: __Field,
1492             marker: _serde::export::PhantomData<#this #ty_generics>,
1493             lifetime: _serde::export::PhantomData<&#delife ()>,
1494         }
1495 
1496         impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Seed #de_ty_generics #where_clause {
1497             type Value = #this #ty_generics;
1498 
1499             fn deserialize<__D>(self, __deserializer: __D) -> _serde::export::Result<Self::Value, __D::Error>
1500             where
1501                 __D: _serde::Deserializer<#delife>,
1502             {
1503                 match self.field {
1504                     #(#variant_arms)*
1505                 }
1506             }
1507         }
1508 
1509         struct __Visitor #de_impl_generics #where_clause {
1510             marker: _serde::export::PhantomData<#this #ty_generics>,
1511             lifetime: _serde::export::PhantomData<&#delife ()>,
1512         }
1513 
1514         impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
1515             type Value = #this #ty_generics;
1516 
1517             fn expecting(&self, __formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
1518                 _serde::export::Formatter::write_str(__formatter, #expecting)
1519             }
1520 
1521             fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
1522             where
1523                 __A: _serde::de::MapAccess<#delife>,
1524             {
1525                 // Visit the first relevant key.
1526                 match #next_relevant_key {
1527                     // First key is the tag.
1528                     _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
1529                         // Parse the tag.
1530                         let __field = try!(_serde::de::MapAccess::next_value(&mut __map));
1531                         // Visit the second key.
1532                         match #next_relevant_key {
1533                             // Second key is a duplicate of the tag.
1534                             _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
1535                                 _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#tag))
1536                             }
1537                             // Second key is the content.
1538                             _serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
1539                                 let __ret = try!(_serde::de::MapAccess::next_value_seed(&mut __map,
1540                                     __Seed {
1541                                         field: __field,
1542                                         marker: _serde::export::PhantomData,
1543                                         lifetime: _serde::export::PhantomData,
1544                                     }));
1545                                 // Visit remaining keys, looking for duplicates.
1546                                 #visit_remaining_keys
1547                             }
1548                             // There is no second key; might be okay if the we have a unit variant.
1549                             _serde::export::None => #missing_content
1550                         }
1551                     }
1552                     // First key is the content.
1553                     _serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
1554                         // Buffer up the content.
1555                         let __content = try!(_serde::de::MapAccess::next_value::<_serde::private::de::Content>(&mut __map));
1556                         // Visit the second key.
1557                         match #next_relevant_key {
1558                             // Second key is the tag.
1559                             _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
1560                                 let __deserializer = _serde::private::de::ContentDeserializer::<__A::Error>::new(__content);
1561                                 #finish_content_then_tag
1562                             }
1563                             // Second key is a duplicate of the content.
1564                             _serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
1565                                 _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#content))
1566                             }
1567                             // There is no second key.
1568                             _serde::export::None => {
1569                                 _serde::export::Err(<__A::Error as _serde::de::Error>::missing_field(#tag))
1570                             }
1571                         }
1572                     }
1573                     // There is no first key.
1574                     _serde::export::None => {
1575                         _serde::export::Err(<__A::Error as _serde::de::Error>::missing_field(#tag))
1576                     }
1577                 }
1578             }
1579 
1580             fn visit_seq<__A>(self, mut __seq: __A) -> _serde::export::Result<Self::Value, __A::Error>
1581             where
1582                 __A: _serde::de::SeqAccess<#delife>,
1583             {
1584                 // Visit the first element - the tag.
1585                 match try!(_serde::de::SeqAccess::next_element(&mut __seq)) {
1586                     _serde::export::Some(__field) => {
1587                         // Visit the second element - the content.
1588                         match try!(_serde::de::SeqAccess::next_element_seed(
1589                             &mut __seq,
1590                             __Seed {
1591                                 field: __field,
1592                                 marker: _serde::export::PhantomData,
1593                                 lifetime: _serde::export::PhantomData,
1594                             },
1595                         )) {
1596                             _serde::export::Some(__ret) => _serde::export::Ok(__ret),
1597                             // There is no second element.
1598                             _serde::export::None => {
1599                                 _serde::export::Err(_serde::de::Error::invalid_length(1, &self))
1600                             }
1601                         }
1602                     }
1603                     // There is no first element.
1604                     _serde::export::None => {
1605                         _serde::export::Err(_serde::de::Error::invalid_length(0, &self))
1606                     }
1607                 }
1608             }
1609         }
1610 
1611         const FIELDS: &'static [&'static str] = &[#tag, #content];
1612         _serde::Deserializer::deserialize_struct(
1613             __deserializer,
1614             #type_name,
1615             FIELDS,
1616             __Visitor {
1617                 marker: _serde::export::PhantomData::<#this #ty_generics>,
1618                 lifetime: _serde::export::PhantomData,
1619             },
1620         )
1621     }
1622 }
1623 
deserialize_untagged_enum( params: &Parameters, variants: &[Variant], cattrs: &attr::Container, ) -> Fragment1624 fn deserialize_untagged_enum(
1625     params: &Parameters,
1626     variants: &[Variant],
1627     cattrs: &attr::Container,
1628 ) -> Fragment {
1629     let attempts = variants
1630         .iter()
1631         .filter(|variant| !variant.attrs.skip_deserializing())
1632         .map(|variant| {
1633             Expr(deserialize_untagged_variant(
1634                 params,
1635                 variant,
1636                 cattrs,
1637                 quote!(_serde::private::de::ContentRefDeserializer::<__D::Error>::new(&__content)),
1638             ))
1639         });
1640 
1641     // TODO this message could be better by saving the errors from the failed
1642     // attempts. The heuristic used by TOML was to count the number of fields
1643     // processed before an error, and use the error that happened after the
1644     // largest number of fields. I'm not sure I like that. Maybe it would be
1645     // better to save all the errors and combine them into one message that
1646     // explains why none of the variants matched.
1647     let fallthrough_msg = format!(
1648         "data did not match any variant of untagged enum {}",
1649         params.type_name()
1650     );
1651 
1652     quote_block! {
1653         let __content = try!(<_serde::private::de::Content as _serde::Deserialize>::deserialize(__deserializer));
1654 
1655         #(
1656             if let _serde::export::Ok(__ok) = #attempts {
1657                 return _serde::export::Ok(__ok);
1658             }
1659         )*
1660 
1661         _serde::export::Err(_serde::de::Error::custom(#fallthrough_msg))
1662     }
1663 }
1664 
deserialize_externally_tagged_variant( params: &Parameters, variant: &Variant, cattrs: &attr::Container, ) -> Fragment1665 fn deserialize_externally_tagged_variant(
1666     params: &Parameters,
1667     variant: &Variant,
1668     cattrs: &attr::Container,
1669 ) -> Fragment {
1670     if let Some(path) = variant.attrs.deserialize_with() {
1671         let (wrapper, wrapper_ty, unwrap_fn) = wrap_deserialize_variant_with(params, variant, path);
1672         return quote_block! {
1673             #wrapper
1674             _serde::export::Result::map(
1675                 _serde::de::VariantAccess::newtype_variant::<#wrapper_ty>(__variant), #unwrap_fn)
1676         };
1677     }
1678 
1679     let variant_ident = &variant.ident;
1680 
1681     match variant.style {
1682         Style::Unit => {
1683             let this = &params.this;
1684             quote_block! {
1685                 try!(_serde::de::VariantAccess::unit_variant(__variant));
1686                 _serde::export::Ok(#this::#variant_ident)
1687             }
1688         }
1689         Style::Newtype => deserialize_externally_tagged_newtype_variant(
1690             variant_ident,
1691             params,
1692             &variant.fields[0],
1693             cattrs,
1694         ),
1695         Style::Tuple => {
1696             deserialize_tuple(Some(variant_ident), params, &variant.fields, cattrs, None)
1697         }
1698         Style::Struct => deserialize_struct(
1699             Some(variant_ident),
1700             params,
1701             &variant.fields,
1702             cattrs,
1703             None,
1704             &Untagged::No,
1705         ),
1706     }
1707 }
1708 
deserialize_internally_tagged_variant( params: &Parameters, variant: &Variant, cattrs: &attr::Container, deserializer: TokenStream, ) -> Fragment1709 fn deserialize_internally_tagged_variant(
1710     params: &Parameters,
1711     variant: &Variant,
1712     cattrs: &attr::Container,
1713     deserializer: TokenStream,
1714 ) -> Fragment {
1715     if variant.attrs.deserialize_with().is_some() {
1716         return deserialize_untagged_variant(params, variant, cattrs, deserializer);
1717     }
1718 
1719     let variant_ident = &variant.ident;
1720 
1721     match effective_style(variant) {
1722         Style::Unit => {
1723             let this = &params.this;
1724             let type_name = params.type_name();
1725             let variant_name = variant.ident.to_string();
1726             let default = variant.fields.get(0).map(|field| {
1727                 let default = Expr(expr_is_missing(field, cattrs));
1728                 quote!((#default))
1729             });
1730             quote_block! {
1731                 try!(_serde::Deserializer::deserialize_any(#deserializer, _serde::private::de::InternallyTaggedUnitVisitor::new(#type_name, #variant_name)));
1732                 _serde::export::Ok(#this::#variant_ident #default)
1733             }
1734         }
1735         Style::Newtype => deserialize_untagged_newtype_variant(
1736             variant_ident,
1737             params,
1738             &variant.fields[0],
1739             &deserializer,
1740         ),
1741         Style::Struct => deserialize_struct(
1742             Some(variant_ident),
1743             params,
1744             &variant.fields,
1745             cattrs,
1746             Some(deserializer),
1747             &Untagged::No,
1748         ),
1749         Style::Tuple => unreachable!("checked in serde_derive_internals"),
1750     }
1751 }
1752 
deserialize_untagged_variant( params: &Parameters, variant: &Variant, cattrs: &attr::Container, deserializer: TokenStream, ) -> Fragment1753 fn deserialize_untagged_variant(
1754     params: &Parameters,
1755     variant: &Variant,
1756     cattrs: &attr::Container,
1757     deserializer: TokenStream,
1758 ) -> Fragment {
1759     if let Some(path) = variant.attrs.deserialize_with() {
1760         let (wrapper, wrapper_ty, unwrap_fn) = wrap_deserialize_variant_with(params, variant, path);
1761         return quote_block! {
1762             #wrapper
1763             _serde::export::Result::map(
1764                 <#wrapper_ty as _serde::Deserialize>::deserialize(#deserializer), #unwrap_fn)
1765         };
1766     }
1767 
1768     let variant_ident = &variant.ident;
1769 
1770     match effective_style(variant) {
1771         Style::Unit => {
1772             let this = &params.this;
1773             let type_name = params.type_name();
1774             let variant_name = variant.ident.to_string();
1775             let default = variant.fields.get(0).map(|field| {
1776                 let default = Expr(expr_is_missing(field, cattrs));
1777                 quote!((#default))
1778             });
1779             quote_expr! {
1780                 match _serde::Deserializer::deserialize_any(
1781                     #deserializer,
1782                     _serde::private::de::UntaggedUnitVisitor::new(#type_name, #variant_name)
1783                 ) {
1784                     _serde::export::Ok(()) => _serde::export::Ok(#this::#variant_ident #default),
1785                     _serde::export::Err(__err) => _serde::export::Err(__err),
1786                 }
1787             }
1788         }
1789         Style::Newtype => deserialize_untagged_newtype_variant(
1790             variant_ident,
1791             params,
1792             &variant.fields[0],
1793             &deserializer,
1794         ),
1795         Style::Tuple => deserialize_tuple(
1796             Some(variant_ident),
1797             params,
1798             &variant.fields,
1799             cattrs,
1800             Some(deserializer),
1801         ),
1802         Style::Struct => deserialize_struct(
1803             Some(variant_ident),
1804             params,
1805             &variant.fields,
1806             cattrs,
1807             Some(deserializer),
1808             &Untagged::Yes,
1809         ),
1810     }
1811 }
1812 
deserialize_externally_tagged_newtype_variant( variant_ident: &syn::Ident, params: &Parameters, field: &Field, cattrs: &attr::Container, ) -> Fragment1813 fn deserialize_externally_tagged_newtype_variant(
1814     variant_ident: &syn::Ident,
1815     params: &Parameters,
1816     field: &Field,
1817     cattrs: &attr::Container,
1818 ) -> Fragment {
1819     let this = &params.this;
1820 
1821     if field.attrs.skip_deserializing() {
1822         let this = &params.this;
1823         let default = Expr(expr_is_missing(field, cattrs));
1824         return quote_block! {
1825             try!(_serde::de::VariantAccess::unit_variant(__variant));
1826             _serde::export::Ok(#this::#variant_ident(#default))
1827         };
1828     }
1829 
1830     match field.attrs.deserialize_with() {
1831         None => {
1832             let field_ty = field.ty;
1833             let span = field.original.span();
1834             let func =
1835                 quote_spanned!(span=> _serde::de::VariantAccess::newtype_variant::<#field_ty>);
1836             quote_expr! {
1837                 _serde::export::Result::map(#func(__variant), #this::#variant_ident)
1838             }
1839         }
1840         Some(path) => {
1841             let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
1842             quote_block! {
1843                 #wrapper
1844                 _serde::export::Result::map(
1845                     _serde::de::VariantAccess::newtype_variant::<#wrapper_ty>(__variant),
1846                     |__wrapper| #this::#variant_ident(__wrapper.value))
1847             }
1848         }
1849     }
1850 }
1851 
deserialize_untagged_newtype_variant( variant_ident: &syn::Ident, params: &Parameters, field: &Field, deserializer: &TokenStream, ) -> Fragment1852 fn deserialize_untagged_newtype_variant(
1853     variant_ident: &syn::Ident,
1854     params: &Parameters,
1855     field: &Field,
1856     deserializer: &TokenStream,
1857 ) -> Fragment {
1858     let this = &params.this;
1859     let field_ty = field.ty;
1860     match field.attrs.deserialize_with() {
1861         None => {
1862             let span = field.original.span();
1863             let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);
1864             quote_expr! {
1865                 _serde::export::Result::map(#func(#deserializer), #this::#variant_ident)
1866             }
1867         }
1868         Some(path) => {
1869             quote_block! {
1870                 let __value: _serde::export::Result<#field_ty, _> = #path(#deserializer);
1871                 _serde::export::Result::map(__value, #this::#variant_ident)
1872             }
1873         }
1874     }
1875 }
1876 
deserialize_generated_identifier( fields: &[(String, Ident, Vec<String>)], cattrs: &attr::Container, is_variant: bool, other_idx: Option<usize>, ) -> Fragment1877 fn deserialize_generated_identifier(
1878     fields: &[(String, Ident, Vec<String>)],
1879     cattrs: &attr::Container,
1880     is_variant: bool,
1881     other_idx: Option<usize>,
1882 ) -> Fragment {
1883     let this = quote!(__Field);
1884     let field_idents: &Vec<_> = &fields.iter().map(|(_, ident, _)| ident).collect();
1885 
1886     let (ignore_variant, fallthrough) = if !is_variant && cattrs.has_flatten() {
1887         let ignore_variant = quote!(__other(_serde::private::de::Content<'de>),);
1888         let fallthrough = quote!(_serde::export::Ok(__Field::__other(__value)));
1889         (Some(ignore_variant), Some(fallthrough))
1890     } else if let Some(other_idx) = other_idx {
1891         let ignore_variant = fields[other_idx].1.clone();
1892         let fallthrough = quote!(_serde::export::Ok(__Field::#ignore_variant));
1893         (None, Some(fallthrough))
1894     } else if is_variant || cattrs.deny_unknown_fields() {
1895         (None, None)
1896     } else {
1897         let ignore_variant = quote!(__ignore,);
1898         let fallthrough = quote!(_serde::export::Ok(__Field::__ignore));
1899         (Some(ignore_variant), Some(fallthrough))
1900     };
1901 
1902     let visitor_impl = Stmts(deserialize_identifier(
1903         &this,
1904         fields,
1905         is_variant,
1906         fallthrough,
1907         !is_variant && cattrs.has_flatten(),
1908     ));
1909 
1910     let lifetime = if !is_variant && cattrs.has_flatten() {
1911         Some(quote!(<'de>))
1912     } else {
1913         None
1914     };
1915 
1916     quote_block! {
1917         #[allow(non_camel_case_types)]
1918         enum __Field #lifetime {
1919             #(#field_idents,)*
1920             #ignore_variant
1921         }
1922 
1923         struct __FieldVisitor;
1924 
1925         impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
1926             type Value = __Field #lifetime;
1927 
1928             #visitor_impl
1929         }
1930 
1931         impl<'de> _serde::Deserialize<'de> for __Field #lifetime {
1932             #[inline]
1933             fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
1934             where
1935                 __D: _serde::Deserializer<'de>,
1936             {
1937                 _serde::Deserializer::deserialize_identifier(__deserializer, __FieldVisitor)
1938             }
1939         }
1940     }
1941 }
1942 
deserialize_custom_identifier( params: &Parameters, variants: &[Variant], cattrs: &attr::Container, ) -> Fragment1943 fn deserialize_custom_identifier(
1944     params: &Parameters,
1945     variants: &[Variant],
1946     cattrs: &attr::Container,
1947 ) -> Fragment {
1948     let is_variant = match cattrs.identifier() {
1949         attr::Identifier::Variant => true,
1950         attr::Identifier::Field => false,
1951         attr::Identifier::No => unreachable!(),
1952     };
1953 
1954     let this = &params.this;
1955     let this = quote!(#this);
1956 
1957     let (ordinary, fallthrough) = if let Some(last) = variants.last() {
1958         let last_ident = &last.ident;
1959         if last.attrs.other() {
1960             let ordinary = &variants[..variants.len() - 1];
1961             let fallthrough = quote!(_serde::export::Ok(#this::#last_ident));
1962             (ordinary, Some(fallthrough))
1963         } else if let Style::Newtype = last.style {
1964             let ordinary = &variants[..variants.len() - 1];
1965             let deserializer = quote!(_serde::private::de::IdentifierDeserializer::from(__value));
1966             let fallthrough = quote! {
1967                 _serde::export::Result::map(
1968                     _serde::Deserialize::deserialize(#deserializer),
1969                     #this::#last_ident)
1970             };
1971             (ordinary, Some(fallthrough))
1972         } else {
1973             (variants, None)
1974         }
1975     } else {
1976         (variants, None)
1977     };
1978 
1979     let names_idents: Vec<_> = ordinary
1980         .iter()
1981         .map(|variant| {
1982             (
1983                 variant.attrs.name().deserialize_name(),
1984                 variant.ident.clone(),
1985                 variant.attrs.aliases(),
1986             )
1987         })
1988         .collect();
1989 
1990     let names = names_idents.iter().map(|(name, _, _)| name);
1991 
1992     let names_const = if fallthrough.is_some() {
1993         None
1994     } else if is_variant {
1995         let variants = quote! {
1996             const VARIANTS: &'static [&'static str] = &[ #(#names),* ];
1997         };
1998         Some(variants)
1999     } else {
2000         let fields = quote! {
2001             const FIELDS: &'static [&'static str] = &[ #(#names),* ];
2002         };
2003         Some(fields)
2004     };
2005 
2006     let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
2007         split_with_de_lifetime(params);
2008     let delife = params.borrowed.de_lifetime();
2009     let visitor_impl = Stmts(deserialize_identifier(
2010         &this,
2011         &names_idents,
2012         is_variant,
2013         fallthrough,
2014         false,
2015     ));
2016 
2017     quote_block! {
2018         #names_const
2019 
2020         struct __FieldVisitor #de_impl_generics #where_clause {
2021             marker: _serde::export::PhantomData<#this #ty_generics>,
2022             lifetime: _serde::export::PhantomData<&#delife ()>,
2023         }
2024 
2025         impl #de_impl_generics _serde::de::Visitor<#delife> for __FieldVisitor #de_ty_generics #where_clause {
2026             type Value = #this #ty_generics;
2027 
2028             #visitor_impl
2029         }
2030 
2031         let __visitor = __FieldVisitor {
2032             marker: _serde::export::PhantomData::<#this #ty_generics>,
2033             lifetime: _serde::export::PhantomData,
2034         };
2035         _serde::Deserializer::deserialize_identifier(__deserializer, __visitor)
2036     }
2037 }
2038 
deserialize_identifier( this: &TokenStream, fields: &[(String, Ident, Vec<String>)], is_variant: bool, fallthrough: Option<TokenStream>, collect_other_fields: bool, ) -> Fragment2039 fn deserialize_identifier(
2040     this: &TokenStream,
2041     fields: &[(String, Ident, Vec<String>)],
2042     is_variant: bool,
2043     fallthrough: Option<TokenStream>,
2044     collect_other_fields: bool,
2045 ) -> Fragment {
2046     let mut flat_fields = Vec::new();
2047     for (_, ident, aliases) in fields {
2048         flat_fields.extend(aliases.iter().map(|alias| (alias, ident)))
2049     }
2050 
2051     let field_strs = flat_fields.iter().map(|(name, _)| name);
2052     let field_borrowed_strs = flat_fields.iter().map(|(name, _)| name);
2053     let field_bytes = flat_fields
2054         .iter()
2055         .map(|(name, _)| Literal::byte_string(name.as_bytes()));
2056     let field_borrowed_bytes = flat_fields
2057         .iter()
2058         .map(|(name, _)| Literal::byte_string(name.as_bytes()));
2059 
2060     let constructors: &Vec<_> = &flat_fields
2061         .iter()
2062         .map(|(_, ident)| quote!(#this::#ident))
2063         .collect();
2064     let main_constructors: &Vec<_> = &fields
2065         .iter()
2066         .map(|(_, ident, _)| quote!(#this::#ident))
2067         .collect();
2068 
2069     let expecting = if is_variant {
2070         "variant identifier"
2071     } else {
2072         "field identifier"
2073     };
2074 
2075     let index_expecting = if is_variant { "variant" } else { "field" };
2076 
2077     let bytes_to_str = if fallthrough.is_some() || collect_other_fields {
2078         None
2079     } else {
2080         Some(quote! {
2081             let __value = &_serde::export::from_utf8_lossy(__value);
2082         })
2083     };
2084 
2085     let (
2086         value_as_str_content,
2087         value_as_borrowed_str_content,
2088         value_as_bytes_content,
2089         value_as_borrowed_bytes_content,
2090     ) = if collect_other_fields {
2091         (
2092             Some(quote! {
2093                 let __value = _serde::private::de::Content::String(_serde::export::ToString::to_string(__value));
2094             }),
2095             Some(quote! {
2096                 let __value = _serde::private::de::Content::Str(__value);
2097             }),
2098             Some(quote! {
2099                 let __value = _serde::private::de::Content::ByteBuf(__value.to_vec());
2100             }),
2101             Some(quote! {
2102                 let __value = _serde::private::de::Content::Bytes(__value);
2103             }),
2104         )
2105     } else {
2106         (None, None, None, None)
2107     };
2108 
2109     let fallthrough_arm = if let Some(fallthrough) = fallthrough {
2110         fallthrough
2111     } else if is_variant {
2112         quote! {
2113             _serde::export::Err(_serde::de::Error::unknown_variant(__value, VARIANTS))
2114         }
2115     } else {
2116         quote! {
2117             _serde::export::Err(_serde::de::Error::unknown_field(__value, FIELDS))
2118         }
2119     };
2120 
2121     let variant_indices = 0_u64..;
2122     let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len());
2123     let visit_other = if collect_other_fields {
2124         quote! {
2125             fn visit_bool<__E>(self, __value: bool) -> _serde::export::Result<Self::Value, __E>
2126             where
2127                 __E: _serde::de::Error,
2128             {
2129                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::Bool(__value)))
2130             }
2131 
2132             fn visit_i8<__E>(self, __value: i8) -> _serde::export::Result<Self::Value, __E>
2133             where
2134                 __E: _serde::de::Error,
2135             {
2136                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::I8(__value)))
2137             }
2138 
2139             fn visit_i16<__E>(self, __value: i16) -> _serde::export::Result<Self::Value, __E>
2140             where
2141                 __E: _serde::de::Error,
2142             {
2143                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::I16(__value)))
2144             }
2145 
2146             fn visit_i32<__E>(self, __value: i32) -> _serde::export::Result<Self::Value, __E>
2147             where
2148                 __E: _serde::de::Error,
2149             {
2150                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::I32(__value)))
2151             }
2152 
2153             fn visit_i64<__E>(self, __value: i64) -> _serde::export::Result<Self::Value, __E>
2154             where
2155                 __E: _serde::de::Error,
2156             {
2157                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::I64(__value)))
2158             }
2159 
2160             fn visit_u8<__E>(self, __value: u8) -> _serde::export::Result<Self::Value, __E>
2161             where
2162                 __E: _serde::de::Error,
2163             {
2164                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::U8(__value)))
2165             }
2166 
2167             fn visit_u16<__E>(self, __value: u16) -> _serde::export::Result<Self::Value, __E>
2168             where
2169                 __E: _serde::de::Error,
2170             {
2171                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::U16(__value)))
2172             }
2173 
2174             fn visit_u32<__E>(self, __value: u32) -> _serde::export::Result<Self::Value, __E>
2175             where
2176                 __E: _serde::de::Error,
2177             {
2178                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::U32(__value)))
2179             }
2180 
2181             fn visit_u64<__E>(self, __value: u64) -> _serde::export::Result<Self::Value, __E>
2182             where
2183                 __E: _serde::de::Error,
2184             {
2185                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::U64(__value)))
2186             }
2187 
2188             fn visit_f32<__E>(self, __value: f32) -> _serde::export::Result<Self::Value, __E>
2189             where
2190                 __E: _serde::de::Error,
2191             {
2192                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::F32(__value)))
2193             }
2194 
2195             fn visit_f64<__E>(self, __value: f64) -> _serde::export::Result<Self::Value, __E>
2196             where
2197                 __E: _serde::de::Error,
2198             {
2199                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::F64(__value)))
2200             }
2201 
2202             fn visit_char<__E>(self, __value: char) -> _serde::export::Result<Self::Value, __E>
2203             where
2204                 __E: _serde::de::Error,
2205             {
2206                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::Char(__value)))
2207             }
2208 
2209             fn visit_unit<__E>(self) -> _serde::export::Result<Self::Value, __E>
2210             where
2211                 __E: _serde::de::Error,
2212             {
2213                 _serde::export::Ok(__Field::__other(_serde::private::de::Content::Unit))
2214             }
2215 
2216             fn visit_borrowed_str<__E>(self, __value: &'de str) -> _serde::export::Result<Self::Value, __E>
2217             where
2218                 __E: _serde::de::Error,
2219             {
2220                 match __value {
2221                     #(
2222                         #field_borrowed_strs => _serde::export::Ok(#constructors),
2223                     )*
2224                     _ => {
2225                         #value_as_borrowed_str_content
2226                         #fallthrough_arm
2227                     }
2228                 }
2229             }
2230 
2231             fn visit_borrowed_bytes<__E>(self, __value: &'de [u8]) -> _serde::export::Result<Self::Value, __E>
2232             where
2233                 __E: _serde::de::Error,
2234             {
2235                 match __value {
2236                     #(
2237                         #field_borrowed_bytes => _serde::export::Ok(#constructors),
2238                     )*
2239                     _ => {
2240                         #bytes_to_str
2241                         #value_as_borrowed_bytes_content
2242                         #fallthrough_arm
2243                     }
2244                 }
2245             }
2246         }
2247     } else {
2248         quote! {
2249             fn visit_u64<__E>(self, __value: u64) -> _serde::export::Result<Self::Value, __E>
2250             where
2251                 __E: _serde::de::Error,
2252             {
2253                 match __value {
2254                     #(
2255                         #variant_indices => _serde::export::Ok(#main_constructors),
2256                     )*
2257                     _ => _serde::export::Err(_serde::de::Error::invalid_value(
2258                         _serde::de::Unexpected::Unsigned(__value),
2259                         &#fallthrough_msg,
2260                     ))
2261                 }
2262             }
2263         }
2264     };
2265 
2266     quote_block! {
2267         fn expecting(&self, __formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
2268             _serde::export::Formatter::write_str(__formatter, #expecting)
2269         }
2270 
2271         #visit_other
2272 
2273         fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>
2274         where
2275             __E: _serde::de::Error,
2276         {
2277             match __value {
2278                 #(
2279                     #field_strs => _serde::export::Ok(#constructors),
2280                 )*
2281                 _ => {
2282                     #value_as_str_content
2283                     #fallthrough_arm
2284                 }
2285             }
2286         }
2287 
2288         fn visit_bytes<__E>(self, __value: &[u8]) -> _serde::export::Result<Self::Value, __E>
2289         where
2290             __E: _serde::de::Error,
2291         {
2292             match __value {
2293                 #(
2294                     #field_bytes => _serde::export::Ok(#constructors),
2295                 )*
2296                 _ => {
2297                     #bytes_to_str
2298                     #value_as_bytes_content
2299                     #fallthrough_arm
2300                 }
2301             }
2302         }
2303     }
2304 }
2305 
deserialize_struct_as_struct_visitor( struct_path: &TokenStream, params: &Parameters, fields: &[Field], cattrs: &attr::Container, ) -> (Fragment, Option<Fragment>, Fragment)2306 fn deserialize_struct_as_struct_visitor(
2307     struct_path: &TokenStream,
2308     params: &Parameters,
2309     fields: &[Field],
2310     cattrs: &attr::Container,
2311 ) -> (Fragment, Option<Fragment>, Fragment) {
2312     assert!(!cattrs.has_flatten());
2313 
2314     let field_names_idents: Vec<_> = fields
2315         .iter()
2316         .enumerate()
2317         .filter(|&(_, field)| !field.attrs.skip_deserializing())
2318         .map(|(i, field)| {
2319             (
2320                 field.attrs.name().deserialize_name(),
2321                 field_i(i),
2322                 field.attrs.aliases(),
2323             )
2324         })
2325         .collect();
2326 
2327     let fields_stmt = {
2328         let field_names = field_names_idents.iter().map(|(name, _, _)| name);
2329         quote_block! {
2330             const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
2331         }
2332     };
2333 
2334     let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
2335 
2336     let visit_map = deserialize_map(struct_path, params, fields, cattrs);
2337 
2338     (field_visitor, Some(fields_stmt), visit_map)
2339 }
2340 
deserialize_struct_as_map_visitor( struct_path: &TokenStream, params: &Parameters, fields: &[Field], cattrs: &attr::Container, ) -> (Fragment, Option<Fragment>, Fragment)2341 fn deserialize_struct_as_map_visitor(
2342     struct_path: &TokenStream,
2343     params: &Parameters,
2344     fields: &[Field],
2345     cattrs: &attr::Container,
2346 ) -> (Fragment, Option<Fragment>, Fragment) {
2347     let field_names_idents: Vec<_> = fields
2348         .iter()
2349         .enumerate()
2350         .filter(|&(_, field)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
2351         .map(|(i, field)| {
2352             (
2353                 field.attrs.name().deserialize_name(),
2354                 field_i(i),
2355                 field.attrs.aliases(),
2356             )
2357         })
2358         .collect();
2359 
2360     let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
2361 
2362     let visit_map = deserialize_map(struct_path, params, fields, cattrs);
2363 
2364     (field_visitor, None, visit_map)
2365 }
2366 
deserialize_map( struct_path: &TokenStream, params: &Parameters, fields: &[Field], cattrs: &attr::Container, ) -> Fragment2367 fn deserialize_map(
2368     struct_path: &TokenStream,
2369     params: &Parameters,
2370     fields: &[Field],
2371     cattrs: &attr::Container,
2372 ) -> Fragment {
2373     // Create the field names for the fields.
2374     let fields_names: Vec<_> = fields
2375         .iter()
2376         .enumerate()
2377         .map(|(i, field)| (field, field_i(i)))
2378         .collect();
2379 
2380     // Declare each field that will be deserialized.
2381     let let_values = fields_names
2382         .iter()
2383         .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
2384         .map(|(field, name)| {
2385             let field_ty = field.ty;
2386             quote! {
2387                 let mut #name: _serde::export::Option<#field_ty> = _serde::export::None;
2388             }
2389         });
2390 
2391     // Collect contents for flatten fields into a buffer
2392     let let_collect = if cattrs.has_flatten() {
2393         Some(quote! {
2394             let mut __collect = _serde::export::Vec::<_serde::export::Option<(
2395                 _serde::private::de::Content,
2396                 _serde::private::de::Content
2397             )>>::new();
2398         })
2399     } else {
2400         None
2401     };
2402 
2403     // Match arms to extract a value for a field.
2404     let value_arms = fields_names
2405         .iter()
2406         .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
2407         .map(|(field, name)| {
2408             let deser_name = field.attrs.name().deserialize_name();
2409 
2410             let visit = match field.attrs.deserialize_with() {
2411                 None => {
2412                     let field_ty = field.ty;
2413                     let span = field.original.span();
2414                     let func =
2415                         quote_spanned!(span=> _serde::de::MapAccess::next_value::<#field_ty>);
2416                     quote! {
2417                         try!(#func(&mut __map))
2418                     }
2419                 }
2420                 Some(path) => {
2421                     let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
2422                     quote!({
2423                         #wrapper
2424                         match _serde::de::MapAccess::next_value::<#wrapper_ty>(&mut __map) {
2425                             _serde::export::Ok(__wrapper) => __wrapper.value,
2426                             _serde::export::Err(__err) => {
2427                                 return _serde::export::Err(__err);
2428                             }
2429                         }
2430                     })
2431                 }
2432             };
2433             quote! {
2434                 __Field::#name => {
2435                     if _serde::export::Option::is_some(&#name) {
2436                         return _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#deser_name));
2437                     }
2438                     #name = _serde::export::Some(#visit);
2439                 }
2440             }
2441         });
2442 
2443     // Visit ignored values to consume them
2444     let ignored_arm = if cattrs.has_flatten() {
2445         Some(quote! {
2446             __Field::__other(__name) => {
2447                 __collect.push(_serde::export::Some((
2448                     __name,
2449                     try!(_serde::de::MapAccess::next_value(&mut __map)))));
2450             }
2451         })
2452     } else if cattrs.deny_unknown_fields() {
2453         None
2454     } else {
2455         Some(quote! {
2456             _ => { let _ = try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)); }
2457         })
2458     };
2459 
2460     let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
2461     let match_keys = if cattrs.deny_unknown_fields() && all_skipped {
2462         quote! {
2463             // FIXME: Once we drop support for Rust 1.15:
2464             // let _serde::export::None::<__Field> = try!(_serde::de::MapAccess::next_key(&mut __map));
2465             _serde::export::Option::map(
2466                 try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)),
2467                 |__impossible| match __impossible {});
2468         }
2469     } else {
2470         quote! {
2471             while let _serde::export::Some(__key) = try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)) {
2472                 match __key {
2473                     #(#value_arms)*
2474                     #ignored_arm
2475                 }
2476             }
2477         }
2478     };
2479 
2480     let extract_values = fields_names
2481         .iter()
2482         .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
2483         .map(|(field, name)| {
2484             let missing_expr = Match(expr_is_missing(field, cattrs));
2485 
2486             quote! {
2487                 let #name = match #name {
2488                     _serde::export::Some(#name) => #name,
2489                     _serde::export::None => #missing_expr
2490                 };
2491             }
2492         });
2493 
2494     let extract_collected = fields_names
2495         .iter()
2496         .filter(|&&(field, _)| field.attrs.flatten() && !field.attrs.skip_deserializing())
2497         .map(|(field, name)| {
2498             let field_ty = field.ty;
2499             let func = match field.attrs.deserialize_with() {
2500                 None => {
2501                     let span = field.original.span();
2502                     quote_spanned!(span=> _serde::de::Deserialize::deserialize)
2503                 }
2504                 Some(path) => quote!(#path),
2505             };
2506             quote! {
2507                 let #name: #field_ty = try!(#func(
2508                     _serde::private::de::FlatMapDeserializer(
2509                         &mut __collect,
2510                         _serde::export::PhantomData)));
2511             }
2512         });
2513 
2514     let collected_deny_unknown_fields = if cattrs.has_flatten() && cattrs.deny_unknown_fields() {
2515         Some(quote! {
2516             if let _serde::export::Some(_serde::export::Some((__key, _))) =
2517                 __collect.into_iter().filter(_serde::export::Option::is_some).next()
2518             {
2519                 if let _serde::export::Some(__key) = __key.as_str() {
2520                     return _serde::export::Err(
2521                         _serde::de::Error::custom(format_args!("unknown field `{}`", &__key)));
2522                 } else {
2523                     return _serde::export::Err(
2524                         _serde::de::Error::custom(format_args!("unexpected map key")));
2525                 }
2526             }
2527         })
2528     } else {
2529         None
2530     };
2531 
2532     let result = fields_names.iter().map(|(field, name)| {
2533         let member = &field.member;
2534         if field.attrs.skip_deserializing() {
2535             let value = Expr(expr_is_missing(field, cattrs));
2536             quote!(#member: #value)
2537         } else {
2538             quote!(#member: #name)
2539         }
2540     });
2541 
2542     let let_default = match cattrs.default() {
2543         attr::Default::Default => Some(quote!(
2544             let __default: Self::Value = _serde::export::Default::default();
2545         )),
2546         attr::Default::Path(path) => Some(quote!(
2547             let __default: Self::Value = #path();
2548         )),
2549         attr::Default::None => {
2550             // We don't need the default value, to prevent an unused variable warning
2551             // we'll leave the line empty.
2552             None
2553         }
2554     };
2555 
2556     let mut result = quote!(#struct_path { #(#result),* });
2557     if params.has_getter {
2558         let this = &params.this;
2559         result = quote! {
2560             _serde::export::Into::<#this>::into(#result)
2561         };
2562     }
2563 
2564     quote_block! {
2565         #(#let_values)*
2566 
2567         #let_collect
2568 
2569         #match_keys
2570 
2571         #let_default
2572 
2573         #(#extract_values)*
2574 
2575         #(#extract_collected)*
2576 
2577         #collected_deny_unknown_fields
2578 
2579         _serde::export::Ok(#result)
2580     }
2581 }
2582 
2583 #[cfg(feature = "deserialize_in_place")]
deserialize_struct_as_struct_in_place_visitor( params: &Parameters, fields: &[Field], cattrs: &attr::Container, ) -> (Fragment, Fragment, Fragment)2584 fn deserialize_struct_as_struct_in_place_visitor(
2585     params: &Parameters,
2586     fields: &[Field],
2587     cattrs: &attr::Container,
2588 ) -> (Fragment, Fragment, Fragment) {
2589     assert!(!cattrs.has_flatten());
2590 
2591     let field_names_idents: Vec<_> = fields
2592         .iter()
2593         .enumerate()
2594         .filter(|&(_, field)| !field.attrs.skip_deserializing())
2595         .map(|(i, field)| {
2596             (
2597                 field.attrs.name().deserialize_name(),
2598                 field_i(i),
2599                 field.attrs.aliases(),
2600             )
2601         })
2602         .collect();
2603 
2604     let fields_stmt = {
2605         let field_names = field_names_idents.iter().map(|(name, _, _)| name);
2606         quote_block! {
2607             const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
2608         }
2609     };
2610 
2611     let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
2612 
2613     let visit_map = deserialize_map_in_place(params, fields, cattrs);
2614 
2615     (field_visitor, fields_stmt, visit_map)
2616 }
2617 
2618 #[cfg(feature = "deserialize_in_place")]
deserialize_map_in_place( params: &Parameters, fields: &[Field], cattrs: &attr::Container, ) -> Fragment2619 fn deserialize_map_in_place(
2620     params: &Parameters,
2621     fields: &[Field],
2622     cattrs: &attr::Container,
2623 ) -> Fragment {
2624     assert!(!cattrs.has_flatten());
2625 
2626     // Create the field names for the fields.
2627     let fields_names: Vec<_> = fields
2628         .iter()
2629         .enumerate()
2630         .map(|(i, field)| (field, field_i(i)))
2631         .collect();
2632 
2633     // For deserialize_in_place, declare booleans for each field that will be
2634     // deserialized.
2635     let let_flags = fields_names
2636         .iter()
2637         .filter(|&&(field, _)| !field.attrs.skip_deserializing())
2638         .map(|(_, name)| {
2639             quote! {
2640                 let mut #name: bool = false;
2641             }
2642         });
2643 
2644     // Match arms to extract a value for a field.
2645     let value_arms_from = fields_names
2646         .iter()
2647         .filter(|&&(field, _)| !field.attrs.skip_deserializing())
2648         .map(|(field, name)| {
2649             let deser_name = field.attrs.name().deserialize_name();
2650             let member = &field.member;
2651 
2652             let visit = match field.attrs.deserialize_with() {
2653                 None => {
2654                     quote! {
2655                         try!(_serde::de::MapAccess::next_value_seed(&mut __map, _serde::private::de::InPlaceSeed(&mut self.place.#member)))
2656                     }
2657                 }
2658                 Some(path) => {
2659                     let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
2660                     quote!({
2661                         #wrapper
2662                         self.place.#member = match _serde::de::MapAccess::next_value::<#wrapper_ty>(&mut __map) {
2663                             _serde::export::Ok(__wrapper) => __wrapper.value,
2664                             _serde::export::Err(__err) => {
2665                                 return _serde::export::Err(__err);
2666                             }
2667                         };
2668                     })
2669                 }
2670             };
2671             quote! {
2672                 __Field::#name => {
2673                     if #name {
2674                         return _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#deser_name));
2675                     }
2676                     #visit;
2677                     #name = true;
2678                 }
2679             }
2680         });
2681 
2682     // Visit ignored values to consume them
2683     let ignored_arm = if cattrs.deny_unknown_fields() {
2684         None
2685     } else {
2686         Some(quote! {
2687             _ => { let _ = try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)); }
2688         })
2689     };
2690 
2691     let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
2692 
2693     let match_keys = if cattrs.deny_unknown_fields() && all_skipped {
2694         quote! {
2695             // FIXME: Once we drop support for Rust 1.15:
2696             // let _serde::export::None::<__Field> = try!(_serde::de::MapAccess::next_key(&mut __map));
2697             _serde::export::Option::map(
2698                 try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)),
2699                 |__impossible| match __impossible {});
2700         }
2701     } else {
2702         quote! {
2703             while let _serde::export::Some(__key) = try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)) {
2704                 match __key {
2705                     #(#value_arms_from)*
2706                     #ignored_arm
2707                 }
2708             }
2709         }
2710     };
2711 
2712     let check_flags = fields_names
2713         .iter()
2714         .filter(|&&(field, _)| !field.attrs.skip_deserializing())
2715         .map(|(field, name)| {
2716             let missing_expr = expr_is_missing(field, cattrs);
2717             // If missing_expr unconditionally returns an error, don't try
2718             // to assign its value to self.place.
2719             if field.attrs.default().is_none()
2720                 && cattrs.default().is_none()
2721                 && field.attrs.deserialize_with().is_some()
2722             {
2723                 let missing_expr = Stmts(missing_expr);
2724                 quote! {
2725                     if !#name {
2726                         #missing_expr;
2727                     }
2728                 }
2729             } else {
2730                 let member = &field.member;
2731                 let missing_expr = Expr(missing_expr);
2732                 quote! {
2733                     if !#name {
2734                         self.place.#member = #missing_expr;
2735                     };
2736                 }
2737             }
2738         });
2739 
2740     let this = &params.this;
2741     let (_, _, ty_generics, _) = split_with_de_lifetime(params);
2742 
2743     let let_default = match cattrs.default() {
2744         attr::Default::Default => Some(quote!(
2745             let __default: #this #ty_generics = _serde::export::Default::default();
2746         )),
2747         attr::Default::Path(path) => Some(quote!(
2748             let __default: #this #ty_generics = #path();
2749         )),
2750         attr::Default::None => {
2751             // We don't need the default value, to prevent an unused variable warning
2752             // we'll leave the line empty.
2753             None
2754         }
2755     };
2756 
2757     quote_block! {
2758         #(#let_flags)*
2759 
2760         #match_keys
2761 
2762         #let_default
2763 
2764         #(#check_flags)*
2765 
2766         _serde::export::Ok(())
2767     }
2768 }
2769 
field_i(i: usize) -> Ident2770 fn field_i(i: usize) -> Ident {
2771     Ident::new(&format!("__field{}", i), Span::call_site())
2772 }
2773 
2774 /// This function wraps the expression in `#[serde(deserialize_with = "...")]`
2775 /// in a trait to prevent it from accessing the internal `Deserialize` state.
wrap_deserialize_with( params: &Parameters, value_ty: &TokenStream, deserialize_with: &syn::ExprPath, ) -> (TokenStream, TokenStream)2776 fn wrap_deserialize_with(
2777     params: &Parameters,
2778     value_ty: &TokenStream,
2779     deserialize_with: &syn::ExprPath,
2780 ) -> (TokenStream, TokenStream) {
2781     let this = &params.this;
2782     let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
2783         split_with_de_lifetime(params);
2784     let delife = params.borrowed.de_lifetime();
2785 
2786     let wrapper = quote! {
2787         struct __DeserializeWith #de_impl_generics #where_clause {
2788             value: #value_ty,
2789             phantom: _serde::export::PhantomData<#this #ty_generics>,
2790             lifetime: _serde::export::PhantomData<&#delife ()>,
2791         }
2792 
2793         impl #de_impl_generics _serde::Deserialize<#delife> for __DeserializeWith #de_ty_generics #where_clause {
2794             fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
2795             where
2796                 __D: _serde::Deserializer<#delife>,
2797             {
2798                 _serde::export::Ok(__DeserializeWith {
2799                     value: try!(#deserialize_with(__deserializer)),
2800                     phantom: _serde::export::PhantomData,
2801                     lifetime: _serde::export::PhantomData,
2802                 })
2803             }
2804         }
2805     };
2806 
2807     let wrapper_ty = quote!(__DeserializeWith #de_ty_generics);
2808 
2809     (wrapper, wrapper_ty)
2810 }
2811 
wrap_deserialize_field_with( params: &Parameters, field_ty: &syn::Type, deserialize_with: &syn::ExprPath, ) -> (TokenStream, TokenStream)2812 fn wrap_deserialize_field_with(
2813     params: &Parameters,
2814     field_ty: &syn::Type,
2815     deserialize_with: &syn::ExprPath,
2816 ) -> (TokenStream, TokenStream) {
2817     wrap_deserialize_with(params, &quote!(#field_ty), deserialize_with)
2818 }
2819 
wrap_deserialize_variant_with( params: &Parameters, variant: &Variant, deserialize_with: &syn::ExprPath, ) -> (TokenStream, TokenStream, TokenStream)2820 fn wrap_deserialize_variant_with(
2821     params: &Parameters,
2822     variant: &Variant,
2823     deserialize_with: &syn::ExprPath,
2824 ) -> (TokenStream, TokenStream, TokenStream) {
2825     let this = &params.this;
2826     let variant_ident = &variant.ident;
2827 
2828     let field_tys = variant.fields.iter().map(|field| field.ty);
2829     let (wrapper, wrapper_ty) =
2830         wrap_deserialize_with(params, &quote!((#(#field_tys),*)), deserialize_with);
2831 
2832     let field_access = (0..variant.fields.len()).map(|n| {
2833         Member::Unnamed(Index {
2834             index: n as u32,
2835             span: Span::call_site(),
2836         })
2837     });
2838     let unwrap_fn = match variant.style {
2839         Style::Struct if variant.fields.len() == 1 => {
2840             let member = &variant.fields[0].member;
2841             quote! {
2842                 |__wrap| #this::#variant_ident { #member: __wrap.value }
2843             }
2844         }
2845         Style::Struct => {
2846             let members = variant.fields.iter().map(|field| &field.member);
2847             quote! {
2848                 |__wrap| #this::#variant_ident { #(#members: __wrap.value.#field_access),* }
2849             }
2850         }
2851         Style::Tuple => quote! {
2852             |__wrap| #this::#variant_ident(#(__wrap.value.#field_access),*)
2853         },
2854         Style::Newtype => quote! {
2855             |__wrap| #this::#variant_ident(__wrap.value)
2856         },
2857         Style::Unit => quote! {
2858             |__wrap| #this::#variant_ident
2859         },
2860     };
2861 
2862     (wrapper, wrapper_ty, unwrap_fn)
2863 }
2864 
expr_is_missing(field: &Field, cattrs: &attr::Container) -> Fragment2865 fn expr_is_missing(field: &Field, cattrs: &attr::Container) -> Fragment {
2866     match field.attrs.default() {
2867         attr::Default::Default => {
2868             let span = field.original.span();
2869             let func = quote_spanned!(span=> _serde::export::Default::default);
2870             return quote_expr!(#func());
2871         }
2872         attr::Default::Path(path) => {
2873             return quote_expr!(#path());
2874         }
2875         attr::Default::None => { /* below */ }
2876     }
2877 
2878     match *cattrs.default() {
2879         attr::Default::Default | attr::Default::Path(_) => {
2880             let member = &field.member;
2881             return quote_expr!(__default.#member);
2882         }
2883         attr::Default::None => { /* below */ }
2884     }
2885 
2886     let name = field.attrs.name().deserialize_name();
2887     match field.attrs.deserialize_with() {
2888         None => {
2889             let span = field.original.span();
2890             let func = quote_spanned!(span=> _serde::private::de::missing_field);
2891             quote_expr! {
2892                 try!(#func(#name))
2893             }
2894         }
2895         Some(_) => {
2896             quote_expr! {
2897                 return _serde::export::Err(<__A::Error as _serde::de::Error>::missing_field(#name))
2898             }
2899         }
2900     }
2901 }
2902 
effective_style(variant: &Variant) -> Style2903 fn effective_style(variant: &Variant) -> Style {
2904     match variant.style {
2905         Style::Newtype if variant.fields[0].attrs.skip_deserializing() => Style::Unit,
2906         other => other,
2907     }
2908 }
2909 
2910 struct DeImplGenerics<'a>(&'a Parameters);
2911 #[cfg(feature = "deserialize_in_place")]
2912 struct InPlaceImplGenerics<'a>(&'a Parameters);
2913 
2914 impl<'a> ToTokens for DeImplGenerics<'a> {
to_tokens(&self, tokens: &mut TokenStream)2915     fn to_tokens(&self, tokens: &mut TokenStream) {
2916         let mut generics = self.0.generics.clone();
2917         if let Some(de_lifetime) = self.0.borrowed.de_lifetime_def() {
2918             generics.params = Some(syn::GenericParam::Lifetime(de_lifetime))
2919                 .into_iter()
2920                 .chain(generics.params)
2921                 .collect();
2922         }
2923         let (impl_generics, _, _) = generics.split_for_impl();
2924         impl_generics.to_tokens(tokens);
2925     }
2926 }
2927 
2928 #[cfg(feature = "deserialize_in_place")]
2929 impl<'a> ToTokens for InPlaceImplGenerics<'a> {
to_tokens(&self, tokens: &mut TokenStream)2930     fn to_tokens(&self, tokens: &mut TokenStream) {
2931         let place_lifetime = place_lifetime();
2932         let mut generics = self.0.generics.clone();
2933 
2934         // Add lifetime for `&'place mut Self, and `'a: 'place`
2935         for param in &mut generics.params {
2936             match param {
2937                 syn::GenericParam::Lifetime(param) => {
2938                     param.bounds.push(place_lifetime.lifetime.clone());
2939                 }
2940                 syn::GenericParam::Type(param) => {
2941                     param.bounds.push(syn::TypeParamBound::Lifetime(
2942                         place_lifetime.lifetime.clone(),
2943                     ));
2944                 }
2945                 syn::GenericParam::Const(_) => {}
2946             }
2947         }
2948         generics.params = Some(syn::GenericParam::Lifetime(place_lifetime))
2949             .into_iter()
2950             .chain(generics.params)
2951             .collect();
2952         if let Some(de_lifetime) = self.0.borrowed.de_lifetime_def() {
2953             generics.params = Some(syn::GenericParam::Lifetime(de_lifetime))
2954                 .into_iter()
2955                 .chain(generics.params)
2956                 .collect();
2957         }
2958         let (impl_generics, _, _) = generics.split_for_impl();
2959         impl_generics.to_tokens(tokens);
2960     }
2961 }
2962 
2963 #[cfg(feature = "deserialize_in_place")]
2964 impl<'a> DeImplGenerics<'a> {
in_place(self) -> InPlaceImplGenerics<'a>2965     fn in_place(self) -> InPlaceImplGenerics<'a> {
2966         InPlaceImplGenerics(self.0)
2967     }
2968 }
2969 
2970 struct DeTypeGenerics<'a>(&'a Parameters);
2971 #[cfg(feature = "deserialize_in_place")]
2972 struct InPlaceTypeGenerics<'a>(&'a Parameters);
2973 
2974 impl<'a> ToTokens for DeTypeGenerics<'a> {
to_tokens(&self, tokens: &mut TokenStream)2975     fn to_tokens(&self, tokens: &mut TokenStream) {
2976         let mut generics = self.0.generics.clone();
2977         if self.0.borrowed.de_lifetime_def().is_some() {
2978             let def = syn::LifetimeDef {
2979                 attrs: Vec::new(),
2980                 lifetime: syn::Lifetime::new("'de", Span::call_site()),
2981                 colon_token: None,
2982                 bounds: Punctuated::new(),
2983             };
2984             generics.params = Some(syn::GenericParam::Lifetime(def))
2985                 .into_iter()
2986                 .chain(generics.params)
2987                 .collect();
2988         }
2989         let (_, ty_generics, _) = generics.split_for_impl();
2990         ty_generics.to_tokens(tokens);
2991     }
2992 }
2993 
2994 #[cfg(feature = "deserialize_in_place")]
2995 impl<'a> ToTokens for InPlaceTypeGenerics<'a> {
to_tokens(&self, tokens: &mut TokenStream)2996     fn to_tokens(&self, tokens: &mut TokenStream) {
2997         let mut generics = self.0.generics.clone();
2998         generics.params = Some(syn::GenericParam::Lifetime(place_lifetime()))
2999             .into_iter()
3000             .chain(generics.params)
3001             .collect();
3002 
3003         if self.0.borrowed.de_lifetime_def().is_some() {
3004             let def = syn::LifetimeDef {
3005                 attrs: Vec::new(),
3006                 lifetime: syn::Lifetime::new("'de", Span::call_site()),
3007                 colon_token: None,
3008                 bounds: Punctuated::new(),
3009             };
3010             generics.params = Some(syn::GenericParam::Lifetime(def))
3011                 .into_iter()
3012                 .chain(generics.params)
3013                 .collect();
3014         }
3015         let (_, ty_generics, _) = generics.split_for_impl();
3016         ty_generics.to_tokens(tokens);
3017     }
3018 }
3019 
3020 #[cfg(feature = "deserialize_in_place")]
3021 impl<'a> DeTypeGenerics<'a> {
in_place(self) -> InPlaceTypeGenerics<'a>3022     fn in_place(self) -> InPlaceTypeGenerics<'a> {
3023         InPlaceTypeGenerics(self.0)
3024     }
3025 }
3026 
3027 #[cfg(feature = "deserialize_in_place")]
place_lifetime() -> syn::LifetimeDef3028 fn place_lifetime() -> syn::LifetimeDef {
3029     syn::LifetimeDef {
3030         attrs: Vec::new(),
3031         lifetime: syn::Lifetime::new("'place", Span::call_site()),
3032         colon_token: None,
3033         bounds: Punctuated::new(),
3034     }
3035 }
3036 
split_with_de_lifetime( params: &Parameters, ) -> ( DeImplGenerics, DeTypeGenerics, syn::TypeGenerics, Option<&syn::WhereClause>, )3037 fn split_with_de_lifetime(
3038     params: &Parameters,
3039 ) -> (
3040     DeImplGenerics,
3041     DeTypeGenerics,
3042     syn::TypeGenerics,
3043     Option<&syn::WhereClause>,
3044 ) {
3045     let de_impl_generics = DeImplGenerics(params);
3046     let de_ty_generics = DeTypeGenerics(params);
3047     let (_, ty_generics, where_clause) = params.generics.split_for_impl();
3048     (de_impl_generics, de_ty_generics, ty_generics, where_clause)
3049 }
3050