diff options
Diffstat (limited to 'vendor/serde_derive/src/internals')
-rw-r--r-- | vendor/serde_derive/src/internals/ast.rs | 216 | ||||
-rw-r--r-- | vendor/serde_derive/src/internals/attr.rs | 1881 | ||||
-rw-r--r-- | vendor/serde_derive/src/internals/case.rs | 200 | ||||
-rw-r--r-- | vendor/serde_derive/src/internals/check.rs | 477 | ||||
-rw-r--r-- | vendor/serde_derive/src/internals/ctxt.rs | 68 | ||||
-rw-r--r-- | vendor/serde_derive/src/internals/mod.rs | 27 | ||||
-rw-r--r-- | vendor/serde_derive/src/internals/receiver.rs | 292 | ||||
-rw-r--r-- | vendor/serde_derive/src/internals/respan.rs | 16 | ||||
-rw-r--r-- | vendor/serde_derive/src/internals/symbol.rs | 71 |
9 files changed, 0 insertions, 3248 deletions
diff --git a/vendor/serde_derive/src/internals/ast.rs b/vendor/serde_derive/src/internals/ast.rs deleted file mode 100644 index a28d3ae..0000000 --- a/vendor/serde_derive/src/internals/ast.rs +++ /dev/null @@ -1,216 +0,0 @@ -//! A Serde ast, parsed from the Syn ast and ready to generate Rust code. - -use crate::internals::{attr, check, Ctxt, Derive}; -use syn::punctuated::Punctuated; -use syn::Token; - -/// A source data structure annotated with `#[derive(Serialize)]` and/or `#[derive(Deserialize)]`, -/// parsed into an internal representation. -pub struct Container<'a> { - /// The struct or enum name (without generics). - pub ident: syn::Ident, - /// Attributes on the structure, parsed for Serde. - pub attrs: attr::Container, - /// The contents of the struct or enum. - pub data: Data<'a>, - /// Any generics on the struct or enum. - pub generics: &'a syn::Generics, - /// Original input. - pub original: &'a syn::DeriveInput, -} - -/// The fields of a struct or enum. -/// -/// Analogous to `syn::Data`. -pub enum Data<'a> { - Enum(Vec<Variant<'a>>), - Struct(Style, Vec<Field<'a>>), -} - -/// A variant of an enum. -pub struct Variant<'a> { - pub ident: syn::Ident, - pub attrs: attr::Variant, - pub style: Style, - pub fields: Vec<Field<'a>>, - pub original: &'a syn::Variant, -} - -/// A field of a struct. -pub struct Field<'a> { - pub member: syn::Member, - pub attrs: attr::Field, - pub ty: &'a syn::Type, - pub original: &'a syn::Field, -} - -#[derive(Copy, Clone)] -pub enum Style { - /// Named fields. - Struct, - /// Many unnamed fields. - Tuple, - /// One unnamed field. - Newtype, - /// No fields. - Unit, -} - -impl<'a> Container<'a> { - /// Convert the raw Syn ast into a parsed container object, collecting errors in `cx`. - pub fn from_ast( - cx: &Ctxt, - item: &'a syn::DeriveInput, - derive: Derive, - ) -> Option<Container<'a>> { - let mut attrs = attr::Container::from_ast(cx, item); - - let mut data = match &item.data { - syn::Data::Enum(data) => Data::Enum(enum_from_ast(cx, &data.variants, attrs.default())), - syn::Data::Struct(data) => { - let (style, fields) = struct_from_ast(cx, &data.fields, None, attrs.default()); - Data::Struct(style, fields) - } - syn::Data::Union(_) => { - cx.error_spanned_by(item, "Serde does not support derive for unions"); - return None; - } - }; - - let mut has_flatten = false; - match &mut data { - Data::Enum(variants) => { - for variant in variants { - variant.attrs.rename_by_rules(attrs.rename_all_rules()); - for field in &mut variant.fields { - if field.attrs.flatten() { - has_flatten = true; - } - field.attrs.rename_by_rules( - variant - .attrs - .rename_all_rules() - .or(attrs.rename_all_fields_rules()), - ); - } - } - } - Data::Struct(_, fields) => { - for field in fields { - if field.attrs.flatten() { - has_flatten = true; - } - field.attrs.rename_by_rules(attrs.rename_all_rules()); - } - } - } - - if has_flatten { - attrs.mark_has_flatten(); - } - - let mut item = Container { - ident: item.ident.clone(), - attrs, - data, - generics: &item.generics, - original: item, - }; - check::check(cx, &mut item, derive); - Some(item) - } -} - -impl<'a> Data<'a> { - pub fn all_fields(&'a self) -> Box<dyn Iterator<Item = &'a Field<'a>> + 'a> { - match self { - Data::Enum(variants) => { - Box::new(variants.iter().flat_map(|variant| variant.fields.iter())) - } - Data::Struct(_, fields) => Box::new(fields.iter()), - } - } - - pub fn has_getter(&self) -> bool { - self.all_fields().any(|f| f.attrs.getter().is_some()) - } -} - -fn enum_from_ast<'a>( - cx: &Ctxt, - variants: &'a Punctuated<syn::Variant, Token![,]>, - container_default: &attr::Default, -) -> Vec<Variant<'a>> { - let variants: Vec<Variant> = variants - .iter() - .map(|variant| { - let attrs = attr::Variant::from_ast(cx, variant); - let (style, fields) = - struct_from_ast(cx, &variant.fields, Some(&attrs), container_default); - Variant { - ident: variant.ident.clone(), - attrs, - style, - fields, - original: variant, - } - }) - .collect(); - - let index_of_last_tagged_variant = variants - .iter() - .rposition(|variant| !variant.attrs.untagged()); - if let Some(index_of_last_tagged_variant) = index_of_last_tagged_variant { - for variant in &variants[..index_of_last_tagged_variant] { - if variant.attrs.untagged() { - cx.error_spanned_by(&variant.ident, "all variants with the #[serde(untagged)] attribute must be placed at the end of the enum"); - } - } - } - - variants -} - -fn struct_from_ast<'a>( - cx: &Ctxt, - fields: &'a syn::Fields, - attrs: Option<&attr::Variant>, - container_default: &attr::Default, -) -> (Style, Vec<Field<'a>>) { - match fields { - syn::Fields::Named(fields) => ( - Style::Struct, - fields_from_ast(cx, &fields.named, attrs, container_default), - ), - syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => ( - Style::Newtype, - fields_from_ast(cx, &fields.unnamed, attrs, container_default), - ), - syn::Fields::Unnamed(fields) => ( - Style::Tuple, - fields_from_ast(cx, &fields.unnamed, attrs, container_default), - ), - syn::Fields::Unit => (Style::Unit, Vec::new()), - } -} - -fn fields_from_ast<'a>( - cx: &Ctxt, - fields: &'a Punctuated<syn::Field, Token![,]>, - attrs: Option<&attr::Variant>, - container_default: &attr::Default, -) -> Vec<Field<'a>> { - fields - .iter() - .enumerate() - .map(|(i, field)| Field { - member: match &field.ident { - Some(ident) => syn::Member::Named(ident.clone()), - None => syn::Member::Unnamed(i.into()), - }, - attrs: attr::Field::from_ast(cx, i, field, attrs, container_default), - ty: &field.ty, - original: field, - }) - .collect() -} diff --git a/vendor/serde_derive/src/internals/attr.rs b/vendor/serde_derive/src/internals/attr.rs deleted file mode 100644 index bb9de32..0000000 --- a/vendor/serde_derive/src/internals/attr.rs +++ /dev/null @@ -1,1881 +0,0 @@ -use crate::internals::symbol::*; -use crate::internals::{ungroup, Ctxt}; -use proc_macro2::{Spacing, Span, TokenStream, TokenTree}; -use quote::ToTokens; -use std::borrow::Cow; -use std::collections::BTreeSet; -use std::iter::FromIterator; -use syn::meta::ParseNestedMeta; -use syn::parse::ParseStream; -use syn::punctuated::Punctuated; -use syn::{parse_quote, token, Ident, Lifetime, Token}; - -// This module handles parsing of `#[serde(...)]` attributes. The entrypoints -// are `attr::Container::from_ast`, `attr::Variant::from_ast`, and -// `attr::Field::from_ast`. Each returns an instance of the corresponding -// struct. Note that none of them return a Result. Unrecognized, malformed, or -// duplicated attributes result in a span_err but otherwise are ignored. The -// user will see errors simultaneously for all bad attributes in the crate -// rather than just the first. - -pub use crate::internals::case::RenameRule; - -struct Attr<'c, T> { - cx: &'c Ctxt, - name: Symbol, - tokens: TokenStream, - value: Option<T>, -} - -impl<'c, T> Attr<'c, T> { - fn none(cx: &'c Ctxt, name: Symbol) -> Self { - Attr { - cx, - name, - tokens: TokenStream::new(), - value: None, - } - } - - fn set<A: ToTokens>(&mut self, obj: A, value: T) { - let tokens = obj.into_token_stream(); - - if self.value.is_some() { - let msg = format!("duplicate serde attribute `{}`", self.name); - self.cx.error_spanned_by(tokens, msg); - } else { - self.tokens = tokens; - self.value = Some(value); - } - } - - fn set_opt<A: ToTokens>(&mut self, obj: A, value: Option<T>) { - if let Some(value) = value { - self.set(obj, value); - } - } - - fn set_if_none(&mut self, value: T) { - if self.value.is_none() { - self.value = Some(value); - } - } - - fn get(self) -> Option<T> { - self.value - } - - fn get_with_tokens(self) -> Option<(TokenStream, T)> { - match self.value { - Some(v) => Some((self.tokens, v)), - None => None, - } - } -} - -struct BoolAttr<'c>(Attr<'c, ()>); - -impl<'c> BoolAttr<'c> { - fn none(cx: &'c Ctxt, name: Symbol) -> Self { - BoolAttr(Attr::none(cx, name)) - } - - fn set_true<A: ToTokens>(&mut self, obj: A) { - self.0.set(obj, ()); - } - - fn get(&self) -> bool { - self.0.value.is_some() - } -} - -struct VecAttr<'c, T> { - cx: &'c Ctxt, - name: Symbol, - first_dup_tokens: TokenStream, - values: Vec<T>, -} - -impl<'c, T> VecAttr<'c, T> { - fn none(cx: &'c Ctxt, name: Symbol) -> Self { - VecAttr { - cx, - name, - first_dup_tokens: TokenStream::new(), - values: Vec::new(), - } - } - - fn insert<A: ToTokens>(&mut self, obj: A, value: T) { - if self.values.len() == 1 { - self.first_dup_tokens = obj.into_token_stream(); - } - self.values.push(value); - } - - fn at_most_one(mut self) -> Option<T> { - if self.values.len() > 1 { - let dup_token = self.first_dup_tokens; - let msg = format!("duplicate serde attribute `{}`", self.name); - self.cx.error_spanned_by(dup_token, msg); - None - } else { - self.values.pop() - } - } - - fn get(self) -> Vec<T> { - self.values - } -} - -pub struct Name { - serialize: String, - serialize_renamed: bool, - deserialize: String, - deserialize_renamed: bool, - deserialize_aliases: BTreeSet<String>, -} - -fn unraw(ident: &Ident) -> String { - ident.to_string().trim_start_matches("r#").to_owned() -} - -impl Name { - fn from_attrs( - source_name: String, - ser_name: Attr<String>, - de_name: Attr<String>, - de_aliases: Option<VecAttr<String>>, - ) -> Name { - let mut alias_set = BTreeSet::new(); - if let Some(de_aliases) = de_aliases { - for alias_name in de_aliases.get() { - alias_set.insert(alias_name); - } - } - - let ser_name = ser_name.get(); - let ser_renamed = ser_name.is_some(); - let de_name = de_name.get(); - let de_renamed = de_name.is_some(); - Name { - serialize: ser_name.unwrap_or_else(|| source_name.clone()), - serialize_renamed: ser_renamed, - deserialize: de_name.unwrap_or(source_name), - deserialize_renamed: de_renamed, - deserialize_aliases: alias_set, - } - } - - /// Return the container name for the container when serializing. - pub fn serialize_name(&self) -> &str { - &self.serialize - } - - /// Return the container name for the container when deserializing. - pub fn deserialize_name(&self) -> &str { - &self.deserialize - } - - fn deserialize_aliases(&self) -> &BTreeSet<String> { - &self.deserialize_aliases - } -} - -#[derive(Copy, Clone)] -pub struct RenameAllRules { - serialize: RenameRule, - deserialize: RenameRule, -} - -impl RenameAllRules { - /// Returns a new `RenameAllRules` with the individual rules of `self` and - /// `other_rules` joined by `RenameRules::or`. - pub fn or(self, other_rules: Self) -> Self { - Self { - serialize: self.serialize.or(other_rules.serialize), - deserialize: self.deserialize.or(other_rules.deserialize), - } - } -} - -/// Represents struct or enum attribute information. -pub struct Container { - name: Name, - transparent: bool, - deny_unknown_fields: bool, - default: Default, - rename_all_rules: RenameAllRules, - rename_all_fields_rules: RenameAllRules, - ser_bound: Option<Vec<syn::WherePredicate>>, - de_bound: Option<Vec<syn::WherePredicate>>, - tag: TagType, - type_from: Option<syn::Type>, - type_try_from: Option<syn::Type>, - type_into: Option<syn::Type>, - remote: Option<syn::Path>, - identifier: Identifier, - has_flatten: bool, - serde_path: Option<syn::Path>, - is_packed: bool, - /// Error message generated when type can't be deserialized - expecting: Option<String>, - non_exhaustive: bool, -} - -/// Styles of representing an enum. -pub enum TagType { - /// The default. - /// - /// ```json - /// {"variant1": {"key1": "value1", "key2": "value2"}} - /// ``` - External, - - /// `#[serde(tag = "type")]` - /// - /// ```json - /// {"type": "variant1", "key1": "value1", "key2": "value2"} - /// ``` - Internal { tag: String }, - - /// `#[serde(tag = "t", content = "c")]` - /// - /// ```json - /// {"t": "variant1", "c": {"key1": "value1", "key2": "value2"}} - /// ``` - Adjacent { tag: String, content: String }, - - /// `#[serde(untagged)]` - /// - /// ```json - /// {"key1": "value1", "key2": "value2"} - /// ``` - None, -} - -/// Whether this enum represents the fields of a struct or the variants of an -/// enum. -#[derive(Copy, Clone)] -pub enum Identifier { - /// It does not. - No, - - /// This enum represents the fields of a struct. All of the variants must be - /// unit variants, except possibly one which is annotated with - /// `#[serde(other)]` and is a newtype variant. - Field, - - /// This enum represents the variants of an enum. All of the variants must - /// be unit variants. - Variant, -} - -impl Identifier { - #[cfg(feature = "deserialize_in_place")] - pub fn is_some(self) -> bool { - match self { - Identifier::No => false, - Identifier::Field | Identifier::Variant => true, - } - } -} - -impl Container { - /// Extract out the `#[serde(...)]` attributes from an item. - pub fn from_ast(cx: &Ctxt, item: &syn::DeriveInput) -> Self { - let mut ser_name = Attr::none(cx, RENAME); - let mut de_name = Attr::none(cx, RENAME); - let mut transparent = BoolAttr::none(cx, TRANSPARENT); - let mut deny_unknown_fields = BoolAttr::none(cx, DENY_UNKNOWN_FIELDS); - let mut default = Attr::none(cx, DEFAULT); - let mut rename_all_ser_rule = Attr::none(cx, RENAME_ALL); - let mut rename_all_de_rule = Attr::none(cx, RENAME_ALL); - let mut rename_all_fields_ser_rule = Attr::none(cx, RENAME_ALL_FIELDS); - let mut rename_all_fields_de_rule = Attr::none(cx, RENAME_ALL_FIELDS); - let mut ser_bound = Attr::none(cx, BOUND); - let mut de_bound = Attr::none(cx, BOUND); - let mut untagged = BoolAttr::none(cx, UNTAGGED); - let mut internal_tag = Attr::none(cx, TAG); - let mut content = Attr::none(cx, CONTENT); - let mut type_from = Attr::none(cx, FROM); - let mut type_try_from = Attr::none(cx, TRY_FROM); - let mut type_into = Attr::none(cx, INTO); - let mut remote = Attr::none(cx, REMOTE); - let mut field_identifier = BoolAttr::none(cx, FIELD_IDENTIFIER); - let mut variant_identifier = BoolAttr::none(cx, VARIANT_IDENTIFIER); - let mut serde_path = Attr::none(cx, CRATE); - let mut expecting = Attr::none(cx, EXPECTING); - let mut non_exhaustive = false; - - for attr in &item.attrs { - if attr.path() != SERDE { - non_exhaustive |= - matches!(&attr.meta, syn::Meta::Path(path) if path == NON_EXHAUSTIVE); - continue; - } - - if let syn::Meta::List(meta) = &attr.meta { - if meta.tokens.is_empty() { - continue; - } - } - - if let Err(err) = attr.parse_nested_meta(|meta| { - if meta.path == RENAME { - // #[serde(rename = "foo")] - // #[serde(rename(serialize = "foo", deserialize = "bar"))] - let (ser, de) = get_renames(cx, RENAME, &meta)?; - ser_name.set_opt(&meta.path, ser.as_ref().map(syn::LitStr::value)); - de_name.set_opt(&meta.path, de.as_ref().map(syn::LitStr::value)); - } else if meta.path == RENAME_ALL { - // #[serde(rename_all = "foo")] - // #[serde(rename_all(serialize = "foo", deserialize = "bar"))] - let one_name = meta.input.peek(Token![=]); - let (ser, de) = get_renames(cx, RENAME_ALL, &meta)?; - if let Some(ser) = ser { - match RenameRule::from_str(&ser.value()) { - Ok(rename_rule) => rename_all_ser_rule.set(&meta.path, rename_rule), - Err(err) => cx.error_spanned_by(ser, err), - } - } - if let Some(de) = de { - match RenameRule::from_str(&de.value()) { - Ok(rename_rule) => rename_all_de_rule.set(&meta.path, rename_rule), - Err(err) => { - if !one_name { - cx.error_spanned_by(de, err); - } - } - } - } - } else if meta.path == RENAME_ALL_FIELDS { - // #[serde(rename_all_fields = "foo")] - // #[serde(rename_all_fields(serialize = "foo", deserialize = "bar"))] - let one_name = meta.input.peek(Token![=]); - let (ser, de) = get_renames(cx, RENAME_ALL_FIELDS, &meta)?; - - match item.data { - syn::Data::Enum(_) => { - if let Some(ser) = ser { - match RenameRule::from_str(&ser.value()) { - Ok(rename_rule) => { - rename_all_fields_ser_rule.set(&meta.path, rename_rule); - } - Err(err) => cx.error_spanned_by(ser, err), - } - } - if let Some(de) = de { - match RenameRule::from_str(&de.value()) { - Ok(rename_rule) => { - rename_all_fields_de_rule.set(&meta.path, rename_rule); - } - Err(err) => { - if !one_name { - cx.error_spanned_by(de, err); - } - } - } - } - } - syn::Data::Struct(_) => { - let msg = "#[serde(rename_all_fields)] can only be used on enums"; - cx.syn_error(meta.error(msg)); - } - syn::Data::Union(_) => { - let msg = "#[serde(rename_all_fields)] can only be used on enums"; - cx.syn_error(meta.error(msg)); - } - } - } else if meta.path == TRANSPARENT { - // #[serde(transparent)] - transparent.set_true(meta.path); - } else if meta.path == DENY_UNKNOWN_FIELDS { - // #[serde(deny_unknown_fields)] - deny_unknown_fields.set_true(meta.path); - } else if meta.path == DEFAULT { - if meta.input.peek(Token![=]) { - // #[serde(default = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, DEFAULT, &meta)? { - match &item.data { - syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields { - syn::Fields::Named(_) | syn::Fields::Unnamed(_) => { - default.set(&meta.path, Default::Path(path)); - } - syn::Fields::Unit => { - let msg = "#[serde(default = \"...\")] can only be used on structs that have fields"; - cx.syn_error(meta.error(msg)); - } - }, - syn::Data::Enum(_) => { - let msg = "#[serde(default = \"...\")] can only be used on structs"; - cx.syn_error(meta.error(msg)); - } - syn::Data::Union(_) => { - let msg = "#[serde(default = \"...\")] can only be used on structs"; - cx.syn_error(meta.error(msg)); - } - } - } - } else { - // #[serde(default)] - match &item.data { - syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields { - syn::Fields::Named(_) | syn::Fields::Unnamed(_) => { - default.set(meta.path, Default::Default); - } - syn::Fields::Unit => { - let msg = "#[serde(default)] can only be used on structs that have fields"; - cx.error_spanned_by(fields, msg); - } - }, - syn::Data::Enum(_) => { - let msg = "#[serde(default)] can only be used on structs"; - cx.syn_error(meta.error(msg)); - } - syn::Data::Union(_) => { - let msg = "#[serde(default)] can only be used on structs"; - cx.syn_error(meta.error(msg)); - } - } - } - } else if meta.path == BOUND { - // #[serde(bound = "T: SomeBound")] - // #[serde(bound(serialize = "...", deserialize = "..."))] - let (ser, de) = get_where_predicates(cx, &meta)?; - ser_bound.set_opt(&meta.path, ser); - de_bound.set_opt(&meta.path, de); - } else if meta.path == UNTAGGED { - // #[serde(untagged)] - match item.data { - syn::Data::Enum(_) => { - untagged.set_true(&meta.path); - } - syn::Data::Struct(_) => { - let msg = "#[serde(untagged)] can only be used on enums"; - cx.syn_error(meta.error(msg)); - } - syn::Data::Union(_) => { - let msg = "#[serde(untagged)] can only be used on enums"; - cx.syn_error(meta.error(msg)); - } - } - } else if meta.path == TAG { - // #[serde(tag = "type")] - if let Some(s) = get_lit_str(cx, TAG, &meta)? { - match &item.data { - syn::Data::Enum(_) => { - internal_tag.set(&meta.path, s.value()); - } - syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields { - syn::Fields::Named(_) => { - internal_tag.set(&meta.path, s.value()); - } - syn::Fields::Unnamed(_) | syn::Fields::Unit => { - let msg = "#[serde(tag = \"...\")] can only be used on enums and structs with named fields"; - cx.syn_error(meta.error(msg)); - } - }, - syn::Data::Union(_) => { - let msg = "#[serde(tag = \"...\")] can only be used on enums and structs with named fields"; - cx.syn_error(meta.error(msg)); - } - } - } - } else if meta.path == CONTENT { - // #[serde(content = "c")] - if let Some(s) = get_lit_str(cx, CONTENT, &meta)? { - match &item.data { - syn::Data::Enum(_) => { - content.set(&meta.path, s.value()); - } - syn::Data::Struct(_) => { - let msg = "#[serde(content = \"...\")] can only be used on enums"; - cx.syn_error(meta.error(msg)); - } - syn::Data::Union(_) => { - let msg = "#[serde(content = \"...\")] can only be used on enums"; - cx.syn_error(meta.error(msg)); - } - } - } - } else if meta.path == FROM { - // #[serde(from = "Type")] - if let Some(from_ty) = parse_lit_into_ty(cx, FROM, &meta)? { - type_from.set_opt(&meta.path, Some(from_ty)); - } - } else if meta.path == TRY_FROM { - // #[serde(try_from = "Type")] - if let Some(try_from_ty) = parse_lit_into_ty(cx, TRY_FROM, &meta)? { - type_try_from.set_opt(&meta.path, Some(try_from_ty)); - } - } else if meta.path == INTO { - // #[serde(into = "Type")] - if let Some(into_ty) = parse_lit_into_ty(cx, INTO, &meta)? { - type_into.set_opt(&meta.path, Some(into_ty)); - } - } else if meta.path == REMOTE { - // #[serde(remote = "...")] - if let Some(path) = parse_lit_into_path(cx, REMOTE, &meta)? { - if is_primitive_path(&path, "Self") { - remote.set(&meta.path, item.ident.clone().into()); - } else { - remote.set(&meta.path, path); - } - } - } else if meta.path == FIELD_IDENTIFIER { - // #[serde(field_identifier)] - field_identifier.set_true(&meta.path); - } else if meta.path == VARIANT_IDENTIFIER { - // #[serde(variant_identifier)] - variant_identifier.set_true(&meta.path); - } else if meta.path == CRATE { - // #[serde(crate = "foo")] - if let Some(path) = parse_lit_into_path(cx, CRATE, &meta)? { - serde_path.set(&meta.path, path); - } - } else if meta.path == EXPECTING { - // #[serde(expecting = "a message")] - if let Some(s) = get_lit_str(cx, EXPECTING, &meta)? { - expecting.set(&meta.path, s.value()); - } - } else { - let path = meta.path.to_token_stream().to_string().replace(' ', ""); - return Err( - meta.error(format_args!("unknown serde container attribute `{}`", path)) - ); - } - Ok(()) - }) { - cx.syn_error(err); - } - } - - let mut is_packed = false; - for attr in &item.attrs { - if attr.path() == REPR { - let _ = attr.parse_args_with(|input: ParseStream| { - while let Some(token) = input.parse()? { - if let TokenTree::Ident(ident) = token { - is_packed |= ident == "packed"; - } - } - Ok(()) - }); - } - } - - Container { - name: Name::from_attrs(unraw(&item.ident), ser_name, de_name, None), - transparent: transparent.get(), - deny_unknown_fields: deny_unknown_fields.get(), - default: default.get().unwrap_or(Default::None), - rename_all_rules: RenameAllRules { - serialize: rename_all_ser_rule.get().unwrap_or(RenameRule::None), - deserialize: rename_all_de_rule.get().unwrap_or(RenameRule::None), - }, - rename_all_fields_rules: RenameAllRules { - serialize: rename_all_fields_ser_rule.get().unwrap_or(RenameRule::None), - deserialize: rename_all_fields_de_rule.get().unwrap_or(RenameRule::None), - }, - ser_bound: ser_bound.get(), - de_bound: de_bound.get(), - tag: decide_tag(cx, item, untagged, internal_tag, content), - type_from: type_from.get(), - type_try_from: type_try_from.get(), - type_into: type_into.get(), - remote: remote.get(), - identifier: decide_identifier(cx, item, field_identifier, variant_identifier), - has_flatten: false, - serde_path: serde_path.get(), - is_packed, - expecting: expecting.get(), - non_exhaustive, - } - } - - pub fn name(&self) -> &Name { - &self.name - } - - pub fn rename_all_rules(&self) -> RenameAllRules { - self.rename_all_rules - } - - pub fn rename_all_fields_rules(&self) -> RenameAllRules { - self.rename_all_fields_rules - } - - pub fn transparent(&self) -> bool { - self.transparent - } - - pub fn deny_unknown_fields(&self) -> bool { - self.deny_unknown_fields - } - - pub fn default(&self) -> &Default { - &self.default - } - - pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> { - self.ser_bound.as_ref().map(|vec| &vec[..]) - } - - pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> { - self.de_bound.as_ref().map(|vec| &vec[..]) - } - - pub fn tag(&self) -> &TagType { - &self.tag - } - - pub fn type_from(&self) -> Option<&syn::Type> { - self.type_from.as_ref() - } - - pub fn type_try_from(&self) -> Option<&syn::Type> { - self.type_try_from.as_ref() - } - - pub fn type_into(&self) -> Option<&syn::Type> { - self.type_into.as_ref() - } - - pub fn remote(&self) -> Option<&syn::Path> { - self.remote.as_ref() - } - - pub fn is_packed(&self) -> bool { - self.is_packed - } - - pub fn identifier(&self) -> Identifier { - self.identifier - } - - pub fn has_flatten(&self) -> bool { - self.has_flatten - } - - pub fn mark_has_flatten(&mut self) { - self.has_flatten = true; - } - - pub fn custom_serde_path(&self) -> Option<&syn::Path> { - self.serde_path.as_ref() - } - - pub fn serde_path(&self) -> Cow<syn::Path> { - self.custom_serde_path() - .map_or_else(|| Cow::Owned(parse_quote!(_serde)), Cow::Borrowed) - } - - /// Error message generated when type can't be deserialized. - /// If `None`, default message will be used - pub fn expecting(&self) -> Option<&str> { - self.expecting.as_ref().map(String::as_ref) - } - - pub fn non_exhaustive(&self) -> bool { - self.non_exhaustive - } -} - -fn decide_tag( - cx: &Ctxt, - item: &syn::DeriveInput, - untagged: BoolAttr, - internal_tag: Attr<String>, - content: Attr<String>, -) -> TagType { - match ( - untagged.0.get_with_tokens(), - internal_tag.get_with_tokens(), - content.get_with_tokens(), - ) { - (None, None, None) => TagType::External, - (Some(_), None, None) => TagType::None, - (None, Some((_, tag)), None) => { - // Check that there are no tuple variants. - if let syn::Data::Enum(data) = &item.data { - for variant in &data.variants { - match &variant.fields { - syn::Fields::Named(_) | syn::Fields::Unit => {} - syn::Fields::Unnamed(fields) => { - if fields.unnamed.len() != 1 { - let msg = - "#[serde(tag = \"...\")] cannot be used with tuple variants"; - cx.error_spanned_by(variant, msg); - break; - } - } - } - } - } - TagType::Internal { tag } - } - (Some((untagged_tokens, ())), Some((tag_tokens, _)), None) => { - let msg = "enum cannot be both untagged and internally tagged"; - cx.error_spanned_by(untagged_tokens, msg); - cx.error_spanned_by(tag_tokens, msg); - TagType::External // doesn't matter, will error - } - (None, None, Some((content_tokens, _))) => { - let msg = "#[serde(tag = \"...\", content = \"...\")] must be used together"; - cx.error_spanned_by(content_tokens, msg); - TagType::External - } - (Some((untagged_tokens, ())), None, Some((content_tokens, _))) => { - let msg = "untagged enum cannot have #[serde(content = \"...\")]"; - cx.error_spanned_by(untagged_tokens, msg); - cx.error_spanned_by(content_tokens, msg); - TagType::External - } - (None, Some((_, tag)), Some((_, content))) => TagType::Adjacent { tag, content }, - (Some((untagged_tokens, ())), Some((tag_tokens, _)), Some((content_tokens, _))) => { - let msg = "untagged enum cannot have #[serde(tag = \"...\", content = \"...\")]"; - cx.error_spanned_by(untagged_tokens, msg); - cx.error_spanned_by(tag_tokens, msg); - cx.error_spanned_by(content_tokens, msg); - TagType::External - } - } -} - -fn decide_identifier( - cx: &Ctxt, - item: &syn::DeriveInput, - field_identifier: BoolAttr, - variant_identifier: BoolAttr, -) -> Identifier { - match ( - &item.data, - field_identifier.0.get_with_tokens(), - variant_identifier.0.get_with_tokens(), - ) { - (_, None, None) => Identifier::No, - (_, Some((field_identifier_tokens, ())), Some((variant_identifier_tokens, ()))) => { - let msg = - "#[serde(field_identifier)] and #[serde(variant_identifier)] cannot both be set"; - cx.error_spanned_by(field_identifier_tokens, msg); - cx.error_spanned_by(variant_identifier_tokens, msg); - Identifier::No - } - (syn::Data::Enum(_), Some(_), None) => Identifier::Field, - (syn::Data::Enum(_), None, Some(_)) => Identifier::Variant, - (syn::Data::Struct(syn::DataStruct { struct_token, .. }), Some(_), None) => { - let msg = "#[serde(field_identifier)] can only be used on an enum"; - cx.error_spanned_by(struct_token, msg); - Identifier::No - } - (syn::Data::Union(syn::DataUnion { union_token, .. }), Some(_), None) => { - let msg = "#[serde(field_identifier)] can only be used on an enum"; - cx.error_spanned_by(union_token, msg); - Identifier::No - } - (syn::Data::Struct(syn::DataStruct { struct_token, .. }), None, Some(_)) => { - let msg = "#[serde(variant_identifier)] can only be used on an enum"; - cx.error_spanned_by(struct_token, msg); - Identifier::No - } - (syn::Data::Union(syn::DataUnion { union_token, .. }), None, Some(_)) => { - let msg = "#[serde(variant_identifier)] can only be used on an enum"; - cx.error_spanned_by(union_token, msg); - Identifier::No - } - } -} - -/// Represents variant attribute information -pub struct Variant { - name: Name, - rename_all_rules: RenameAllRules, - ser_bound: Option<Vec<syn::WherePredicate>>, - de_bound: Option<Vec<syn::WherePredicate>>, - skip_deserializing: bool, - skip_serializing: bool, - other: bool, - serialize_with: Option<syn::ExprPath>, - deserialize_with: Option<syn::ExprPath>, - borrow: Option<BorrowAttribute>, - untagged: bool, -} - -struct BorrowAttribute { - path: syn::Path, - lifetimes: Option<BTreeSet<syn::Lifetime>>, -} - -impl Variant { - pub fn from_ast(cx: &Ctxt, variant: &syn::Variant) -> Self { - let mut ser_name = Attr::none(cx, RENAME); - let mut de_name = Attr::none(cx, RENAME); - let mut de_aliases = VecAttr::none(cx, RENAME); - let mut skip_deserializing = BoolAttr::none(cx, SKIP_DESERIALIZING); - let mut skip_serializing = BoolAttr::none(cx, SKIP_SERIALIZING); - let mut rename_all_ser_rule = Attr::none(cx, RENAME_ALL); - let mut rename_all_de_rule = Attr::none(cx, RENAME_ALL); - let mut ser_bound = Attr::none(cx, BOUND); - let mut de_bound = Attr::none(cx, BOUND); - let mut other = BoolAttr::none(cx, OTHER); - let mut serialize_with = Attr::none(cx, SERIALIZE_WITH); - let mut deserialize_with = Attr::none(cx, DESERIALIZE_WITH); - let mut borrow = Attr::none(cx, BORROW); - let mut untagged = BoolAttr::none(cx, UNTAGGED); - - for attr in &variant.attrs { - if attr.path() != SERDE { - continue; - } - - if let syn::Meta::List(meta) = &attr.meta { - if meta.tokens.is_empty() { - continue; - } - } - - if let Err(err) = attr.parse_nested_meta(|meta| { - if meta.path == RENAME { - // #[serde(rename = "foo")] - // #[serde(rename(serialize = "foo", deserialize = "bar"))] - let (ser, de) = get_multiple_renames(cx, &meta)?; - ser_name.set_opt(&meta.path, ser.as_ref().map(syn::LitStr::value)); - for de_value in de { - de_name.set_if_none(de_value.value()); - de_aliases.insert(&meta.path, de_value.value()); - } - } else if meta.path == ALIAS { - // #[serde(alias = "foo")] - if let Some(s) = get_lit_str(cx, ALIAS, &meta)? { - de_aliases.insert(&meta.path, s.value()); - } - } else if meta.path == RENAME_ALL { - // #[serde(rename_all = "foo")] - // #[serde(rename_all(serialize = "foo", deserialize = "bar"))] - let one_name = meta.input.peek(Token![=]); - let (ser, de) = get_renames(cx, RENAME_ALL, &meta)?; - if let Some(ser) = ser { - match RenameRule::from_str(&ser.value()) { - Ok(rename_rule) => rename_all_ser_rule.set(&meta.path, rename_rule), - Err(err) => cx.error_spanned_by(ser, err), - } - } - if let Some(de) = de { - match RenameRule::from_str(&de.value()) { - Ok(rename_rule) => rename_all_de_rule.set(&meta.path, rename_rule), - Err(err) => { - if !one_name { - cx.error_spanned_by(de, err); - } - } - } - } - } else if meta.path == SKIP { - // #[serde(skip)] - skip_serializing.set_true(&meta.path); - skip_deserializing.set_true(&meta.path); - } else if meta.path == SKIP_DESERIALIZING { - // #[serde(skip_deserializing)] - skip_deserializing.set_true(&meta.path); - } else if meta.path == SKIP_SERIALIZING { - // #[serde(skip_serializing)] - skip_serializing.set_true(&meta.path); - } else if meta.path == OTHER { - // #[serde(other)] - other.set_true(&meta.path); - } else if meta.path == BOUND { - // #[serde(bound = "T: SomeBound")] - // #[serde(bound(serialize = "...", deserialize = "..."))] - let (ser, de) = get_where_predicates(cx, &meta)?; - ser_bound.set_opt(&meta.path, ser); - de_bound.set_opt(&meta.path, de); - } else if meta.path == WITH { - // #[serde(with = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, WITH, &meta)? { - let mut ser_path = path.clone(); - ser_path - .path - .segments - .push(Ident::new("serialize", Span::call_site()).into()); - serialize_with.set(&meta.path, ser_path); - let mut de_path = path; - de_path - .path - .segments - .push(Ident::new("deserialize", Span::call_site()).into()); - deserialize_with.set(&meta.path, de_path); - } - } else if meta.path == SERIALIZE_WITH { - // #[serde(serialize_with = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, SERIALIZE_WITH, &meta)? { - serialize_with.set(&meta.path, path); - } - } else if meta.path == DESERIALIZE_WITH { - // #[serde(deserialize_with = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, DESERIALIZE_WITH, &meta)? { - deserialize_with.set(&meta.path, path); - } - } else if meta.path == BORROW { - let borrow_attribute = if meta.input.peek(Token![=]) { - // #[serde(borrow = "'a + 'b")] - let lifetimes = parse_lit_into_lifetimes(cx, &meta)?; - BorrowAttribute { - path: meta.path.clone(), - lifetimes: Some(lifetimes), - } - } else { - // #[serde(borrow)] - BorrowAttribute { - path: meta.path.clone(), - lifetimes: None, - } - }; - match &variant.fields { - syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => { - borrow.set(&meta.path, borrow_attribute); - } - _ => { - let msg = "#[serde(borrow)] may only be used on newtype variants"; - cx.error_spanned_by(variant, msg); - } - } - } else if meta.path == UNTAGGED { - untagged.set_true(&meta.path); - } else { - let path = meta.path.to_token_stream().to_string().replace(' ', ""); - return Err( - meta.error(format_args!("unknown serde variant attribute `{}`", path)) - ); - } - Ok(()) - }) { - cx.syn_error(err); - } - } - - Variant { - name: Name::from_attrs(unraw(&variant.ident), ser_name, de_name, Some(de_aliases)), - rename_all_rules: RenameAllRules { - serialize: rename_all_ser_rule.get().unwrap_or(RenameRule::None), - deserialize: rename_all_de_rule.get().unwrap_or(RenameRule::None), - }, - ser_bound: ser_bound.get(), - de_bound: de_bound.get(), - skip_deserializing: skip_deserializing.get(), - skip_serializing: skip_serializing.get(), - other: other.get(), - serialize_with: serialize_with.get(), - deserialize_with: deserialize_with.get(), - borrow: borrow.get(), - untagged: untagged.get(), - } - } - - pub fn name(&self) -> &Name { - &self.name - } - - pub fn aliases(&self) -> &BTreeSet<String> { - self.name.deserialize_aliases() - } - - pub fn rename_by_rules(&mut self, rules: RenameAllRules) { - if !self.name.serialize_renamed { - self.name.serialize = rules.serialize.apply_to_variant(&self.name.serialize); - } - if !self.name.deserialize_renamed { - self.name.deserialize = rules.deserialize.apply_to_variant(&self.name.deserialize); - } - self.name - .deserialize_aliases - .insert(self.name.deserialize.clone()); - } - - pub fn rename_all_rules(&self) -> RenameAllRules { - self.rename_all_rules - } - - pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> { - self.ser_bound.as_ref().map(|vec| &vec[..]) - } - - pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> { - self.de_bound.as_ref().map(|vec| &vec[..]) - } - - pub fn skip_deserializing(&self) -> bool { - self.skip_deserializing - } - - pub fn skip_serializing(&self) -> bool { - self.skip_serializing - } - - pub fn other(&self) -> bool { - self.other - } - - pub fn serialize_with(&self) -> Option<&syn::ExprPath> { - self.serialize_with.as_ref() - } - - pub fn deserialize_with(&self) -> Option<&syn::ExprPath> { - self.deserialize_with.as_ref() - } - - pub fn untagged(&self) -> bool { - self.untagged - } -} - -/// Represents field attribute information -pub struct Field { - name: Name, - skip_serializing: bool, - skip_deserializing: bool, - skip_serializing_if: Option<syn::ExprPath>, - default: Default, - serialize_with: Option<syn::ExprPath>, - deserialize_with: Option<syn::ExprPath>, - ser_bound: Option<Vec<syn::WherePredicate>>, - de_bound: Option<Vec<syn::WherePredicate>>, - borrowed_lifetimes: BTreeSet<syn::Lifetime>, - getter: Option<syn::ExprPath>, - flatten: bool, - transparent: bool, -} - -/// Represents the default to use for a field when deserializing. -pub enum Default { - /// Field must always be specified because it does not have a default. - None, - /// The default is given by `std::default::Default::default()`. - Default, - /// The default is given by this function. - Path(syn::ExprPath), -} - -impl Default { - pub fn is_none(&self) -> bool { - match self { - Default::None => true, - Default::Default | Default::Path(_) => false, - } - } -} - -impl Field { - /// Extract out the `#[serde(...)]` attributes from a struct field. - pub fn from_ast( - cx: &Ctxt, - index: usize, - field: &syn::Field, - attrs: Option<&Variant>, - container_default: &Default, - ) -> Self { - let mut ser_name = Attr::none(cx, RENAME); - let mut de_name = Attr::none(cx, RENAME); - let mut de_aliases = VecAttr::none(cx, RENAME); - let mut skip_serializing = BoolAttr::none(cx, SKIP_SERIALIZING); - let mut skip_deserializing = BoolAttr::none(cx, SKIP_DESERIALIZING); - let mut skip_serializing_if = Attr::none(cx, SKIP_SERIALIZING_IF); - let mut default = Attr::none(cx, DEFAULT); - let mut serialize_with = Attr::none(cx, SERIALIZE_WITH); - let mut deserialize_with = Attr::none(cx, DESERIALIZE_WITH); - let mut ser_bound = Attr::none(cx, BOUND); - let mut de_bound = Attr::none(cx, BOUND); - let mut borrowed_lifetimes = Attr::none(cx, BORROW); - let mut getter = Attr::none(cx, GETTER); - let mut flatten = BoolAttr::none(cx, FLATTEN); - - let ident = match &field.ident { - Some(ident) => unraw(ident), - None => index.to_string(), - }; - - if let Some(borrow_attribute) = attrs.and_then(|variant| variant.borrow.as_ref()) { - if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) { - if let Some(lifetimes) = &borrow_attribute.lifetimes { - for lifetime in lifetimes { - if !borrowable.contains(lifetime) { - let msg = - format!("field `{}` does not have lifetime {}", ident, lifetime); - cx.error_spanned_by(field, msg); - } - } - borrowed_lifetimes.set(&borrow_attribute.path, lifetimes.clone()); - } else { - borrowed_lifetimes.set(&borrow_attribute.path, borrowable); - } - } - } - - for attr in &field.attrs { - if attr.path() != SERDE { - continue; - } - - if let syn::Meta::List(meta) = &attr.meta { - if meta.tokens.is_empty() { - continue; - } - } - - if let Err(err) = attr.parse_nested_meta(|meta| { - if meta.path == RENAME { - // #[serde(rename = "foo")] - // #[serde(rename(serialize = "foo", deserialize = "bar"))] - let (ser, de) = get_multiple_renames(cx, &meta)?; - ser_name.set_opt(&meta.path, ser.as_ref().map(syn::LitStr::value)); - for de_value in de { - de_name.set_if_none(de_value.value()); - de_aliases.insert(&meta.path, de_value.value()); - } - } else if meta.path == ALIAS { - // #[serde(alias = "foo")] - if let Some(s) = get_lit_str(cx, ALIAS, &meta)? { - de_aliases.insert(&meta.path, s.value()); - } - } else if meta.path == DEFAULT { - if meta.input.peek(Token![=]) { - // #[serde(default = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, DEFAULT, &meta)? { - default.set(&meta.path, Default::Path(path)); - } - } else { - // #[serde(default)] - default.set(&meta.path, Default::Default); - } - } else if meta.path == SKIP_SERIALIZING { - // #[serde(skip_serializing)] - skip_serializing.set_true(&meta.path); - } else if meta.path == SKIP_DESERIALIZING { - // #[serde(skip_deserializing)] - skip_deserializing.set_true(&meta.path); - } else if meta.path == SKIP { - // #[serde(skip)] - skip_serializing.set_true(&meta.path); - skip_deserializing.set_true(&meta.path); - } else if meta.path == SKIP_SERIALIZING_IF { - // #[serde(skip_serializing_if = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, SKIP_SERIALIZING_IF, &meta)? { - skip_serializing_if.set(&meta.path, path); - } - } else if meta.path == SERIALIZE_WITH { - // #[serde(serialize_with = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, SERIALIZE_WITH, &meta)? { - serialize_with.set(&meta.path, path); - } - } else if meta.path == DESERIALIZE_WITH { - // #[serde(deserialize_with = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, DESERIALIZE_WITH, &meta)? { - deserialize_with.set(&meta.path, path); - } - } else if meta.path == WITH { - // #[serde(with = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, WITH, &meta)? { - let mut ser_path = path.clone(); - ser_path - .path - .segments - .push(Ident::new("serialize", Span::call_site()).into()); - serialize_with.set(&meta.path, ser_path); - let mut de_path = path; - de_path - .path - .segments - .push(Ident::new("deserialize", Span::call_site()).into()); - deserialize_with.set(&meta.path, de_path); - } - } else if meta.path == BOUND { - // #[serde(bound = "T: SomeBound")] - // #[serde(bound(serialize = "...", deserialize = "..."))] - let (ser, de) = get_where_predicates(cx, &meta)?; - ser_bound.set_opt(&meta.path, ser); - de_bound.set_opt(&meta.path, de); - } else if meta.path == BORROW { - if meta.input.peek(Token![=]) { - // #[serde(borrow = "'a + 'b")] - let lifetimes = parse_lit_into_lifetimes(cx, &meta)?; - if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) { - for lifetime in &lifetimes { - if !borrowable.contains(lifetime) { - let msg = format!( - "field `{}` does not have lifetime {}", - ident, lifetime, - ); - cx.error_spanned_by(field, msg); - } - } - borrowed_lifetimes.set(&meta.path, lifetimes); - } - } else { - // #[serde(borrow)] - if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) { - borrowed_lifetimes.set(&meta.path, borrowable); - } - } - } else if meta.path == GETTER { - // #[serde(getter = "...")] - if let Some(path) = parse_lit_into_expr_path(cx, GETTER, &meta)? { - getter.set(&meta.path, path); - } - } else if meta.path == FLATTEN { - // #[serde(flatten)] - flatten.set_true(&meta.path); - } else { - let path = meta.path.to_token_stream().to_string().replace(' ', ""); - return Err( - meta.error(format_args!("unknown serde field attribute `{}`", path)) - ); - } - Ok(()) - }) { - cx.syn_error(err); - } - } - - // Is skip_deserializing, initialize the field to Default::default() unless a - // different default is specified by `#[serde(default = "...")]` on - // ourselves or our container (e.g. the struct we are in). - if let Default::None = *container_default { - if skip_deserializing.0.value.is_some() { - default.set_if_none(Default::Default); - } - } - - let mut borrowed_lifetimes = borrowed_lifetimes.get().unwrap_or_default(); - if !borrowed_lifetimes.is_empty() { - // Cow<str> and Cow<[u8]> never borrow by default: - // - // impl<'de, 'a, T: ?Sized> Deserialize<'de> for Cow<'a, T> - // - // A #[serde(borrow)] attribute enables borrowing that corresponds - // roughly to these impls: - // - // impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, str> - // impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, [u8]> - if is_cow(&field.ty, is_str) { - let mut path = syn::Path { - leading_colon: None, - segments: Punctuated::new(), - }; - let span = Span::call_site(); - path.segments.push(Ident::new("_serde", span).into()); - path.segments.push(Ident::new("__private", span).into()); - path.segments.push(Ident::new("de", span).into()); - path.segments - .push(Ident::new("borrow_cow_str", span).into()); - let expr = syn::ExprPath { - attrs: Vec::new(), - qself: None, - path, - }; - deserialize_with.set_if_none(expr); - } else if is_cow(&field.ty, is_slice_u8) { - let mut path = syn::Path { - leading_colon: None, - segments: Punctuated::new(), - }; - let span = Span::call_site(); - path.segments.push(Ident::new("_serde", span).into()); - path.segments.push(Ident::new("__private", span).into()); - path.segments.push(Ident::new("de", span).into()); - path.segments - .push(Ident::new("borrow_cow_bytes", span).into()); - let expr = syn::ExprPath { - attrs: Vec::new(), - qself: None, - path, - }; - deserialize_with.set_if_none(expr); - } - } else if is_implicitly_borrowed(&field.ty) { - // Types &str and &[u8] are always implicitly borrowed. No need for - // a #[serde(borrow)]. - collect_lifetimes(&field.ty, &mut borrowed_lifetimes); - } - - Field { - name: Name::from_attrs(ident, ser_name, de_name, Some(de_aliases)), - skip_serializing: skip_serializing.get(), - skip_deserializing: skip_deserializing.get(), - skip_serializing_if: skip_serializing_if.get(), - default: default.get().unwrap_or(Default::None), - serialize_with: serialize_with.get(), - deserialize_with: deserialize_with.get(), - ser_bound: ser_bound.get(), - de_bound: de_bound.get(), - borrowed_lifetimes, - getter: getter.get(), - flatten: flatten.get(), - transparent: false, - } - } - - pub fn name(&self) -> &Name { - &self.name - } - - pub fn aliases(&self) -> &BTreeSet<String> { - self.name.deserialize_aliases() - } - - pub fn rename_by_rules(&mut self, rules: RenameAllRules) { - if !self.name.serialize_renamed { - self.name.serialize = rules.serialize.apply_to_field(&self.name.serialize); - } - if !self.name.deserialize_renamed { - self.name.deserialize = rules.deserialize.apply_to_field(&self.name.deserialize); - } - self.name - .deserialize_aliases - .insert(self.name.deserialize.clone()); - } - - pub fn skip_serializing(&self) -> bool { - self.skip_serializing - } - - pub fn skip_deserializing(&self) -> bool { - self.skip_deserializing - } - - pub fn skip_serializing_if(&self) -> Option<&syn::ExprPath> { - self.skip_serializing_if.as_ref() - } - - pub fn default(&self) -> &Default { - &self.default - } - - pub fn serialize_with(&self) -> Option<&syn::ExprPath> { - self.serialize_with.as_ref() - } - - pub fn deserialize_with(&self) -> Option<&syn::ExprPath> { - self.deserialize_with.as_ref() - } - - pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> { - self.ser_bound.as_ref().map(|vec| &vec[..]) - } - - pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> { - self.de_bound.as_ref().map(|vec| &vec[..]) - } - - pub fn borrowed_lifetimes(&self) -> &BTreeSet<syn::Lifetime> { - &self.borrowed_lifetimes - } - - pub fn getter(&self) -> Option<&syn::ExprPath> { - self.getter.as_ref() - } - - pub fn flatten(&self) -> bool { - self.flatten - } - - pub fn transparent(&self) -> bool { - self.transparent - } - - pub fn mark_transparent(&mut self) { - self.transparent = true; - } -} - -type SerAndDe<T> = (Option<T>, Option<T>); - -fn get_ser_and_de<'c, T, F, R>( - cx: &'c Ctxt, - attr_name: Symbol, - meta: &ParseNestedMeta, - f: F, -) -> syn::Result<(VecAttr<'c, T>, VecAttr<'c, T>)> -where - T: Clone, - F: Fn(&Ctxt, Symbol, Symbol, &ParseNestedMeta) -> syn::Result<R>, - R: Into<Option<T>>, -{ - let mut ser_meta = VecAttr::none(cx, attr_name); - let mut de_meta = VecAttr::none(cx, attr_name); - - let lookahead = meta.input.lookahead1(); - if lookahead.peek(Token![=]) { - if let Some(both) = f(cx, attr_name, attr_name, meta)?.into() { - ser_meta.insert(&meta.path, both.clone()); - de_meta.insert(&meta.path, both); - } - } else if lookahead.peek(token::Paren) { - meta.parse_nested_meta(|meta| { - if meta.path == SERIALIZE { - if let Some(v) = f(cx, attr_name, SERIALIZE, &meta)?.into() { - ser_meta.insert(&meta.path, v); - } - } else if meta.path == DESERIALIZE { - if let Some(v) = f(cx, attr_name, DESERIALIZE, &meta)?.into() { - de_meta.insert(&meta.path, v); - } - } else { - return Err(meta.error(format_args!( - "malformed {0} attribute, expected `{0}(serialize = ..., deserialize = ...)`", - attr_name, - ))); - } - Ok(()) - })?; - } else { - return Err(lookahead.error()); - } - - Ok((ser_meta, de_meta)) -} - -fn get_renames( - cx: &Ctxt, - attr_name: Symbol, - meta: &ParseNestedMeta, -) -> syn::Result<SerAndDe<syn::LitStr>> { - let (ser, de) = get_ser_and_de(cx, attr_name, meta, get_lit_str2)?; - Ok((ser.at_most_one(), de.at_most_one())) -} - -fn get_multiple_renames( - cx: &Ctxt, - meta: &ParseNestedMeta, -) -> syn::Result<(Option<syn::LitStr>, Vec<syn::LitStr>)> { - let (ser, de) = get_ser_and_de(cx, RENAME, meta, get_lit_str2)?; - Ok((ser.at_most_one(), de.get())) -} - -fn get_where_predicates( - cx: &Ctxt, - meta: &ParseNestedMeta, -) -> syn::Result<SerAndDe<Vec<syn::WherePredicate>>> { - let (ser, de) = get_ser_and_de(cx, BOUND, meta, parse_lit_into_where)?; - Ok((ser.at_most_one(), de.at_most_one())) -} - -fn get_lit_str( - cx: &Ctxt, - attr_name: Symbol, - meta: &ParseNestedMeta, -) -> syn::Result<Option<syn::LitStr>> { - get_lit_str2(cx, attr_name, attr_name, meta) -} - -fn get_lit_str2( - cx: &Ctxt, - attr_name: Symbol, - meta_item_name: Symbol, - meta: &ParseNestedMeta, -) -> syn::Result<Option<syn::LitStr>> { - let expr: syn::Expr = meta.value()?.parse()?; - let mut value = &expr; - while let syn::Expr::Group(e) = value { - value = &e.expr; - } - if let syn::Expr::Lit(syn::ExprLit { - lit: syn::Lit::Str(lit), - .. - }) = 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( - expr, - format!( - "expected serde {} attribute to be a string: `{} = \"...\"`", - attr_name, meta_item_name - ), - ); - Ok(None) - } -} - -fn parse_lit_into_path( - cx: &Ctxt, - attr_name: Symbol, - meta: &ParseNestedMeta, -) -> syn::Result<Option<syn::Path>> { - let string = match get_lit_str(cx, attr_name, meta)? { - Some(string) => string, - None => return Ok(None), - }; - - Ok(match string.parse() { - Ok(path) => Some(path), - Err(_) => { - cx.error_spanned_by( - &string, - format!("failed to parse path: {:?}", string.value()), - ); - None - } - }) -} - -fn parse_lit_into_expr_path( - cx: &Ctxt, - attr_name: Symbol, - meta: &ParseNestedMeta, -) -> syn::Result<Option<syn::ExprPath>> { - let string = match get_lit_str(cx, attr_name, meta)? { - Some(string) => string, - None => return Ok(None), - }; - - Ok(match string.parse() { - Ok(expr) => Some(expr), - Err(_) => { - cx.error_spanned_by( - &string, - format!("failed to parse path: {:?}", string.value()), - ); - None - } - }) -} - -fn parse_lit_into_where( - cx: &Ctxt, - attr_name: Symbol, - meta_item_name: Symbol, - meta: &ParseNestedMeta, -) -> syn::Result<Vec<syn::WherePredicate>> { - let string = match get_lit_str2(cx, attr_name, meta_item_name, meta)? { - Some(string) => string, - None => return Ok(Vec::new()), - }; - - Ok( - match string.parse_with(Punctuated::<syn::WherePredicate, Token![,]>::parse_terminated) { - Ok(predicates) => Vec::from_iter(predicates), - Err(err) => { - cx.error_spanned_by(string, err); - Vec::new() - } - }, - ) -} - -fn parse_lit_into_ty( - cx: &Ctxt, - attr_name: Symbol, - meta: &ParseNestedMeta, -) -> syn::Result<Option<syn::Type>> { - let string = match get_lit_str(cx, attr_name, meta)? { - Some(string) => string, - None => return Ok(None), - }; - - Ok(match string.parse() { - Ok(ty) => Some(ty), - Err(_) => { - cx.error_spanned_by( - &string, - format!("failed to parse type: {} = {:?}", attr_name, string.value()), - ); - None - } - }) -} - -// Parses a string literal like "'a + 'b + 'c" containing a nonempty list of -// lifetimes separated by `+`. -fn parse_lit_into_lifetimes( - cx: &Ctxt, - meta: &ParseNestedMeta, -) -> syn::Result<BTreeSet<syn::Lifetime>> { - let string = match get_lit_str(cx, BORROW, meta)? { - Some(string) => string, - None => return Ok(BTreeSet::new()), - }; - - if let Ok(lifetimes) = string.parse_with(|input: ParseStream| { - let mut set = BTreeSet::new(); - while !input.is_empty() { - let lifetime: Lifetime = input.parse()?; - if !set.insert(lifetime.clone()) { - cx.error_spanned_by( - &string, - format!("duplicate borrowed lifetime `{}`", lifetime), - ); - } - if input.is_empty() { - break; - } - input.parse::<Token![+]>()?; - } - Ok(set) - }) { - if lifetimes.is_empty() { - cx.error_spanned_by(string, "at least one lifetime must be borrowed"); - } - return Ok(lifetimes); - } - - cx.error_spanned_by( - &string, - format!("failed to parse borrowed lifetimes: {:?}", string.value()), - ); - Ok(BTreeSet::new()) -} - -fn is_implicitly_borrowed(ty: &syn::Type) -> bool { - is_implicitly_borrowed_reference(ty) || is_option(ty, is_implicitly_borrowed_reference) -} - -fn is_implicitly_borrowed_reference(ty: &syn::Type) -> bool { - is_reference(ty, is_str) || is_reference(ty, is_slice_u8) -} - -// Whether the type looks like it might be `std::borrow::Cow<T>` where elem="T". -// This can have false negatives and false positives. -// -// False negative: -// -// use std::borrow::Cow as Pig; -// -// #[derive(Deserialize)] -// struct S<'a> { -// #[serde(borrow)] -// pig: Pig<'a, str>, -// } -// -// False positive: -// -// type str = [i16]; -// -// #[derive(Deserialize)] -// struct S<'a> { -// #[serde(borrow)] -// cow: Cow<'a, str>, -// } -fn is_cow(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool { - let path = match ungroup(ty) { - syn::Type::Path(ty) => &ty.path, - _ => { - return false; - } - }; - let seg = match path.segments.last() { - Some(seg) => seg, - None => { - return false; - } - }; - let args = match &seg.arguments { - syn::PathArguments::AngleBracketed(bracketed) => &bracketed.args, - _ => { - return false; - } - }; - seg.ident == "Cow" - && args.len() == 2 - && match (&args[0], &args[1]) { - (syn::GenericArgument::Lifetime(_), syn::GenericArgument::Type(arg)) => elem(arg), - _ => false, - } -} - -fn is_option(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool { - let path = match ungroup(ty) { - syn::Type::Path(ty) => &ty.path, - _ => { - return false; - } - }; - let seg = match path.segments.last() { - Some(seg) => seg, - None => { - return false; - } - }; - let args = match &seg.arguments { - syn::PathArguments::AngleBracketed(bracketed) => &bracketed.args, - _ => { - return false; - } - }; - seg.ident == "Option" - && args.len() == 1 - && match &args[0] { - syn::GenericArgument::Type(arg) => elem(arg), - _ => false, - } -} - -// Whether the type looks like it might be `&T` where elem="T". This can have -// false negatives and false positives. -// -// False negative: -// -// type Yarn = str; -// -// #[derive(Deserialize)] -// struct S<'a> { -// r: &'a Yarn, -// } -// -// False positive: -// -// type str = [i16]; -// -// #[derive(Deserialize)] -// struct S<'a> { -// r: &'a str, -// } -fn is_reference(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool { - match ungroup(ty) { - syn::Type::Reference(ty) => ty.mutability.is_none() && elem(&ty.elem), - _ => false, - } -} - -fn is_str(ty: &syn::Type) -> bool { - is_primitive_type(ty, "str") -} - -fn is_slice_u8(ty: &syn::Type) -> bool { - match ungroup(ty) { - syn::Type::Slice(ty) => is_primitive_type(&ty.elem, "u8"), - _ => false, - } -} - -fn is_primitive_type(ty: &syn::Type, primitive: &str) -> bool { - match ungroup(ty) { - syn::Type::Path(ty) => ty.qself.is_none() && is_primitive_path(&ty.path, primitive), - _ => false, - } -} - -fn is_primitive_path(path: &syn::Path, primitive: &str) -> bool { - path.leading_colon.is_none() - && path.segments.len() == 1 - && path.segments[0].ident == primitive - && path.segments[0].arguments.is_empty() -} - -// All lifetimes that this type could borrow from a Deserializer. -// -// For example a type `S<'a, 'b>` could borrow `'a` and `'b`. On the other hand -// a type `for<'a> fn(&'a str)` could not borrow `'a` from the Deserializer. -// -// This is used when there is an explicit or implicit `#[serde(borrow)]` -// attribute on the field so there must be at least one borrowable lifetime. -fn borrowable_lifetimes( - cx: &Ctxt, - name: &str, - field: &syn::Field, -) -> Result<BTreeSet<syn::Lifetime>, ()> { - let mut lifetimes = BTreeSet::new(); - collect_lifetimes(&field.ty, &mut lifetimes); - if lifetimes.is_empty() { - let msg = format!("field `{}` has no lifetimes to borrow", name); - cx.error_spanned_by(field, msg); - Err(()) - } else { - Ok(lifetimes) - } -} - -fn collect_lifetimes(ty: &syn::Type, out: &mut BTreeSet<syn::Lifetime>) { - match ty { - #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))] - syn::Type::Slice(ty) => { - collect_lifetimes(&ty.elem, out); - } - syn::Type::Array(ty) => { - collect_lifetimes(&ty.elem, out); - } - syn::Type::Ptr(ty) => { - collect_lifetimes(&ty.elem, out); - } - syn::Type::Reference(ty) => { - out.extend(ty.lifetime.iter().cloned()); - collect_lifetimes(&ty.elem, out); - } - syn::Type::Tuple(ty) => { - for elem in &ty.elems { - collect_lifetimes(elem, out); - } - } - syn::Type::Path(ty) => { - if let Some(qself) = &ty.qself { - collect_lifetimes(&qself.ty, out); - } - for seg in &ty.path.segments { - if let syn::PathArguments::AngleBracketed(bracketed) = &seg.arguments { - for arg in &bracketed.args { - match arg { - syn::GenericArgument::Lifetime(lifetime) => { - out.insert(lifetime.clone()); - } - syn::GenericArgument::Type(ty) => { - collect_lifetimes(ty, out); - } - syn::GenericArgument::AssocType(binding) => { - collect_lifetimes(&binding.ty, out); - } - syn::GenericArgument::Const(_) - | syn::GenericArgument::AssocConst(_) - | syn::GenericArgument::Constraint(_) - | _ => {} - } - } - } - } - } - syn::Type::Paren(ty) => { - collect_lifetimes(&ty.elem, out); - } - syn::Type::Group(ty) => { - collect_lifetimes(&ty.elem, out); - } - syn::Type::Macro(ty) => { - collect_lifetimes_from_tokens(ty.mac.tokens.clone(), out); - } - syn::Type::BareFn(_) - | syn::Type::Never(_) - | syn::Type::TraitObject(_) - | syn::Type::ImplTrait(_) - | syn::Type::Infer(_) - | syn::Type::Verbatim(_) => {} - - _ => {} - } -} - -fn collect_lifetimes_from_tokens(tokens: TokenStream, out: &mut BTreeSet<syn::Lifetime>) { - let mut iter = tokens.into_iter(); - while let Some(tt) = iter.next() { - match &tt { - TokenTree::Punct(op) if op.as_char() == '\'' && op.spacing() == Spacing::Joint => { - if let Some(TokenTree::Ident(ident)) = iter.next() { - out.insert(syn::Lifetime { - apostrophe: op.span(), - ident, - }); - } - } - TokenTree::Group(group) => { - let tokens = group.stream(); - collect_lifetimes_from_tokens(tokens, out); - } - _ => {} - } - } -} diff --git a/vendor/serde_derive/src/internals/case.rs b/vendor/serde_derive/src/internals/case.rs deleted file mode 100644 index 8c8c02e..0000000 --- a/vendor/serde_derive/src/internals/case.rs +++ /dev/null @@ -1,200 +0,0 @@ -//! Code to convert the Rust-styled field/variant (e.g. `my_field`, `MyType`) to the -//! case of the source (e.g. `my-field`, `MY_FIELD`). - -use self::RenameRule::*; -use std::fmt::{self, Debug, Display}; - -/// The different possible ways to change case of fields in a struct, or variants in an enum. -#[derive(Copy, Clone, PartialEq)] -pub enum RenameRule { - /// Don't apply a default rename rule. - None, - /// Rename direct children to "lowercase" style. - LowerCase, - /// Rename direct children to "UPPERCASE" style. - UpperCase, - /// Rename direct children to "PascalCase" style, as typically used for - /// enum variants. - PascalCase, - /// Rename direct children to "camelCase" style. - CamelCase, - /// Rename direct children to "snake_case" style, as commonly used for - /// fields. - SnakeCase, - /// Rename direct children to "SCREAMING_SNAKE_CASE" style, as commonly - /// used for constants. - ScreamingSnakeCase, - /// Rename direct children to "kebab-case" style. - KebabCase, - /// Rename direct children to "SCREAMING-KEBAB-CASE" style. - ScreamingKebabCase, -} - -static RENAME_RULES: &[(&str, RenameRule)] = &[ - ("lowercase", LowerCase), - ("UPPERCASE", UpperCase), - ("PascalCase", PascalCase), - ("camelCase", CamelCase), - ("snake_case", SnakeCase), - ("SCREAMING_SNAKE_CASE", ScreamingSnakeCase), - ("kebab-case", KebabCase), - ("SCREAMING-KEBAB-CASE", ScreamingKebabCase), -]; - -impl RenameRule { - pub fn from_str(rename_all_str: &str) -> Result<Self, ParseError> { - for (name, rule) in RENAME_RULES { - if rename_all_str == *name { - return Ok(*rule); - } - } - Err(ParseError { - unknown: rename_all_str, - }) - } - - /// Apply a renaming rule to an enum variant, returning the version expected in the source. - pub fn apply_to_variant(self, variant: &str) -> String { - match self { - None | PascalCase => variant.to_owned(), - LowerCase => variant.to_ascii_lowercase(), - UpperCase => variant.to_ascii_uppercase(), - CamelCase => variant[..1].to_ascii_lowercase() + &variant[1..], - SnakeCase => { - let mut snake = String::new(); - for (i, ch) in variant.char_indices() { - if i > 0 && ch.is_uppercase() { - snake.push('_'); - } - snake.push(ch.to_ascii_lowercase()); - } - snake - } - ScreamingSnakeCase => SnakeCase.apply_to_variant(variant).to_ascii_uppercase(), - KebabCase => SnakeCase.apply_to_variant(variant).replace('_', "-"), - ScreamingKebabCase => ScreamingSnakeCase - .apply_to_variant(variant) - .replace('_', "-"), - } - } - - /// Apply a renaming rule to a struct field, returning the version expected in the source. - pub fn apply_to_field(self, field: &str) -> String { - match self { - None | LowerCase | SnakeCase => field.to_owned(), - UpperCase => field.to_ascii_uppercase(), - PascalCase => { - let mut pascal = String::new(); - let mut capitalize = true; - for ch in field.chars() { - if ch == '_' { - capitalize = true; - } else if capitalize { - pascal.push(ch.to_ascii_uppercase()); - capitalize = false; - } else { - pascal.push(ch); - } - } - pascal - } - CamelCase => { - let pascal = PascalCase.apply_to_field(field); - pascal[..1].to_ascii_lowercase() + &pascal[1..] - } - ScreamingSnakeCase => field.to_ascii_uppercase(), - KebabCase => field.replace('_', "-"), - ScreamingKebabCase => ScreamingSnakeCase.apply_to_field(field).replace('_', "-"), - } - } - - /// Returns the `RenameRule` if it is not `None`, `rule_b` otherwise. - pub fn or(self, rule_b: Self) -> Self { - match self { - None => rule_b, - _ => self, - } - } -} - -pub struct ParseError<'a> { - unknown: &'a str, -} - -impl<'a> Display for ParseError<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("unknown rename rule `rename_all = ")?; - Debug::fmt(self.unknown, f)?; - f.write_str("`, expected one of ")?; - for (i, (name, _rule)) in RENAME_RULES.iter().enumerate() { - if i > 0 { - f.write_str(", ")?; - } - Debug::fmt(name, f)?; - } - Ok(()) - } -} - -#[test] -fn rename_variants() { - for &(original, lower, upper, camel, snake, screaming, kebab, screaming_kebab) in &[ - ( - "Outcome", "outcome", "OUTCOME", "outcome", "outcome", "OUTCOME", "outcome", "OUTCOME", - ), - ( - "VeryTasty", - "verytasty", - "VERYTASTY", - "veryTasty", - "very_tasty", - "VERY_TASTY", - "very-tasty", - "VERY-TASTY", - ), - ("A", "a", "A", "a", "a", "A", "a", "A"), - ("Z42", "z42", "Z42", "z42", "z42", "Z42", "z42", "Z42"), - ] { - assert_eq!(None.apply_to_variant(original), original); - assert_eq!(LowerCase.apply_to_variant(original), lower); - assert_eq!(UpperCase.apply_to_variant(original), upper); - assert_eq!(PascalCase.apply_to_variant(original), original); - assert_eq!(CamelCase.apply_to_variant(original), camel); - assert_eq!(SnakeCase.apply_to_variant(original), snake); - assert_eq!(ScreamingSnakeCase.apply_to_variant(original), screaming); - assert_eq!(KebabCase.apply_to_variant(original), kebab); - assert_eq!( - ScreamingKebabCase.apply_to_variant(original), - screaming_kebab - ); - } -} - -#[test] -fn rename_fields() { - for &(original, upper, pascal, camel, screaming, kebab, screaming_kebab) in &[ - ( - "outcome", "OUTCOME", "Outcome", "outcome", "OUTCOME", "outcome", "OUTCOME", - ), - ( - "very_tasty", - "VERY_TASTY", - "VeryTasty", - "veryTasty", - "VERY_TASTY", - "very-tasty", - "VERY-TASTY", - ), - ("a", "A", "A", "a", "A", "a", "A"), - ("z42", "Z42", "Z42", "z42", "Z42", "z42", "Z42"), - ] { - assert_eq!(None.apply_to_field(original), original); - assert_eq!(UpperCase.apply_to_field(original), upper); - assert_eq!(PascalCase.apply_to_field(original), pascal); - assert_eq!(CamelCase.apply_to_field(original), camel); - assert_eq!(SnakeCase.apply_to_field(original), original); - assert_eq!(ScreamingSnakeCase.apply_to_field(original), screaming); - assert_eq!(KebabCase.apply_to_field(original), kebab); - assert_eq!(ScreamingKebabCase.apply_to_field(original), screaming_kebab); - } -} diff --git a/vendor/serde_derive/src/internals/check.rs b/vendor/serde_derive/src/internals/check.rs deleted file mode 100644 index 52b0f37..0000000 --- a/vendor/serde_derive/src/internals/check.rs +++ /dev/null @@ -1,477 +0,0 @@ -use crate::internals::ast::{Container, Data, Field, Style}; -use crate::internals::attr::{Default, Identifier, TagType}; -use crate::internals::{ungroup, Ctxt, Derive}; -use syn::{Member, Type}; - -// Cross-cutting checks that require looking at more than a single attrs object. -// Simpler checks should happen when parsing and building the attrs. -pub fn check(cx: &Ctxt, cont: &mut Container, derive: Derive) { - check_default_on_tuple(cx, cont); - check_remote_generic(cx, cont); - check_getter(cx, cont); - check_flatten(cx, cont); - check_identifier(cx, cont); - check_variant_skip_attrs(cx, cont); - check_internal_tag_field_name_conflict(cx, cont); - check_adjacent_tag_conflict(cx, cont); - check_transparent(cx, cont, derive); - check_from_and_try_from(cx, cont); -} - -// If some field of a tuple struct is marked #[serde(default)] then all fields -// after it must also be marked with that attribute, or the struct must have a -// container-level serde(default) attribute. A field's default value is only -// used for tuple fields if the sequence is exhausted at that point; that means -// all subsequent fields will fail to deserialize if they don't have their own -// default. -fn check_default_on_tuple(cx: &Ctxt, cont: &Container) { - if let Default::None = cont.attrs.default() { - if let Data::Struct(Style::Tuple, fields) = &cont.data { - let mut first_default_index = None; - for (i, field) in fields.iter().enumerate() { - // Skipped fields automatically get the #[serde(default)] - // attribute. We are interested only on non-skipped fields here. - if field.attrs.skip_deserializing() { - continue; - } - if let Default::None = field.attrs.default() { - if let Some(first) = first_default_index { - cx.error_spanned_by( - field.ty, - format!("field must have #[serde(default)] because previous field {} has #[serde(default)]", first), - ); - } - continue; - } - if first_default_index.is_none() { - first_default_index = Some(i); - } - } - } - } -} - -// Remote derive definition type must have either all of the generics of the -// remote type: -// -// #[serde(remote = "Generic")] -// struct Generic<T> {…} -// -// or none of them, i.e. defining impls for one concrete instantiation of the -// remote type only: -// -// #[serde(remote = "Generic<T>")] -// struct ConcreteDef {…} -// -fn check_remote_generic(cx: &Ctxt, cont: &Container) { - if let Some(remote) = cont.attrs.remote() { - let local_has_generic = !cont.generics.params.is_empty(); - let remote_has_generic = !remote.segments.last().unwrap().arguments.is_none(); - if local_has_generic && remote_has_generic { - cx.error_spanned_by(remote, "remove generic parameters from this path"); - } - } -} - -// Getters are only allowed inside structs (not enums) with the `remote` -// attribute. -fn check_getter(cx: &Ctxt, cont: &Container) { - match cont.data { - Data::Enum(_) => { - if cont.data.has_getter() { - cx.error_spanned_by( - cont.original, - "#[serde(getter = \"...\")] is not allowed in an enum", - ); - } - } - Data::Struct(_, _) => { - if cont.data.has_getter() && cont.attrs.remote().is_none() { - cx.error_spanned_by( - cont.original, - "#[serde(getter = \"...\")] can only be used in structs that have #[serde(remote = \"...\")]", - ); - } - } - } -} - -// Flattening has some restrictions we can test. -fn check_flatten(cx: &Ctxt, cont: &Container) { - match &cont.data { - Data::Enum(variants) => { - for variant in variants { - for field in &variant.fields { - check_flatten_field(cx, variant.style, field); - } - } - } - Data::Struct(style, fields) => { - for field in fields { - check_flatten_field(cx, *style, field); - } - } - } -} - -fn check_flatten_field(cx: &Ctxt, style: Style, field: &Field) { - if !field.attrs.flatten() { - return; - } - match style { - Style::Tuple => { - cx.error_spanned_by( - field.original, - "#[serde(flatten)] cannot be used on tuple structs", - ); - } - Style::Newtype => { - cx.error_spanned_by( - field.original, - "#[serde(flatten)] cannot be used on newtype structs", - ); - } - _ => {} - } -} - -// The `other` attribute must be used at most once and it must be the last -// variant of an enum. -// -// Inside a `variant_identifier` all variants must be unit variants. Inside a -// `field_identifier` all but possibly one variant must be unit variants. The -// last variant may be a newtype variant which is an implicit "other" case. -fn check_identifier(cx: &Ctxt, cont: &Container) { - let variants = match &cont.data { - Data::Enum(variants) => variants, - Data::Struct(_, _) => return, - }; - - for (i, variant) in variants.iter().enumerate() { - match ( - variant.style, - cont.attrs.identifier(), - variant.attrs.other(), - cont.attrs.tag(), - ) { - // The `other` attribute may not be used in a variant_identifier. - (_, Identifier::Variant, true, _) => { - cx.error_spanned_by( - variant.original, - "#[serde(other)] may not be used on a variant identifier", - ); - } - - // Variant with `other` attribute cannot appear in untagged enum - (_, Identifier::No, true, &TagType::None) => { - cx.error_spanned_by( - variant.original, - "#[serde(other)] cannot appear on untagged enum", - ); - } - - // Variant with `other` attribute must be the last one. - (Style::Unit, Identifier::Field, true, _) | (Style::Unit, Identifier::No, true, _) => { - if i < variants.len() - 1 { - cx.error_spanned_by( - variant.original, - "#[serde(other)] must be on the last variant", - ); - } - } - - // Variant with `other` attribute must be a unit variant. - (_, Identifier::Field, true, _) | (_, Identifier::No, true, _) => { - cx.error_spanned_by( - variant.original, - "#[serde(other)] must be on a unit variant", - ); - } - - // Any sort of variant is allowed if this is not an identifier. - (_, Identifier::No, false, _) => {} - - // Unit variant without `other` attribute is always fine. - (Style::Unit, _, false, _) => {} - - // The last field is allowed to be a newtype catch-all. - (Style::Newtype, Identifier::Field, false, _) => { - if i < variants.len() - 1 { - cx.error_spanned_by( - variant.original, - format!("`{}` must be the last variant", variant.ident), - ); - } - } - - (_, Identifier::Field, false, _) => { - cx.error_spanned_by( - variant.original, - "#[serde(field_identifier)] may only contain unit variants", - ); - } - - (_, Identifier::Variant, false, _) => { - cx.error_spanned_by( - variant.original, - "#[serde(variant_identifier)] may only contain unit variants", - ); - } - } - } -} - -// Skip-(de)serializing attributes are not allowed on variants marked -// (de)serialize_with. -fn check_variant_skip_attrs(cx: &Ctxt, cont: &Container) { - let variants = match &cont.data { - Data::Enum(variants) => variants, - Data::Struct(_, _) => return, - }; - - for variant in variants { - if variant.attrs.serialize_with().is_some() { - if variant.attrs.skip_serializing() { - cx.error_spanned_by( - variant.original, - format!( - "variant `{}` cannot have both #[serde(serialize_with)] and #[serde(skip_serializing)]", - variant.ident - ), - ); - } - - for field in &variant.fields { - let member = member_message(&field.member); - - if field.attrs.skip_serializing() { - cx.error_spanned_by( - variant.original, - format!( - "variant `{}` cannot have both #[serde(serialize_with)] and a field {} marked with #[serde(skip_serializing)]", - variant.ident, member - ), - ); - } - - if field.attrs.skip_serializing_if().is_some() { - cx.error_spanned_by( - variant.original, - format!( - "variant `{}` cannot have both #[serde(serialize_with)] and a field {} marked with #[serde(skip_serializing_if)]", - variant.ident, member - ), - ); - } - } - } - - if variant.attrs.deserialize_with().is_some() { - if variant.attrs.skip_deserializing() { - cx.error_spanned_by( - variant.original, - format!( - "variant `{}` cannot have both #[serde(deserialize_with)] and #[serde(skip_deserializing)]", - variant.ident - ), - ); - } - - for field in &variant.fields { - if field.attrs.skip_deserializing() { - let member = member_message(&field.member); - - cx.error_spanned_by( - variant.original, - format!( - "variant `{}` cannot have both #[serde(deserialize_with)] and a field {} marked with #[serde(skip_deserializing)]", - variant.ident, member - ), - ); - } - } - } - } -} - -// The tag of an internally-tagged struct variant must not be the same as either -// one of its fields, as this would result in duplicate keys in the serialized -// output and/or ambiguity in the to-be-deserialized input. -fn check_internal_tag_field_name_conflict(cx: &Ctxt, cont: &Container) { - let variants = match &cont.data { - Data::Enum(variants) => variants, - Data::Struct(_, _) => return, - }; - - let tag = match cont.attrs.tag() { - TagType::Internal { tag } => tag.as_str(), - TagType::External | TagType::Adjacent { .. } | TagType::None => return, - }; - - let diagnose_conflict = || { - cx.error_spanned_by( - cont.original, - format!("variant field name `{}` conflicts with internal tag", tag), - ); - }; - - for variant in variants { - match variant.style { - Style::Struct => { - if variant.attrs.untagged() { - continue; - } - for field in &variant.fields { - let check_ser = - !(field.attrs.skip_serializing() || variant.attrs.skip_serializing()); - let check_de = - !(field.attrs.skip_deserializing() || variant.attrs.skip_deserializing()); - let name = field.attrs.name(); - let ser_name = name.serialize_name(); - - if check_ser && ser_name == tag { - diagnose_conflict(); - return; - } - - for de_name in field.attrs.aliases() { - if check_de && de_name == tag { - diagnose_conflict(); - return; - } - } - } - } - Style::Unit | Style::Newtype | Style::Tuple => {} - } - } -} - -// In the case of adjacently-tagged enums, the type and the contents tag must -// differ, for the same reason. -fn check_adjacent_tag_conflict(cx: &Ctxt, cont: &Container) { - let (type_tag, content_tag) = match cont.attrs.tag() { - TagType::Adjacent { tag, content } => (tag, content), - TagType::Internal { .. } | TagType::External | TagType::None => return, - }; - - if type_tag == content_tag { - cx.error_spanned_by( - cont.original, - format!( - "enum tags `{}` for type and content conflict with each other", - type_tag - ), - ); - } -} - -// Enums and unit structs cannot be transparent. -fn check_transparent(cx: &Ctxt, cont: &mut Container, derive: Derive) { - if !cont.attrs.transparent() { - return; - } - - if cont.attrs.type_from().is_some() { - cx.error_spanned_by( - cont.original, - "#[serde(transparent)] is not allowed with #[serde(from = \"...\")]", - ); - } - - if cont.attrs.type_try_from().is_some() { - cx.error_spanned_by( - cont.original, - "#[serde(transparent)] is not allowed with #[serde(try_from = \"...\")]", - ); - } - - if cont.attrs.type_into().is_some() { - cx.error_spanned_by( - cont.original, - "#[serde(transparent)] is not allowed with #[serde(into = \"...\")]", - ); - } - - let fields = match &mut cont.data { - Data::Enum(_) => { - cx.error_spanned_by( - cont.original, - "#[serde(transparent)] is not allowed on an enum", - ); - return; - } - Data::Struct(Style::Unit, _) => { - cx.error_spanned_by( - cont.original, - "#[serde(transparent)] is not allowed on a unit struct", - ); - return; - } - Data::Struct(_, fields) => fields, - }; - - let mut transparent_field = None; - - for field in fields { - if allow_transparent(field, derive) { - if transparent_field.is_some() { - cx.error_spanned_by( - cont.original, - "#[serde(transparent)] requires struct to have at most one transparent field", - ); - return; - } - transparent_field = Some(field); - } - } - - match transparent_field { - Some(transparent_field) => transparent_field.attrs.mark_transparent(), - None => match derive { - Derive::Serialize => { - cx.error_spanned_by( - cont.original, - "#[serde(transparent)] requires at least one field that is not skipped", - ); - } - Derive::Deserialize => { - cx.error_spanned_by( - cont.original, - "#[serde(transparent)] requires at least one field that is neither skipped nor has a default", - ); - } - }, - } -} - -fn member_message(member: &Member) -> String { - match member { - Member::Named(ident) => format!("`{}`", ident), - Member::Unnamed(i) => format!("#{}", i.index), - } -} - -fn allow_transparent(field: &Field, derive: Derive) -> bool { - if let Type::Path(ty) = ungroup(field.ty) { - if let Some(seg) = ty.path.segments.last() { - if seg.ident == "PhantomData" { - return false; - } - } - } - - match derive { - Derive::Serialize => !field.attrs.skip_serializing(), - Derive::Deserialize => !field.attrs.skip_deserializing() && field.attrs.default().is_none(), - } -} - -fn check_from_and_try_from(cx: &Ctxt, cont: &mut Container) { - if cont.attrs.type_from().is_some() && cont.attrs.type_try_from().is_some() { - cx.error_spanned_by( - cont.original, - "#[serde(from = \"...\")] and #[serde(try_from = \"...\")] conflict with each other", - ); - } -} diff --git a/vendor/serde_derive/src/internals/ctxt.rs b/vendor/serde_derive/src/internals/ctxt.rs deleted file mode 100644 index a47bfa4..0000000 --- a/vendor/serde_derive/src/internals/ctxt.rs +++ /dev/null @@ -1,68 +0,0 @@ -use quote::ToTokens; -use std::cell::RefCell; -use std::fmt::Display; -use std::thread; - -/// A type to collect errors together and format them. -/// -/// Dropping this object will cause a panic. It must be consumed using `check`. -/// -/// References can be shared since this type uses run-time exclusive mut checking. -#[derive(Default)] -pub struct Ctxt { - // The contents will be set to `None` during checking. This is so that checking can be - // enforced. - errors: RefCell<Option<Vec<syn::Error>>>, -} - -impl Ctxt { - /// Create a new context object. - /// - /// This object contains no errors, but will still trigger a panic if it is not `check`ed. - pub fn new() -> Self { - Ctxt { - errors: RefCell::new(Some(Vec::new())), - } - } - - /// Add an error to the context object with a tokenenizable object. - /// - /// The object is used for spanning in error messages. - pub fn error_spanned_by<A: ToTokens, T: Display>(&self, obj: A, msg: T) { - self.errors - .borrow_mut() - .as_mut() - .unwrap() - // Curb monomorphization from generating too many identical methods. - .push(syn::Error::new_spanned(obj.into_token_stream(), msg)); - } - - /// Add one of Syn's parse errors. - pub fn syn_error(&self, err: syn::Error) { - self.errors.borrow_mut().as_mut().unwrap().push(err); - } - - /// Consume this object, producing a formatted error string if there are errors. - pub fn check(self) -> syn::Result<()> { - let mut errors = self.errors.borrow_mut().take().unwrap().into_iter(); - - let mut combined = match errors.next() { - Some(first) => first, - None => return Ok(()), - }; - - for rest in errors { - combined.combine(rest); - } - - Err(combined) - } -} - -impl Drop for Ctxt { - fn drop(&mut self) { - if !thread::panicking() && self.errors.borrow().is_some() { - panic!("forgot to check for errors"); - } - } -} diff --git a/vendor/serde_derive/src/internals/mod.rs b/vendor/serde_derive/src/internals/mod.rs deleted file mode 100644 index f98ef08..0000000 --- a/vendor/serde_derive/src/internals/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -pub mod ast; -pub mod attr; - -mod case; -mod check; -mod ctxt; -mod receiver; -mod respan; -mod symbol; - -use syn::Type; - -pub use self::ctxt::Ctxt; -pub use self::receiver::replace_receiver; - -#[derive(Copy, Clone)] -pub enum Derive { - Serialize, - Deserialize, -} - -pub fn ungroup(mut ty: &Type) -> &Type { - while let Type::Group(group) = ty { - ty = &group.elem; - } - ty -} diff --git a/vendor/serde_derive/src/internals/receiver.rs b/vendor/serde_derive/src/internals/receiver.rs deleted file mode 100644 index fa2a77d..0000000 --- a/vendor/serde_derive/src/internals/receiver.rs +++ /dev/null @@ -1,292 +0,0 @@ -use crate::internals::respan::respan; -use proc_macro2::Span; -use quote::ToTokens; -use std::mem; -use syn::punctuated::Punctuated; -use syn::{ - parse_quote, Data, DeriveInput, Expr, ExprPath, GenericArgument, GenericParam, Generics, Macro, - Path, PathArguments, QSelf, ReturnType, Token, Type, TypeParamBound, TypePath, WherePredicate, -}; - -pub fn replace_receiver(input: &mut DeriveInput) { - let self_ty = { - let ident = &input.ident; - let ty_generics = input.generics.split_for_impl().1; - parse_quote!(#ident #ty_generics) - }; - let mut visitor = ReplaceReceiver(&self_ty); - visitor.visit_generics_mut(&mut input.generics); - visitor.visit_data_mut(&mut input.data); -} - -struct ReplaceReceiver<'a>(&'a TypePath); - -impl ReplaceReceiver<'_> { - fn self_ty(&self, span: Span) -> TypePath { - let tokens = self.0.to_token_stream(); - let respanned = respan(tokens, span); - syn::parse2(respanned).unwrap() - } - - fn self_to_qself(&self, qself: &mut Option<QSelf>, path: &mut Path) { - if path.leading_colon.is_some() || path.segments[0].ident != "Self" { - return; - } - - if path.segments.len() == 1 { - self.self_to_expr_path(path); - return; - } - - let span = path.segments[0].ident.span(); - *qself = Some(QSelf { - lt_token: Token![<](span), - ty: Box::new(Type::Path(self.self_ty(span))), - position: 0, - as_token: None, - gt_token: Token![>](span), - }); - - path.leading_colon = Some(**path.segments.pairs().next().unwrap().punct().unwrap()); - - let segments = mem::replace(&mut path.segments, Punctuated::new()); - path.segments = segments.into_pairs().skip(1).collect(); - } - - fn self_to_expr_path(&self, path: &mut Path) { - let self_ty = self.self_ty(path.segments[0].ident.span()); - let variant = mem::replace(path, self_ty.path); - for segment in &mut path.segments { - if let PathArguments::AngleBracketed(bracketed) = &mut segment.arguments { - if bracketed.colon2_token.is_none() && !bracketed.args.is_empty() { - bracketed.colon2_token = Some(<Token![::]>::default()); - } - } - } - if variant.segments.len() > 1 { - path.segments.push_punct(<Token![::]>::default()); - path.segments.extend(variant.segments.into_pairs().skip(1)); - } - } -} - -impl ReplaceReceiver<'_> { - // `Self` -> `Receiver` - fn visit_type_mut(&mut self, ty: &mut Type) { - let span = if let Type::Path(node) = ty { - if node.qself.is_none() && node.path.is_ident("Self") { - node.path.segments[0].ident.span() - } else { - self.visit_type_path_mut(node); - return; - } - } else { - self.visit_type_mut_impl(ty); - return; - }; - *ty = self.self_ty(span).into(); - } - - // `Self::Assoc` -> `<Receiver>::Assoc` - fn visit_type_path_mut(&mut self, ty: &mut TypePath) { - if ty.qself.is_none() { - self.self_to_qself(&mut ty.qself, &mut ty.path); - } - self.visit_type_path_mut_impl(ty); - } - - // `Self::method` -> `<Receiver>::method` - fn visit_expr_path_mut(&mut self, expr: &mut ExprPath) { - if expr.qself.is_none() { - self.self_to_qself(&mut expr.qself, &mut expr.path); - } - self.visit_expr_path_mut_impl(expr); - } - - // Everything below is simply traversing the syntax tree. - - fn visit_type_mut_impl(&mut self, ty: &mut Type) { - match ty { - #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))] - Type::Array(ty) => { - self.visit_type_mut(&mut ty.elem); - self.visit_expr_mut(&mut ty.len); - } - Type::BareFn(ty) => { - for arg in &mut ty.inputs { - self.visit_type_mut(&mut arg.ty); - } - self.visit_return_type_mut(&mut ty.output); - } - Type::Group(ty) => self.visit_type_mut(&mut ty.elem), - Type::ImplTrait(ty) => { - for bound in &mut ty.bounds { - self.visit_type_param_bound_mut(bound); - } - } - Type::Macro(ty) => self.visit_macro_mut(&mut ty.mac), - Type::Paren(ty) => self.visit_type_mut(&mut ty.elem), - Type::Path(ty) => { - if let Some(qself) = &mut ty.qself { - self.visit_type_mut(&mut qself.ty); - } - self.visit_path_mut(&mut ty.path); - } - Type::Ptr(ty) => self.visit_type_mut(&mut ty.elem), - Type::Reference(ty) => self.visit_type_mut(&mut ty.elem), - Type::Slice(ty) => self.visit_type_mut(&mut ty.elem), - Type::TraitObject(ty) => { - for bound in &mut ty.bounds { - self.visit_type_param_bound_mut(bound); - } - } - Type::Tuple(ty) => { - for elem in &mut ty.elems { - self.visit_type_mut(elem); - } - } - - Type::Infer(_) | Type::Never(_) | Type::Verbatim(_) => {} - - _ => {} - } - } - - fn visit_type_path_mut_impl(&mut self, ty: &mut TypePath) { - if let Some(qself) = &mut ty.qself { - self.visit_type_mut(&mut qself.ty); - } - self.visit_path_mut(&mut ty.path); - } - - fn visit_expr_path_mut_impl(&mut self, expr: &mut ExprPath) { - if let Some(qself) = &mut expr.qself { - self.visit_type_mut(&mut qself.ty); - } - self.visit_path_mut(&mut expr.path); - } - - fn visit_path_mut(&mut self, path: &mut Path) { - for segment in &mut path.segments { - self.visit_path_arguments_mut(&mut segment.arguments); - } - } - - fn visit_path_arguments_mut(&mut self, arguments: &mut PathArguments) { - match arguments { - PathArguments::None => {} - PathArguments::AngleBracketed(arguments) => { - for arg in &mut arguments.args { - match arg { - #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))] - GenericArgument::Type(arg) => self.visit_type_mut(arg), - GenericArgument::AssocType(arg) => self.visit_type_mut(&mut arg.ty), - GenericArgument::Lifetime(_) - | GenericArgument::Const(_) - | GenericArgument::AssocConst(_) - | GenericArgument::Constraint(_) => {} - _ => {} - } - } - } - PathArguments::Parenthesized(arguments) => { - for argument in &mut arguments.inputs { - self.visit_type_mut(argument); - } - self.visit_return_type_mut(&mut arguments.output); - } - } - } - - fn visit_return_type_mut(&mut self, return_type: &mut ReturnType) { - match return_type { - ReturnType::Default => {} - ReturnType::Type(_, output) => self.visit_type_mut(output), - } - } - - fn visit_type_param_bound_mut(&mut self, bound: &mut TypeParamBound) { - match bound { - #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))] - TypeParamBound::Trait(bound) => self.visit_path_mut(&mut bound.path), - TypeParamBound::Lifetime(_) | TypeParamBound::Verbatim(_) => {} - _ => {} - } - } - - fn visit_generics_mut(&mut self, generics: &mut Generics) { - for param in &mut generics.params { - match param { - GenericParam::Type(param) => { - for bound in &mut param.bounds { - self.visit_type_param_bound_mut(bound); - } - } - GenericParam::Lifetime(_) | GenericParam::Const(_) => {} - } - } - if let Some(where_clause) = &mut generics.where_clause { - for predicate in &mut where_clause.predicates { - match predicate { - #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))] - WherePredicate::Type(predicate) => { - self.visit_type_mut(&mut predicate.bounded_ty); - for bound in &mut predicate.bounds { - self.visit_type_param_bound_mut(bound); - } - } - WherePredicate::Lifetime(_) => {} - _ => {} - } - } - } - } - - fn visit_data_mut(&mut self, data: &mut Data) { - match data { - Data::Struct(data) => { - for field in &mut data.fields { - self.visit_type_mut(&mut field.ty); - } - } - Data::Enum(data) => { - for variant in &mut data.variants { - for field in &mut variant.fields { - self.visit_type_mut(&mut field.ty); - } - } - } - Data::Union(_) => {} - } - } - - fn visit_expr_mut(&mut self, expr: &mut Expr) { - match expr { - Expr::Binary(expr) => { - self.visit_expr_mut(&mut expr.left); - self.visit_expr_mut(&mut expr.right); - } - Expr::Call(expr) => { - self.visit_expr_mut(&mut expr.func); - for arg in &mut expr.args { - self.visit_expr_mut(arg); - } - } - Expr::Cast(expr) => { - self.visit_expr_mut(&mut expr.expr); - self.visit_type_mut(&mut expr.ty); - } - Expr::Field(expr) => self.visit_expr_mut(&mut expr.base), - Expr::Index(expr) => { - self.visit_expr_mut(&mut expr.expr); - self.visit_expr_mut(&mut expr.index); - } - Expr::Paren(expr) => self.visit_expr_mut(&mut expr.expr), - Expr::Path(expr) => self.visit_expr_path_mut(expr), - Expr::Unary(expr) => self.visit_expr_mut(&mut expr.expr), - _ => {} - } - } - - fn visit_macro_mut(&mut self, _mac: &mut Macro) {} -} diff --git a/vendor/serde_derive/src/internals/respan.rs b/vendor/serde_derive/src/internals/respan.rs deleted file mode 100644 index dcec701..0000000 --- a/vendor/serde_derive/src/internals/respan.rs +++ /dev/null @@ -1,16 +0,0 @@ -use proc_macro2::{Group, Span, TokenStream, TokenTree}; - -pub(crate) fn respan(stream: TokenStream, span: Span) -> TokenStream { - stream - .into_iter() - .map(|token| respan_token(token, span)) - .collect() -} - -fn respan_token(mut token: TokenTree, span: Span) -> TokenTree { - if let TokenTree::Group(g) = &mut token { - *g = Group::new(g.delimiter(), respan(g.stream(), span)); - } - token.set_span(span); - token -} diff --git a/vendor/serde_derive/src/internals/symbol.rs b/vendor/serde_derive/src/internals/symbol.rs deleted file mode 100644 index 572391a..0000000 --- a/vendor/serde_derive/src/internals/symbol.rs +++ /dev/null @@ -1,71 +0,0 @@ -use std::fmt::{self, Display}; -use syn::{Ident, Path}; - -#[derive(Copy, Clone)] -pub struct Symbol(&'static str); - -pub const ALIAS: Symbol = Symbol("alias"); -pub const BORROW: Symbol = Symbol("borrow"); -pub const BOUND: Symbol = Symbol("bound"); -pub const CONTENT: Symbol = Symbol("content"); -pub const CRATE: Symbol = Symbol("crate"); -pub const DEFAULT: Symbol = Symbol("default"); -pub const DENY_UNKNOWN_FIELDS: Symbol = Symbol("deny_unknown_fields"); -pub const DESERIALIZE: Symbol = Symbol("deserialize"); -pub const DESERIALIZE_WITH: Symbol = Symbol("deserialize_with"); -pub const EXPECTING: Symbol = Symbol("expecting"); -pub const FIELD_IDENTIFIER: Symbol = Symbol("field_identifier"); -pub const FLATTEN: Symbol = Symbol("flatten"); -pub const FROM: Symbol = Symbol("from"); -pub const GETTER: Symbol = Symbol("getter"); -pub const INTO: Symbol = Symbol("into"); -pub const NON_EXHAUSTIVE: Symbol = Symbol("non_exhaustive"); -pub const OTHER: Symbol = Symbol("other"); -pub const REMOTE: Symbol = Symbol("remote"); -pub const RENAME: Symbol = Symbol("rename"); -pub const RENAME_ALL: Symbol = Symbol("rename_all"); -pub const RENAME_ALL_FIELDS: Symbol = Symbol("rename_all_fields"); -pub const REPR: Symbol = Symbol("repr"); -pub const SERDE: Symbol = Symbol("serde"); -pub const SERIALIZE: Symbol = Symbol("serialize"); -pub const SERIALIZE_WITH: Symbol = Symbol("serialize_with"); -pub const SKIP: Symbol = Symbol("skip"); -pub const SKIP_DESERIALIZING: Symbol = Symbol("skip_deserializing"); -pub const SKIP_SERIALIZING: Symbol = Symbol("skip_serializing"); -pub const SKIP_SERIALIZING_IF: Symbol = Symbol("skip_serializing_if"); -pub const TAG: Symbol = Symbol("tag"); -pub const TRANSPARENT: Symbol = Symbol("transparent"); -pub const TRY_FROM: Symbol = Symbol("try_from"); -pub const UNTAGGED: Symbol = Symbol("untagged"); -pub const VARIANT_IDENTIFIER: Symbol = Symbol("variant_identifier"); -pub const WITH: Symbol = Symbol("with"); - -impl PartialEq<Symbol> for Ident { - fn eq(&self, word: &Symbol) -> bool { - self == word.0 - } -} - -impl<'a> PartialEq<Symbol> for &'a Ident { - fn eq(&self, word: &Symbol) -> bool { - *self == word.0 - } -} - -impl PartialEq<Symbol> for Path { - fn eq(&self, word: &Symbol) -> bool { - self.is_ident(word.0) - } -} - -impl<'a> PartialEq<Symbol> for &'a Path { - fn eq(&self, word: &Symbol) -> bool { - self.is_ident(word.0) - } -} - -impl Display for Symbol { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(self.0) - } -} |