Skip to content

Commit 97168d3

Browse files
committed
Touch up PR 2879
1 parent 373b11d commit 97168d3

File tree

7 files changed

+65
-72
lines changed

7 files changed

+65
-72
lines changed

serde_derive/src/de.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use crate::deprecated::allow_deprecated;
12
use crate::fragment::{Expr, Fragment, Match, Stmts};
23
use crate::internals::ast::{Container, Data, Field, Style, Variant};
3-
use crate::internals::deprecated::allow_deprecated;
44
use crate::internals::name::Name;
55
use crate::internals::{attr, replace_receiver, ungroup, Ctxt, Derive};
66
use crate::{bound, dummy, pretend, private, this};
@@ -23,13 +23,12 @@ pub fn expand_derive_deserialize(input: &mut syn::DeriveInput) -> syn::Result<To
2323
precondition(&ctxt, &cont);
2424
ctxt.check()?;
2525

26-
let allow_deprecated = allow_deprecated(input)?;
27-
2826
let ident = &cont.ident;
2927
let params = Parameters::new(&cont);
3028
let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(&params);
3129
let body = Stmts(deserialize_body(&cont, &params));
3230
let delife = params.borrowed.de_lifetime();
31+
let allow_deprecated = allow_deprecated(input);
3332

3433
let impl_block = if let Some(remote) = cont.attrs.remote() {
3534
let vis = &input.vis;

serde_derive/src/deprecated.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use proc_macro2::TokenStream;
2+
use quote::quote;
3+
4+
pub fn allow_deprecated(input: &syn::DeriveInput) -> Option<TokenStream> {
5+
if should_allow_deprecated(input) {
6+
Some(quote! { #[allow(deprecated)] })
7+
} else {
8+
None
9+
}
10+
}
11+
12+
/// Determine if an `#[allow(deprecated)]` should be added to the derived impl.
13+
///
14+
/// This should happen if the derive input or an enum variant it contains has
15+
/// one of:
16+
/// - `#[deprecated]`
17+
/// - `#[allow(deprecated)]`
18+
fn should_allow_deprecated(input: &syn::DeriveInput) -> bool {
19+
if contains_deprecated(&input.attrs) {
20+
return true;
21+
}
22+
if let syn::Data::Enum(data_enum) = &input.data {
23+
for variant in &data_enum.variants {
24+
if contains_deprecated(&variant.attrs) {
25+
return true;
26+
}
27+
}
28+
}
29+
false
30+
}
31+
32+
/// Check whether the given attributes contains one of:
33+
/// - `#[deprecated]`
34+
/// - `#[allow(deprecated)]`
35+
fn contains_deprecated(attrs: &[syn::Attribute]) -> bool {
36+
for attr in attrs {
37+
if attr.path().is_ident("deprecated") {
38+
return true;
39+
}
40+
if let syn::Meta::List(meta_list) = &attr.meta {
41+
if meta_list.path.is_ident("allow") {
42+
let mut allow_deprecated = false;
43+
let _ = meta_list.parse_nested_meta(|meta| {
44+
if meta.path.is_ident("deprecated") {
45+
allow_deprecated = true;
46+
}
47+
Ok(())
48+
});
49+
if allow_deprecated {
50+
return true;
51+
}
52+
}
53+
}
54+
}
55+
false
56+
}

serde_derive/src/internals/deprecated.rs

Lines changed: 0 additions & 58 deletions
This file was deleted.

serde_derive/src/internals/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
pub mod ast;
22
pub mod attr;
3-
pub mod deprecated;
43
pub mod name;
54

65
mod case;

serde_derive/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ mod bound;
8686
mod fragment;
8787

8888
mod de;
89+
mod deprecated;
8990
mod dummy;
9091
mod pretend;
9192
mod ser;

serde_derive/src/ser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use crate::deprecated::allow_deprecated;
12
use crate::fragment::{Fragment, Match, Stmts};
23
use crate::internals::ast::{Container, Data, Field, Style, Variant};
3-
use crate::internals::deprecated::allow_deprecated;
44
use crate::internals::name::Name;
55
use crate::internals::{attr, replace_receiver, Ctxt, Derive};
66
use crate::{bound, dummy, pretend, private, this};
@@ -19,12 +19,12 @@ pub fn expand_derive_serialize(input: &mut syn::DeriveInput) -> syn::Result<Toke
1919
};
2020
precondition(&ctxt, &cont);
2121
ctxt.check()?;
22-
let allow_deprecated = allow_deprecated(input)?;
2322

2423
let ident = &cont.ident;
2524
let params = Parameters::new(&cont);
2625
let (impl_generics, ty_generics, where_clause) = params.generics.split_for_impl();
2726
let body = Stmts(serialize_body(&cont, &params));
27+
let allow_deprecated = allow_deprecated(input);
2828

2929
let impl_block = if let Some(remote) = cont.attrs.remote() {
3030
let vis = &input.vis;

test_suite/tests/deprecated.rs renamed to test_suite/tests/test_deprecated.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,28 @@
33

44
use serde_derive::{Deserialize, Serialize};
55

6-
/// deprecated enum
76
#[derive(Serialize, Deserialize)]
87
#[deprecated]
9-
enum E1 {
8+
enum DeprecatedEnum {
109
A,
1110
B,
1211
}
1312

14-
/// deprecated struct
1513
#[derive(Serialize, Deserialize)]
1614
#[deprecated]
17-
struct S1 {
15+
struct DeprecatedStruct {
1816
a: bool,
1917
}
2018

21-
/// deprecated enum variant
2219
#[derive(Serialize, Deserialize)]
23-
enum E2 {
20+
enum DeprecatedVariant {
2421
A,
2522
#[deprecated]
2623
B,
2724
}
2825

29-
/// deprecated struct field
3026
#[derive(Serialize, Deserialize)]
31-
struct S2 {
27+
struct DeprecatedField {
3228
#[deprecated]
3329
a: bool,
3430
}

0 commit comments

Comments
 (0)