summaryrefslogtreecommitdiffstats
path: root/vendor/serde_derive
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/serde_derive')
-rw-r--r--vendor/serde_derive/.cargo-checksum.json2
-rw-r--r--vendor/serde_derive/Cargo.toml9
-rw-r--r--vendor/serde_derive/README.md2
-rw-r--r--vendor/serde_derive/crates-io.md2
-rw-r--r--vendor/serde_derive/src/bound.rs2
-rw-r--r--vendor/serde_derive/src/de.rs410
-rw-r--r--vendor/serde_derive/src/internals/attr.rs7
-rw-r--r--vendor/serde_derive/src/internals/check.rs10
-rw-r--r--vendor/serde_derive/src/lib.rs6
9 files changed, 232 insertions, 218 deletions
diff --git a/vendor/serde_derive/.cargo-checksum.json b/vendor/serde_derive/.cargo-checksum.json
index 44476cfe8..a26efdce1 100644
--- a/vendor/serde_derive/.cargo-checksum.json
+++ b/vendor/serde_derive/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"57006278b8f645cedd47b3c0c7af2343388f43a6473c2f039e783c02ca030fc8","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"13c66875efb67f64fdec817725f34ceb07913e1ebea4adc240868d2ed581d3da","crates-io.md":"ee22254ee64c3189eef3e707c8d75dc66a8df2a7ee9e518d95238950780ec387","src/bound.rs":"9211d852730380be8e0af9ed5daa52e61563e598eef458739025551ba76aa7c6","src/de.rs":"240926ab4ea76bfe883e93d2b6ff252cfdbc46ae98fff1a64664e22bcac78daa","src/dummy.rs":"1b7de5bfe1158ea7e70d668d4f76fdccf7f63144ac7869e82e8bf1e7ea0db13c","src/fragment.rs":"5548ba65a53d90a296f60c1328a7a7fb040db467f59c2f5210b2fb320457145d","src/internals/ast.rs":"07dfd9a789cd6268c2cff2889e738193d24e68c93873792a0548d5e6b3c94ca4","src/internals/attr.rs":"b9f7a99895f4e9dbec433e14f647eb9ac1457ed7eb47180aaac3b4e8c6420be3","src/internals/case.rs":"9492f0c5142d7b7e8cd39c86d13a855e5ce4489425adb2b96aed89e1b7851ac0","src/internals/check.rs":"0449cc7653fc9e596f65028835bbb7d1545c10002c79c7608547f45a722c0040","src/internals/ctxt.rs":"c403db8260a533e58af06e8d0a2bb962edb13a250424ab1f1fd2719902affc37","src/internals/mod.rs":"f32138ff19d57eb00f88ba11f6b015efab2102657804f71ebbf386a3698dad91","src/internals/receiver.rs":"6b016351b8294539039095863d8c99e81dd4530d7f769003d12d4ca73cca172c","src/internals/respan.rs":"899753859c58ce5f532a3ec4584796a52f13ed5a0533191e48c953ba5c1b52ff","src/internals/symbol.rs":"2bf0287da64d28da7e8673af60f66aaf6b29efe33131e56b24d6fa55edb533ad","src/lib.rs":"fa8c851c7b681e0662bde69f7b03a3dfc3b32dc94e1687cadd57d95cfbba4d4e","src/pretend.rs":"0e570faf787015535ea6b6683ebc271633c1ca945d3ee1d072c497a1a920c380","src/ser.rs":"e435dc7ef8ee9dca02913f43b4162d22c664061510089745b6278a63df7d30fe","src/this.rs":"a2c128955324c2994ed7cdc3fe4eeceb7ad8a0f9d071665a8378c85c8df64ce2","src/try.rs":"b171b0088c23ebf4bfa07ba457881b41ac5e547d55dd16f737ea988d34badf61"},"package":"d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68"} \ No newline at end of file
+{"files":{"Cargo.toml":"b6d33f5823dfd757e7d8f0be8cc237bbb2d8c4a6f4ff3c91aadbbc51e8fa4d81","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"00f425034a43042279478ba3a0826245e39cf7dc6a7497350db1adf2e97a8b34","crates-io.md":"56e988ac4944c45f5bf5051e3827892ed8fb817853d99d9df1fff6621108e270","src/bound.rs":"fee590a67ca956d7a2fca50a2dc069e71d27fa9adacde98670a88245a8841cf6","src/de.rs":"71bab0d455b977e98aad5a433ecfd511b42c94cea6d3961835b92d49e68a17da","src/dummy.rs":"1b7de5bfe1158ea7e70d668d4f76fdccf7f63144ac7869e82e8bf1e7ea0db13c","src/fragment.rs":"5548ba65a53d90a296f60c1328a7a7fb040db467f59c2f5210b2fb320457145d","src/internals/ast.rs":"07dfd9a789cd6268c2cff2889e738193d24e68c93873792a0548d5e6b3c94ca4","src/internals/attr.rs":"55b59fb42ac041ec44c34dfa58e2c11d37783fa4f5200fbd8520fe28d798eff7","src/internals/case.rs":"9492f0c5142d7b7e8cd39c86d13a855e5ce4489425adb2b96aed89e1b7851ac0","src/internals/check.rs":"41f4725b20919b8828850529d8d395dbb55f54ca4069a9cd0bf37109e9b93172","src/internals/ctxt.rs":"c403db8260a533e58af06e8d0a2bb962edb13a250424ab1f1fd2719902affc37","src/internals/mod.rs":"f32138ff19d57eb00f88ba11f6b015efab2102657804f71ebbf386a3698dad91","src/internals/receiver.rs":"6b016351b8294539039095863d8c99e81dd4530d7f769003d12d4ca73cca172c","src/internals/respan.rs":"899753859c58ce5f532a3ec4584796a52f13ed5a0533191e48c953ba5c1b52ff","src/internals/symbol.rs":"2bf0287da64d28da7e8673af60f66aaf6b29efe33131e56b24d6fa55edb533ad","src/lib.rs":"a008b6a91eb5b7bb410283e25b5276a0805c7902954e469c12ee14ed11c44be4","src/pretend.rs":"0e570faf787015535ea6b6683ebc271633c1ca945d3ee1d072c497a1a920c380","src/ser.rs":"e435dc7ef8ee9dca02913f43b4162d22c664061510089745b6278a63df7d30fe","src/this.rs":"a2c128955324c2994ed7cdc3fe4eeceb7ad8a0f9d071665a8378c85c8df64ce2","src/try.rs":"b171b0088c23ebf4bfa07ba457881b41ac5e547d55dd16f737ea988d34badf61"},"package":"389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682"} \ No newline at end of file
diff --git a/vendor/serde_derive/Cargo.toml b/vendor/serde_derive/Cargo.toml
index e2865f5c6..f233cd751 100644
--- a/vendor/serde_derive/Cargo.toml
+++ b/vendor/serde_derive/Cargo.toml
@@ -12,7 +12,7 @@
[package]
rust-version = "1.56"
name = "serde_derive"
-version = "1.0.164"
+version = "1.0.171"
authors = [
"Erick Tryzelaar <erick.tryzelaar@gmail.com>",
"David Tolnay <dtolnay@gmail.com>",
@@ -35,7 +35,10 @@ keywords = [
"no_std",
"derive",
]
-categories = ["no-std"]
+categories = [
+ "no-std",
+ "no-std::no-alloc",
+]
license = "MIT OR Apache-2.0"
repository = "https://github.com/serde-rs/serde"
@@ -53,7 +56,7 @@ version = "1.0"
version = "1.0"
[dependencies.syn]
-version = "2.0.3"
+version = "2.0.25"
[dev-dependencies.serde]
version = "1.0"
diff --git a/vendor/serde_derive/README.md b/vendor/serde_derive/README.md
index d53e57234..a049250b6 100644
--- a/vendor/serde_derive/README.md
+++ b/vendor/serde_derive/README.md
@@ -48,7 +48,7 @@ serde_json = "1.0"
<p></p>
```rust
-use serde::{Serialize, Deserialize};
+use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct Point {
diff --git a/vendor/serde_derive/crates-io.md b/vendor/serde_derive/crates-io.md
index 6e0ec280c..187100358 100644
--- a/vendor/serde_derive/crates-io.md
+++ b/vendor/serde_derive/crates-io.md
@@ -16,7 +16,7 @@ You may be looking for:
## Serde in action
```rust
-use serde::{Serialize, Deserialize};
+use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct Point {
diff --git a/vendor/serde_derive/src/bound.rs b/vendor/serde_derive/src/bound.rs
index 7bdb046ea..a38e7c2b5 100644
--- a/vendor/serde_derive/src/bound.rs
+++ b/vendor/serde_derive/src/bound.rs
@@ -259,7 +259,7 @@ pub fn with_bound(
};
match &cont.data {
Data::Enum(variants) => {
- for variant in variants.iter() {
+ for variant in variants {
let relevant_fields = variant
.fields
.iter()
diff --git a/vendor/serde_derive/src/de.rs b/vendor/serde_derive/src/de.rs
index a834a736e..cb98b8ea2 100644
--- a/vendor/serde_derive/src/de.rs
+++ b/vendor/serde_derive/src/de.rs
@@ -287,10 +287,10 @@ fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
match &cont.data {
Data::Enum(variants) => deserialize_enum(params, variants, &cont.attrs),
Data::Struct(Style::Struct, fields) => {
- deserialize_struct(None, params, fields, &cont.attrs, None, &Untagged::No)
+ deserialize_struct(params, fields, &cont.attrs, StructForm::Struct)
}
Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => {
- deserialize_tuple(None, params, fields, &cont.attrs, None)
+ deserialize_tuple(params, fields, &cont.attrs, TupleForm::Tuple)
}
Data::Struct(Style::Unit, _) => deserialize_unit_struct(params, &cont.attrs),
}
@@ -410,16 +410,22 @@ fn deserialize_unit_struct(params: &Parameters, cattrs: &attr::Container) -> Fra
let this_type = &params.this_type;
let this_value = &params.this_value;
let type_name = cattrs.name().deserialize_name();
+ let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
+ split_with_de_lifetime(params);
+ let delife = params.borrowed.de_lifetime();
let expecting = format!("unit struct {}", params.type_name());
let expecting = cattrs.expecting().unwrap_or(&expecting);
quote_block! {
#[doc(hidden)]
- struct __Visitor;
+ struct __Visitor #de_impl_generics #where_clause {
+ marker: _serde::__private::PhantomData<#this_type #ty_generics>,
+ lifetime: _serde::__private::PhantomData<&#delife ()>,
+ }
- impl<'de> _serde::de::Visitor<'de> for __Visitor {
- type Value = #this_type;
+ impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
+ type Value = #this_type #ty_generics;
fn expecting(&self, __formatter: &mut _serde::__private::Formatter) -> _serde::__private::fmt::Result {
_serde::__private::Formatter::write_str(__formatter, #expecting)
@@ -434,25 +440,45 @@ fn deserialize_unit_struct(params: &Parameters, cattrs: &attr::Container) -> Fra
}
}
- _serde::Deserializer::deserialize_unit_struct(__deserializer, #type_name, __Visitor)
+ _serde::Deserializer::deserialize_unit_struct(
+ __deserializer,
+ #type_name,
+ __Visitor {
+ marker: _serde::__private::PhantomData::<#this_type #ty_generics>,
+ lifetime: _serde::__private::PhantomData,
+ },
+ )
}
}
+enum TupleForm<'a> {
+ Tuple,
+ /// Contains a variant name
+ ExternallyTagged(&'a syn::Ident),
+ /// Contains a variant name and an intermediate deserializer from which actual
+ /// deserialization will be performed
+ Untagged(&'a syn::Ident, TokenStream),
+}
+
fn deserialize_tuple(
- variant_ident: Option<&syn::Ident>,
params: &Parameters,
fields: &[Field],
cattrs: &attr::Container,
- deserializer: Option<TokenStream>,
+ form: TupleForm,
) -> Fragment {
+ assert!(!cattrs.has_flatten());
+
+ let field_count = fields
+ .iter()
+ .filter(|field| !field.attrs.skip_deserializing())
+ .count();
+
let this_type = &params.this_type;
let this_value = &params.this_value;
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
split_with_de_lifetime(params);
let delife = params.borrowed.de_lifetime();
- assert!(!cattrs.has_flatten());
-
// If there are getters (implying private fields), construct the local type
// and use an `Into` conversion to get the remote type. If there are no
// getters then construct the target type directly.
@@ -463,23 +489,27 @@ fn deserialize_tuple(
quote!(#this_value)
};
- let is_enum = variant_ident.is_some();
- let type_path = match variant_ident {
- Some(variant_ident) => quote!(#construct::#variant_ident),
- None => construct,
+ let type_path = match form {
+ TupleForm::Tuple => construct,
+ TupleForm::ExternallyTagged(variant_ident) | TupleForm::Untagged(variant_ident, _) => {
+ quote!(#construct::#variant_ident)
+ }
};
- let expecting = match variant_ident {
- Some(variant_ident) => format!("tuple variant {}::{}", params.type_name(), variant_ident),
- None => format!("tuple struct {}", params.type_name()),
+ let expecting = match form {
+ TupleForm::Tuple => format!("tuple struct {}", params.type_name()),
+ TupleForm::ExternallyTagged(variant_ident) | TupleForm::Untagged(variant_ident, _) => {
+ format!("tuple variant {}::{}", params.type_name(), variant_ident)
+ }
};
let expecting = cattrs.expecting().unwrap_or(&expecting);
let nfields = fields.len();
- let visit_newtype_struct = if !is_enum && nfields == 1 {
- Some(deserialize_newtype_struct(&type_path, params, &fields[0]))
- } else {
- None
+ let visit_newtype_struct = match form {
+ TupleForm::Tuple if nfields == 1 => {
+ Some(deserialize_newtype_struct(&type_path, params, &fields[0]))
+ }
+ _ => None,
};
let visit_seq = Stmts(deserialize_seq(
@@ -492,20 +522,28 @@ fn deserialize_tuple(
lifetime: _serde::__private::PhantomData,
}
};
- let dispatch = if let Some(deserializer) = deserializer {
- quote!(_serde::Deserializer::deserialize_tuple(#deserializer, #nfields, #visitor_expr))
- } else if is_enum {
- quote!(_serde::de::VariantAccess::tuple_variant(__variant, #nfields, #visitor_expr))
- } else if nfields == 1 {
- let type_name = cattrs.name().deserialize_name();
- quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
- } else {
- let type_name = cattrs.name().deserialize_name();
- quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #nfields, #visitor_expr))
+ let dispatch = match form {
+ TupleForm::Tuple if nfields == 1 => {
+ let type_name = cattrs.name().deserialize_name();
+ quote! {
+ _serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr)
+ }
+ }
+ TupleForm::Tuple => {
+ let type_name = cattrs.name().deserialize_name();
+ quote! {
+ _serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr)
+ }
+ }
+ TupleForm::ExternallyTagged(_) => quote! {
+ _serde::de::VariantAccess::tuple_variant(__variant, #field_count, #visitor_expr)
+ },
+ TupleForm::Untagged(_, deserializer) => quote! {
+ _serde::Deserializer::deserialize_tuple(#deserializer, #field_count, #visitor_expr)
+ },
};
- let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
- let visitor_var = if all_skipped {
+ let visitor_var = if field_count == 0 {
quote!(_)
} else {
quote!(mut __seq)
@@ -548,13 +586,18 @@ fn deserialize_tuple_in_place(
cattrs: &attr::Container,
deserializer: Option<TokenStream>,
) -> Fragment {
+ assert!(!cattrs.has_flatten());
+
+ let field_count = fields
+ .iter()
+ .filter(|field| !field.attrs.skip_deserializing())
+ .count();
+
let this_type = &params.this_type;
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
split_with_de_lifetime(params);
let delife = params.borrowed.de_lifetime();
- assert!(!cattrs.has_flatten());
-
let is_enum = variant_ident.is_some();
let expecting = match variant_ident {
Some(variant_ident) => format!("tuple variant {}::{}", params.type_name(), variant_ident),
@@ -580,19 +623,18 @@ fn deserialize_tuple_in_place(
};
let dispatch = if let Some(deserializer) = deserializer {
- quote!(_serde::Deserializer::deserialize_tuple(#deserializer, #nfields, #visitor_expr))
+ quote!(_serde::Deserializer::deserialize_tuple(#deserializer, #field_count, #visitor_expr))
} else if is_enum {
- quote!(_serde::de::VariantAccess::tuple_variant(__variant, #nfields, #visitor_expr))
+ quote!(_serde::de::VariantAccess::tuple_variant(__variant, #field_count, #visitor_expr))
} else if nfields == 1 {
let type_name = cattrs.name().deserialize_name();
quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
} else {
let type_name = cattrs.name().deserialize_name();
- quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #nfields, #visitor_expr))
+ quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr))
};
- let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
- let visitor_var = if all_skipped {
+ let visitor_var = if field_count == 0 {
quote!(_)
} else {
quote!(mut __seq)
@@ -893,21 +935,24 @@ fn deserialize_newtype_struct_in_place(params: &Parameters, field: &Field) -> To
}
}
-enum Untagged {
- Yes,
- No,
+enum StructForm<'a> {
+ Struct,
+ /// Contains a variant name
+ ExternallyTagged(&'a syn::Ident),
+ /// Contains a variant name and an intermediate deserializer from which actual
+ /// deserialization will be performed
+ InternallyTagged(&'a syn::Ident, TokenStream),
+ /// Contains a variant name and an intermediate deserializer from which actual
+ /// deserialization will be performed
+ Untagged(&'a syn::Ident, TokenStream),
}
fn deserialize_struct(
- variant_ident: Option<&syn::Ident>,
params: &Parameters,
fields: &[Field],
cattrs: &attr::Container,
- deserializer: Option<TokenStream>,
- untagged: &Untagged,
+ form: StructForm,
) -> Fragment {
- let is_enum = variant_ident.is_some();
-
let this_type = &params.this_type;
let this_value = &params.this_value;
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
@@ -924,83 +969,74 @@ fn deserialize_struct(
quote!(#this_value)
};
- let type_path = match variant_ident {
- Some(variant_ident) => quote!(#construct::#variant_ident),
- None => construct,
+ let type_path = match form {
+ StructForm::Struct => construct,
+ StructForm::ExternallyTagged(variant_ident)
+ | StructForm::InternallyTagged(variant_ident, _)
+ | StructForm::Untagged(variant_ident, _) => quote!(#construct::#variant_ident),
};
- let expecting = match variant_ident {
- Some(variant_ident) => format!("struct variant {}::{}", params.type_name(), variant_ident),
- None => format!("struct {}", params.type_name()),
+ let expecting = match form {
+ StructForm::Struct => format!("struct {}", params.type_name()),
+ StructForm::ExternallyTagged(variant_ident)
+ | StructForm::InternallyTagged(variant_ident, _)
+ | StructForm::Untagged(variant_ident, _) => {
+ format!("struct variant {}::{}", params.type_name(), variant_ident)
+ }
};
let expecting = cattrs.expecting().unwrap_or(&expecting);
- let visit_seq = Stmts(deserialize_seq(
- &type_path, params, fields, true, cattrs, expecting,
+ let field_names_idents: Vec<_> = fields
+ .iter()
+ .enumerate()
+ // Skip fields that shouldn't be deserialized or that were flattened,
+ // so they don't appear in the storage in their literal form
+ .filter(|&(_, field)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
+ .map(|(i, field)| {
+ (
+ field.attrs.name().deserialize_name(),
+ field_i(i),
+ field.attrs.aliases(),
+ )
+ })
+ .collect();
+ let field_visitor = Stmts(deserialize_generated_identifier(
+ &field_names_idents,
+ cattrs,
+ false,
+ None,
));
- let (field_visitor, fields_stmt, visit_map) = if cattrs.has_flatten() {
- deserialize_struct_as_map_visitor(&type_path, params, fields, cattrs)
- } else {
- deserialize_struct_as_struct_visitor(&type_path, params, fields, cattrs)
- };
- let field_visitor = Stmts(field_visitor);
- let fields_stmt = fields_stmt.map(Stmts);
- let visit_map = Stmts(visit_map);
-
- let visitor_expr = quote! {
- __Visitor {
- marker: _serde::__private::PhantomData::<#this_type #ty_generics>,
- lifetime: _serde::__private::PhantomData,
- }
- };
- let need_seed = deserializer.is_none();
- let dispatch = if let Some(deserializer) = deserializer {
- quote! {
- _serde::Deserializer::deserialize_any(#deserializer, #visitor_expr)
- }
- } else if is_enum && cattrs.has_flatten() {
- quote! {
- _serde::de::VariantAccess::newtype_variant_seed(__variant, #visitor_expr)
- }
- } else if is_enum {
- quote! {
- _serde::de::VariantAccess::struct_variant(__variant, FIELDS, #visitor_expr)
- }
- } else if cattrs.has_flatten() {
- quote! {
- _serde::Deserializer::deserialize_map(__deserializer, #visitor_expr)
- }
- } else {
- let type_name = cattrs.name().deserialize_name();
- quote! {
- _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, #visitor_expr)
- }
- };
-
- let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
- let visitor_var = if all_skipped {
- quote!(_)
- } else {
- quote!(mut __seq)
- };
-
// untagged struct variants do not get a visit_seq method. The same applies to
// structs that only have a map representation.
- let visit_seq = match *untagged {
- Untagged::No if !cattrs.has_flatten() => Some(quote! {
- #[inline]
- fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::__private::Result<Self::Value, __A::Error>
- where
- __A: _serde::de::SeqAccess<#delife>,
- {
- #visit_seq
- }
- }),
- _ => None,
+ let visit_seq = match form {
+ StructForm::Untagged(..) => None,
+ _ if cattrs.has_flatten() => None,
+ _ => {
+ let mut_seq = if field_names_idents.is_empty() {
+ quote!(_)
+ } else {
+ quote!(mut __seq)
+ };
+
+ let visit_seq = Stmts(deserialize_seq(
+ &type_path, params, fields, true, cattrs, expecting,
+ ));
+
+ Some(quote! {
+ #[inline]
+ fn visit_seq<__A>(self, #mut_seq: __A) -> _serde::__private::Result<Self::Value, __A::Error>
+ where
+ __A: _serde::de::SeqAccess<#delife>,
+ {
+ #visit_seq
+ }
+ })
+ }
};
+ let visit_map = Stmts(deserialize_map(&type_path, params, fields, cattrs));
- let visitor_seed = if need_seed && is_enum && cattrs.has_flatten() {
- Some(quote! {
+ let visitor_seed = match form {
+ StructForm::ExternallyTagged(..) if cattrs.has_flatten() => Some(quote! {
impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Visitor #de_ty_generics #where_clause {
type Value = #this_type #ty_generics;
@@ -1011,9 +1047,51 @@ fn deserialize_struct(
_serde::Deserializer::deserialize_map(__deserializer, self)
}
}
- })
- } else {
+ }),
+ _ => None,
+ };
+
+ let fields_stmt = if cattrs.has_flatten() {
None
+ } else {
+ let field_names = field_names_idents
+ .iter()
+ .flat_map(|(_, _, aliases)| aliases);
+
+ Some(quote! {
+ #[doc(hidden)]
+ const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
+ })
+ };
+
+ let visitor_expr = quote! {
+ __Visitor {
+ marker: _serde::__private::PhantomData::<#this_type #ty_generics>,
+ lifetime: _serde::__private::PhantomData,
+ }
+ };
+ let dispatch = match form {
+ StructForm::Struct if cattrs.has_flatten() => quote! {
+ _serde::Deserializer::deserialize_map(__deserializer, #visitor_expr)
+ },
+ StructForm::Struct => {
+ let type_name = cattrs.name().deserialize_name();
+ quote! {
+ _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, #visitor_expr)
+ }
+ }
+ StructForm::ExternallyTagged(_) if cattrs.has_flatten() => quote! {
+ _serde::de::VariantAccess::newtype_variant_seed(__variant, #visitor_expr)
+ },
+ StructForm::ExternallyTagged(_) => quote! {
+ _serde::de::VariantAccess::struct_variant(__variant, FIELDS, #visitor_expr)
+ },
+ StructForm::InternallyTagged(_, deserializer) => quote! {
+ _serde::Deserializer::deserialize_any(#deserializer, #visitor_expr)
+ },
+ StructForm::Untagged(_, deserializer) => quote! {
+ _serde::Deserializer::deserialize_any(#deserializer, #visitor_expr)
+ },
};
quote_block! {
@@ -1348,9 +1426,7 @@ fn deserialize_internally_tagged_enum(
params,
variant,
cattrs,
- quote! {
- _serde::__private::de::ContentDeserializer::<__D::Error>::new(__tagged.content)
- },
+ quote!(__deserializer),
));
quote! {
@@ -1366,11 +1442,12 @@ fn deserialize_internally_tagged_enum(
#variants_stmt
- let __tagged = try!(_serde::Deserializer::deserialize_any(
+ let (__tag, __content) = try!(_serde::Deserializer::deserialize_any(
__deserializer,
_serde::__private::de::TaggedContentVisitor::<__Field>::new(#tag, #expecting)));
+ let __deserializer = _serde::__private::de::ContentDeserializer::<__D::Error>::new(__content);
- match __tagged.tag {
+ match __tag {
#(#variant_arms)*
}
}
@@ -1761,16 +1838,17 @@ fn deserialize_externally_tagged_variant(
&variant.fields[0],
cattrs,
),
- Style::Tuple => {
- deserialize_tuple(Some(variant_ident), params, &variant.fields, cattrs, None)
- }
+ Style::Tuple => deserialize_tuple(
+ params,
+ &variant.fields,
+ cattrs,
+ TupleForm::ExternallyTagged(variant_ident),
+ ),
Style::Struct => deserialize_struct(
- Some(variant_ident),
params,
&variant.fields,
cattrs,
- None,
- &Untagged::No,
+ StructForm::ExternallyTagged(variant_ident),
),
}
}
@@ -1810,12 +1888,10 @@ fn deserialize_internally_tagged_variant(
&deserializer,
),
Style::Struct => deserialize_struct(
- Some(variant_ident),
params,
&variant.fields,
cattrs,
- Some(deserializer),
- &Untagged::No,
+ StructForm::InternallyTagged(variant_ident, deserializer),
),
Style::Tuple => unreachable!("checked in serde_derive_internals"),
}
@@ -1862,19 +1938,16 @@ fn deserialize_untagged_variant(
&deserializer,
),
Style::Tuple => deserialize_tuple(
- Some(variant_ident),
params,
&variant.fields,
cattrs,
- Some(deserializer),
+ TupleForm::Untagged(variant_ident, deserializer),
),
Style::Struct => deserialize_struct(
- Some(variant_ident),
params,
&variant.fields,
cattrs,
- Some(deserializer),
- &Untagged::Yes,
+ StructForm::Untagged(variant_ident, deserializer),
),
}
}
@@ -2415,71 +2488,6 @@ fn deserialize_identifier(
}
}
-fn deserialize_struct_as_struct_visitor(
- struct_path: &TokenStream,
- params: &Parameters,
- fields: &[Field],
- cattrs: &attr::Container,
-) -> (Fragment, Option<Fragment>, Fragment) {
- assert!(!cattrs.has_flatten());
-
- let field_names_idents: Vec<_> = fields
- .iter()
- .enumerate()
- .filter(|&(_, field)| !field.attrs.skip_deserializing())
- .map(|(i, field)| {
- (
- field.attrs.name().deserialize_name(),
- field_i(i),
- field.attrs.aliases(),
- )
- })
- .collect();
-
- let fields_stmt = {
- let field_names = field_names_idents
- .iter()
- .flat_map(|(_, _, aliases)| aliases);
-
- quote_block! {
- #[doc(hidden)]
- const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
- }
- };
-
- let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
-
- let visit_map = deserialize_map(struct_path, params, fields, cattrs);
-
- (field_visitor, Some(fields_stmt), visit_map)
-}
-
-fn deserialize_struct_as_map_visitor(
- struct_path: &TokenStream,
- params: &Parameters,
- fields: &[Field],
- cattrs: &attr::Container,
-) -> (Fragment, Option<Fragment>, Fragment) {
- let field_names_idents: Vec<_> = fields
- .iter()
- .enumerate()
- .filter(|&(_, field)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
- .map(|(i, field)| {
- (
- field.attrs.name().deserialize_name(),
- field_i(i),
- field.attrs.aliases(),
- )
- })
- .collect();
-
- let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
-
- let visit_map = deserialize_map(struct_path, params, fields, cattrs);
-
- (field_visitor, None, visit_map)
-}
-
fn deserialize_map(
struct_path: &TokenStream,
params: &Parameters,
diff --git a/vendor/serde_derive/src/internals/attr.rs b/vendor/serde_derive/src/internals/attr.rs
index bff82191b..42212a64d 100644
--- a/vendor/serde_derive/src/internals/attr.rs
+++ b/vendor/serde_derive/src/internals/attr.rs
@@ -1418,6 +1418,13 @@ fn get_lit_str2(
..
}) = value
{
+ let suffix = lit.suffix();
+ if !suffix.is_empty() {
+ cx.error_spanned_by(
+ lit,
+ format!("unexpected suffix `{}` on string literal", suffix),
+ );
+ }
Ok(Some(lit.clone()))
} else {
cx.error_spanned_by(
diff --git a/vendor/serde_derive/src/internals/check.rs b/vendor/serde_derive/src/internals/check.rs
index 05b4b8ff8..4a7f52c6c 100644
--- a/vendor/serde_derive/src/internals/check.rs
+++ b/vendor/serde_derive/src/internals/check.rs
@@ -110,9 +110,7 @@ fn check_flatten_field(cx: &Ctxt, style: Style, field: &Field) {
fn check_identifier(cx: &Ctxt, cont: &Container) {
let variants = match &cont.data {
Data::Enum(variants) => variants,
- Data::Struct(_, _) => {
- return;
- }
+ Data::Struct(_, _) => return,
};
for (i, variant) in variants.iter().enumerate() {
@@ -194,12 +192,10 @@ fn check_identifier(cx: &Ctxt, cont: &Container) {
fn check_variant_skip_attrs(cx: &Ctxt, cont: &Container) {
let variants = match &cont.data {
Data::Enum(variants) => variants,
- Data::Struct(_, _) => {
- return;
- }
+ Data::Struct(_, _) => return,
};
- for variant in variants.iter() {
+ for variant in variants {
if variant.attrs.serialize_with().is_some() {
if variant.attrs.skip_serializing() {
cx.error_spanned_by(
diff --git a/vendor/serde_derive/src/lib.rs b/vendor/serde_derive/src/lib.rs
index e632cc9f5..176628ad5 100644
--- a/vendor/serde_derive/src/lib.rs
+++ b/vendor/serde_derive/src/lib.rs
@@ -1,7 +1,7 @@
//! This crate provides Serde's two derive macros.
//!
-//! ```edition2018
-//! # use serde_derive::{Serialize, Deserialize};
+//! ```edition2021
+//! # use serde_derive::{Deserialize, Serialize};
//! #
//! #[derive(Serialize, Deserialize)]
//! # struct S;
@@ -13,7 +13,7 @@
//!
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html
-#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.164")]
+#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.171")]
#![allow(unknown_lints, bare_trait_objects)]
// Ignored clippy lints
#![allow(