From 8101887d31c69d47e30bb31c09bde0560aace5e8 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 26 Aug 2017 00:07:02 +0200 Subject: [PATCH] Support #[animation(constant)] when deriving ToAnimatedZero --- components/style/values/animated/effects.rs | 11 ---------- components/style/values/computed/length.rs | 17 +++------------ components/style/values/generics/effects.rs | 3 ++- components/style_derive/to_animated_zero.rs | 23 ++++++++++++++++----- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/components/style/values/animated/effects.rs b/components/style/values/animated/effects.rs index 3fd595cebeb..eb03bd9565b 100644 --- a/components/style/values/animated/effects.rs +++ b/components/style/values/animated/effects.rs @@ -152,17 +152,6 @@ impl ComputeSquaredDistance for BoxShadow { } } -impl ToAnimatedZero for BoxShadow { - #[inline] - fn to_animated_zero(&self) -> Result { - Ok(BoxShadow { - base: self.base.to_animated_zero()?, - spread: self.spread.to_animated_zero()?, - inset: self.inset, - }) - } -} - impl ToAnimatedValue for ComputedFilterList { type AnimatedValue = FilterList; diff --git a/components/style/values/computed/length.rs b/components/style/values/computed/length.rs index 3da3ea9c9a5..a6600a806a2 100644 --- a/components/style/values/computed/length.rs +++ b/components/style/values/computed/length.rs @@ -11,7 +11,6 @@ use style_traits::ToCss; use style_traits::values::specified::AllowedLengthType; use super::{Number, ToComputedValue, Context, Percentage}; use values::{Auto, CSSFloat, Either, ExtremumLength, None_, Normal, specified}; -use values::animated::ToAnimatedZero; use values::computed::{NonNegativeAu, NonNegativeNumber}; use values::distance::{ComputeSquaredDistance, SquaredDistance}; use values::generics::NonNegative; @@ -64,26 +63,16 @@ impl ToComputedValue for specified::Length { } } -#[derive(Clone, Copy, Debug, PartialEq)] -#[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] +#[cfg_attr(feature = "servo", derive(HeapSizeOf))] +#[derive(Clone, Copy, Debug, PartialEq, ToAnimatedZero)] pub struct CalcLengthOrPercentage { + #[animation(constant)] pub clamping_mode: AllowedLengthType, length: Au, pub percentage: Option, } -impl ToAnimatedZero for CalcLengthOrPercentage { - #[inline] - fn to_animated_zero(&self) -> Result { - Ok(CalcLengthOrPercentage { - clamping_mode: self.clamping_mode, - length: self.length.to_animated_zero()?, - percentage: self.percentage.to_animated_zero()?, - }) - } -} - impl ComputeSquaredDistance for CalcLengthOrPercentage { #[inline] fn compute_squared_distance(&self, other: &Self) -> Result { diff --git a/components/style/values/generics/effects.rs b/components/style/values/generics/effects.rs index 572a211544f..5d95ae19a8f 100644 --- a/components/style/values/generics/effects.rs +++ b/components/style/values/generics/effects.rs @@ -11,7 +11,8 @@ use values::specified::url::SpecifiedUrl; /// A generic value for a single `box-shadow`. #[cfg_attr(feature = "servo", derive(HeapSizeOf))] -#[derive(Animate, Clone, Debug, HasViewportPercentage, PartialEq, ToAnimatedValue)] +#[derive(Animate, Clone, Debug, HasViewportPercentage, PartialEq)] +#[derive(ToAnimatedValue, ToAnimatedZero)] pub struct BoxShadow { /// The base shadow. pub base: SimpleShadow, diff --git a/components/style_derive/to_animated_zero.rs b/components/style_derive/to_animated_zero.rs index 50f905ccdc1..2c76935c6dd 100644 --- a/components/style_derive/to_animated_zero.rs +++ b/components/style_derive/to_animated_zero.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use animate::AnimateAttrs; +use animate::{AnimateAttrs, AnimateFieldAttrs}; use cg; use quote; use syn; @@ -25,10 +25,23 @@ pub fn derive(input: syn::DeriveInput) -> quote::Tokens { let bindings_pairs = bindings.into_iter().zip(mapped_bindings); let mut computations = quote!(); computations.append_all(bindings_pairs.map(|(binding, mapped_binding)| { - where_clause.add_trait_bound(binding.field.ty.clone()); - quote! { - let #mapped_binding = - ::values::animated::ToAnimatedZero::to_animated_zero(#binding)?; + let field_attrs = cg::parse_field_attrs::(&binding.field); + if field_attrs.constant { + if cg::is_parameterized(&binding.field.ty, where_clause.params) { + where_clause.inner.predicates.push(cg::where_predicate( + binding.field.ty.clone(), + &["std", "clone", "Clone"], + )); + } + quote! { + let #mapped_binding = ::std::clone::Clone::clone(#binding); + } + } else { + where_clause.add_trait_bound(binding.field.ty.clone()); + quote! { + let #mapped_binding = + ::values::animated::ToAnimatedZero::to_animated_zero(#binding)?; + } } })); computations.append(quote! { Ok(#mapped) });