serde_derive/
de.rs

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