mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
style: Introduce css(skip_if) to conditionally skip serialization of a field.
This commit is contained in:
parent
ada45f4968
commit
6da1b2fff5
1 changed files with 22 additions and 3 deletions
|
@ -5,7 +5,7 @@
|
||||||
use cg::{self, WhereClause};
|
use cg::{self, WhereClause};
|
||||||
use darling::util::Override;
|
use darling::util::Override;
|
||||||
use quote::{ToTokens, Tokens};
|
use quote::{ToTokens, Tokens};
|
||||||
use syn::{self, Data};
|
use syn::{self, Data, Ident};
|
||||||
use synstructure::{BindingInfo, Structure, VariantInfo};
|
use synstructure::{BindingInfo, Structure, VariantInfo};
|
||||||
|
|
||||||
pub fn derive(input: syn::DeriveInput) -> Tokens {
|
pub fn derive(input: syn::DeriveInput) -> Tokens {
|
||||||
|
@ -128,7 +128,15 @@ fn derive_variant_fields_expr(
|
||||||
if !attrs.ignore_bound {
|
if !attrs.ignore_bound {
|
||||||
where_clause.add_trait_bound(&first.ast().ty);
|
where_clause.add_trait_bound(&first.ast().ty);
|
||||||
}
|
}
|
||||||
return quote! { ::style_traits::ToCss::to_css(#first, dest) };
|
let mut expr = quote! { ::style_traits::ToCss::to_css(#first, dest) };
|
||||||
|
if let Some(condition) = attrs.skip_if {
|
||||||
|
expr = quote! {
|
||||||
|
if !#first.#condition() {
|
||||||
|
#expr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut expr = derive_single_field_expr(first, attrs, where_clause);
|
let mut expr = derive_single_field_expr(first, attrs, where_clause);
|
||||||
|
@ -148,7 +156,7 @@ fn derive_single_field_expr(
|
||||||
attrs: CssFieldAttrs,
|
attrs: CssFieldAttrs,
|
||||||
where_clause: &mut WhereClause,
|
where_clause: &mut WhereClause,
|
||||||
) -> Tokens {
|
) -> Tokens {
|
||||||
if attrs.iterable {
|
let mut expr = if attrs.iterable {
|
||||||
if let Some(if_empty) = attrs.if_empty {
|
if let Some(if_empty) = attrs.if_empty {
|
||||||
return quote! {
|
return quote! {
|
||||||
{
|
{
|
||||||
|
@ -173,7 +181,17 @@ fn derive_single_field_expr(
|
||||||
where_clause.add_trait_bound(&field.ast().ty);
|
where_clause.add_trait_bound(&field.ast().ty);
|
||||||
}
|
}
|
||||||
quote! { writer.item(#field)?; }
|
quote! { writer.item(#field)?; }
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(condition) = attrs.skip_if {
|
||||||
|
expr = quote! {
|
||||||
|
if !#field.#condition() {
|
||||||
|
#expr
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expr
|
||||||
}
|
}
|
||||||
|
|
||||||
#[darling(attributes(css), default)]
|
#[darling(attributes(css), default)]
|
||||||
|
@ -203,4 +221,5 @@ struct CssFieldAttrs {
|
||||||
ignore_bound: bool,
|
ignore_bound: bool,
|
||||||
iterable: bool,
|
iterable: bool,
|
||||||
skip: bool,
|
skip: bool,
|
||||||
|
skip_if: Option<Ident>,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue