From 97168d3a2440488925b002c378c5e3128c61577f Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 15 Sep 2025 20:28:17 -0700 Subject: [PATCH] Touch up PR 2879 --- serde_derive/src/de.rs | 5 +- serde_derive/src/deprecated.rs | 56 ++++++++++++++++++ serde_derive/src/internals/deprecated.rs | 58 ------------------- serde_derive/src/internals/mod.rs | 1 - serde_derive/src/lib.rs | 1 + serde_derive/src/ser.rs | 4 +- .../{deprecated.rs => test_deprecated.rs} | 12 ++-- 7 files changed, 65 insertions(+), 72 deletions(-) create mode 100644 serde_derive/src/deprecated.rs delete mode 100644 serde_derive/src/internals/deprecated.rs rename test_suite/tests/{deprecated.rs => test_deprecated.rs} (71%) 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