serde_derive/
de.rs

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