Skip to content

Commit

Permalink
Merge pull request #1970 from serde-rs/self
Browse files Browse the repository at this point in the history
Support `Self` inside fields that use serialize_with
  • Loading branch information
dtolnay committed Jan 25, 2021
2 parents b054ea4 + 2ba9739 commit 29cdf88
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 4 deletions.
4 changes: 2 additions & 2 deletions serde_derive/src/lib.rs
Expand Up @@ -79,8 +79,8 @@ mod try;

#[proc_macro_derive(Serialize, attributes(serde))]
pub fn derive_serialize(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
ser::expand_derive_serialize(&input)
let mut input = parse_macro_input!(input as DeriveInput);
ser::expand_derive_serialize(&mut input)
.unwrap_or_else(to_compile_errors)
.into()
}
Expand Down
8 changes: 6 additions & 2 deletions serde_derive/src/ser.rs
Expand Up @@ -6,10 +6,14 @@ use bound;
use dummy;
use fragment::{Fragment, Match, Stmts};
use internals::ast::{Container, Data, Field, Style, Variant};
use internals::{attr, Ctxt, Derive};
use internals::{attr, replace_receiver, Ctxt, Derive};
use pretend;

pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result<TokenStream, Vec<syn::Error>> {
pub fn expand_derive_serialize(
input: &mut syn::DeriveInput,
) -> Result<TokenStream, Vec<syn::Error>> {
replace_receiver(input);

let ctxt = Ctxt::new();
let cont = match Container::from_ast(&ctxt, input, Derive::Serialize) {
Some(cont) => cont,
Expand Down
15 changes: 15 additions & 0 deletions test_suite/tests/test_gen.rs
Expand Up @@ -7,6 +7,7 @@
#![allow(
unknown_lints,
mixed_script_confusables,
clippy::ptr_arg,
clippy::trivially_copy_pass_by_ref
)]

Expand Down Expand Up @@ -735,6 +736,12 @@ fn test_gen() {
#[serde(borrow = "'a")]
f: mac!(Cow<'a, str>),
}

#[derive(Serialize)]
struct Struct {
#[serde(serialize_with = "vec_first_element")]
vec: Vec<Self>,
}
}

//////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -808,3 +815,11 @@ where
pub fn is_zero(n: &u8) -> bool {
*n == 0
}

fn vec_first_element<T, S>(vec: &Vec<T>, serializer: S) -> StdResult<S::Ok, S::Error>
where
T: Serialize,
S: Serializer,
{
vec.first().serialize(serializer)
}

0 comments on commit 29cdf88

Please sign in to comment.