From fd143327299eee966149edf1a05b01aa852fe7be Mon Sep 17 00:00:00 2001 From: Osspial Date: Mon, 9 Apr 2018 23:43:49 -0400 Subject: [PATCH] Ignore skipped fields --- serde_derive/src/bound.rs | 15 ++++++++------- serde_derive/src/de.rs | 8 +++++++- serde_derive/src/ser.rs | 9 +++++++-- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/serde_derive/src/bound.rs b/serde_derive/src/bound.rs index 74d628c5..feafd1c3 100644 --- a/serde_derive/src/bound.rs +++ b/serde_derive/src/bound.rs @@ -55,21 +55,22 @@ pub fn with_where_predicates_from_fields( generics: &syn::Generics, trait_bound: &syn::Path, from_field: F, - where_ty: W, + gen_bound_where: W, ) -> syn::Generics where F: Fn(&attr::Field) -> Option<&[syn::WherePredicate]>, - W: for<'a> Fn(&attr::Field) -> Option<&syn::ExprPath>, + W: for<'a> Fn(&attr::Field) -> bool, { let predicates = cont.data .all_fields() .flat_map(|field| { - let field_bound: Option = match where_ty(&field.attrs) { - Some(_) => None, - None => { + let field_bound: Option = match gen_bound_where(&field.attrs) { + true => { let field_ty = field.ty; - Some(parse_quote!(#field_ty: #trait_bound)) - } + let predicate: syn::WherePredicate = parse_quote!(#field_ty: #trait_bound); + Some(predicate) + }, + false => None }; field_bound.into_iter().chain(from_field(&field.attrs).into_iter().flat_map(|predicates| predicates.to_vec())) }); diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 975f95c7..f929397c 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -126,7 +126,13 @@ fn build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generi let delife = borrowed.de_lifetime(); let de_bound = parse_quote!(_serde::Deserialize<#delife>); - let generics = bound::with_where_predicates_from_fields(cont, &generics, &de_bound, attr::Field::de_bound, attr::Field::deserialize_with); + let generics = bound::with_where_predicates_from_fields( + cont, + &generics, + &de_bound, + attr::Field::de_bound, + |field| field.deserialize_with().is_none() && !field.skip_deserializing() + ); match cont.attrs.de_bound() { Some(predicates) => bound::with_where_predicates(&generics, predicates), diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index 07b88d81..7e37ca6b 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -131,8 +131,13 @@ fn build_generics(cont: &Container) -> syn::Generics { let generics = bound::without_defaults(cont.generics); let trait_bound = parse_quote!(_serde::Serialize); - let generics = - bound::with_where_predicates_from_fields(cont, &generics, &trait_bound, attr::Field::ser_bound, attr::Field::serialize_with); + let generics = bound::with_where_predicates_from_fields( + cont, + &generics, + &trait_bound, + attr::Field::ser_bound, + |field| field.serialize_with().is_none() && !field.skip_serializing() + ); match cont.attrs.ser_bound() { Some(predicates) => bound::with_where_predicates(&generics, predicates),