diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 8f77b9e0..ed31c1c2 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1,6 +1,6 @@ +use crate::deprecated::allow_deprecated; use crate::fragment::{Expr, Fragment, Match, Stmts}; use crate::internals::ast::{Container, Data, Field, Style, Variant}; -use crate::internals::deprecated::allow_deprecated; use crate::internals::name::Name; use crate::internals::{attr, replace_receiver, ungroup, Ctxt, Derive}; use crate::{bound, dummy, pretend, private, this}; @@ -23,13 +23,12 @@ pub fn expand_derive_deserialize(input: &mut syn::DeriveInput) -> syn::Result Option { + if should_allow_deprecated(input) { + Some(quote! { #[allow(deprecated)] }) + } else { + None + } +} + +/// Determine if an `#[allow(deprecated)]` should be added to the derived impl. +/// +/// This should happen if the derive input or an enum variant it contains has +/// one of: +/// - `#[deprecated]` +/// - `#[allow(deprecated)]` +fn should_allow_deprecated(input: &syn::DeriveInput) -> bool { + if contains_deprecated(&input.attrs) { + return true; + } + if let syn::Data::Enum(data_enum) = &input.data { + for variant in &data_enum.variants { + if contains_deprecated(&variant.attrs) { + return true; + } + } + } + false +} + +/// Check whether the given attributes contains one of: +/// - `#[deprecated]` +/// - `#[allow(deprecated)]` +fn contains_deprecated(attrs: &[syn::Attribute]) -> bool { + for attr in attrs { + if attr.path().is_ident("deprecated") { + return true; + } + if let syn::Meta::List(meta_list) = &attr.meta { + if meta_list.path.is_ident("allow") { + let mut allow_deprecated = false; + let _ = meta_list.parse_nested_meta(|meta| { + if meta.path.is_ident("deprecated") { + allow_deprecated = true; + } + Ok(()) + }); + if allow_deprecated { + return true; + } + } + } + } + false +} diff --git a/serde_derive/src/internals/deprecated.rs b/serde_derive/src/internals/deprecated.rs deleted file mode 100644 index f3fed95a..00000000 --- a/serde_derive/src/internals/deprecated.rs +++ /dev/null @@ -1,58 +0,0 @@ -use proc_macro2::TokenStream; -use quote::quote; - -pub fn allow_deprecated(input: &syn::DeriveInput) -> syn::Result { - if should_allow_deprecated(input)? { - Ok(quote! { #[allow(deprecated)]}) - } else { - Ok(TokenStream::default()) - } -} - -/// Determine if an `#[allow(deprecated)]` should be added to the derived impl. -/// -/// This should happen if the derive input or a variant of the enum (if derive input is an enum) -/// has on of: -/// - `#[deprecated]` -/// - `#[allow(deprecated)]` -fn should_allow_deprecated(input: &syn::DeriveInput) -> syn::Result { - if contains_deprecated_attrs(&input.attrs)? { - return Ok(true); - } - if let syn::Data::Enum(data_enum) = &input.data { - for variant in &data_enum.variants { - if contains_deprecated_attrs(&variant.attrs)? { - return Ok(true); - } - } - } - Ok(false) -} - -/// Check whether a set of attributes contains one of: -/// - `#[deprecated]` -/// - `#[allow(deprecated)]` -fn contains_deprecated_attrs(attrs: &[syn::Attribute]) -> syn::Result { - for attr in attrs { - if let syn::Meta::Path(path) = &attr.meta { - if path.is_ident("deprecated") { - return Ok(true); - } - } - if let syn::Meta::List(meta_list) = &attr.meta { - if meta_list.path.is_ident("allow") { - let mut deprecated_allowed = false; - meta_list.parse_nested_meta(|meta| { - if meta.path.is_ident("deprecated") { - deprecated_allowed = true; - } - Ok(()) - })?; - if deprecated_allowed { - return Ok(true); - } - } - } - } - Ok(false) -} diff --git a/serde_derive/src/internals/mod.rs b/serde_derive/src/internals/mod.rs index d4e99344..cd1e8105 100644 --- a/serde_derive/src/internals/mod.rs +++ b/serde_derive/src/internals/mod.rs @@ -1,6 +1,5 @@ pub mod ast; pub mod attr; -pub mod deprecated; pub mod name; mod case; diff --git a/serde_derive/src/lib.rs b/serde_derive/src/lib.rs index b0e1ad2f..b3384391 100644 --- a/serde_derive/src/lib.rs +++ b/serde_derive/src/lib.rs @@ -86,6 +86,7 @@ mod bound; mod fragment; mod de; +mod deprecated; mod dummy; mod pretend; mod ser; diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index efae73cf..ad1fb174 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -1,6 +1,6 @@ +use crate::deprecated::allow_deprecated; use crate::fragment::{Fragment, Match, Stmts}; use crate::internals::ast::{Container, Data, Field, Style, Variant}; -use crate::internals::deprecated::allow_deprecated; use crate::internals::name::Name; use crate::internals::{attr, replace_receiver, Ctxt, Derive}; use crate::{bound, dummy, pretend, private, this}; @@ -19,12 +19,12 @@ pub fn expand_derive_serialize(input: &mut syn::DeriveInput) -> syn::Result