From 7d66e65d949dc487a5d89f7004d825d9e4d9f3b7 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Thu, 18 May 2017 17:19:50 +0200 Subject: [PATCH] Move some style macros into their own module, used first --- components/style/lib.rs | 3 + components/style/macros.rs | 115 ++++++++++++++++++ components/style/values/mod.rs | 109 ----------------- components/style/values/specified/position.rs | 4 +- 4 files changed, 120 insertions(+), 111 deletions(-) create mode 100644 components/style/macros.rs diff --git a/components/style/lib.rs b/components/style/lib.rs index 4210304217f..47696ca096d 100644 --- a/components/style/lib.rs +++ b/components/style/lib.rs @@ -83,6 +83,9 @@ extern crate time; #[allow(unused_extern_crates)] extern crate unicode_segmentation; +#[macro_use] +mod macros; + pub mod animation; #[allow(missing_docs)] // TODO. #[cfg(feature = "servo")] pub mod attr; diff --git a/components/style/macros.rs b/components/style/macros.rs new file mode 100644 index 00000000000..ce040891a74 --- /dev/null +++ b/components/style/macros.rs @@ -0,0 +1,115 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +//! Various macro helpers. + +macro_rules! define_numbered_css_keyword_enum { + ($name: ident: $( $css: expr => $variant: ident = $value: expr ),+,) => { + define_numbered_css_keyword_enum!($name: $( $css => $variant = $value ),+); + }; + ($name: ident: $( $css: expr => $variant: ident = $value: expr ),+) => { + #[allow(non_camel_case_types, missing_docs)] + #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] + pub enum $name { + $( $variant = $value ),+ + } + + impl $crate::parser::Parse for $name { + #[allow(missing_docs)] + fn parse(_context: &$crate::parser::ParserContext, input: &mut ::cssparser::Parser) -> Result<$name, ()> { + match_ignore_ascii_case! { &try!(input.expect_ident()), + $( $css => Ok($name::$variant), )+ + _ => Err(()) + } + } + } + + impl ::style_traits::values::ToCss for $name { + fn to_css(&self, dest: &mut W) -> ::std::fmt::Result + where W: ::std::fmt::Write, + { + match *self { + $( $name::$variant => dest.write_str($css) ),+ + } + } + } + } +} + +/// A macro used to implement HasViewportPercentage trait +/// for a given type that may never contain viewport units. +macro_rules! no_viewport_percentage { + ($name: ident) => { + impl $crate::values::HasViewportPercentage for $name { + #[inline] + fn has_viewport_percentage(&self) -> bool { + false + } + } + }; +} + +/// A macro for implementing `ComputedValueAsSpecified`, `Parse` +/// and `HasViewportPercentage` traits for the enums defined +/// using `define_css_keyword_enum` macro. +/// +/// NOTE: We should either move `Parse` trait to `style_traits` +/// or `define_css_keyword_enum` macro to this crate, but that +/// may involve significant cleanup in both the crates. +macro_rules! add_impls_for_keyword_enum { + ($name:ident) => { + impl $crate::parser::Parse for $name { + #[inline] + fn parse(_context: &$crate::parser::ParserContext, + input: &mut ::cssparser::Parser) + -> Result { + $name::parse(input) + } + } + + impl $crate::values::computed::ComputedValueAsSpecified for $name {} + no_viewport_percentage!($name); + }; +} + +macro_rules! define_keyword_type { + ($name: ident, $css: expr) => { + #[derive(Clone, PartialEq, Copy)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf))] + #[allow(missing_docs)] + pub struct $name; + + impl ::style_traits::ToCss for $name { + fn to_css(&self, dest: &mut W) -> ::std::fmt::Result where W: ::std::fmt::Write { + write!(dest, $css) + } + } + + impl $crate::properties::animated_properties::Animatable for $name { + #[inline] + fn add_weighted(&self, _other: &Self, _self_progress: f64, _other_progress: f64) + -> Result { + Ok($name) + } + } + + impl fmt::Debug for $name { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, $css) + } + } + + impl $crate::parser::Parse for $name { + fn parse(_context: &$crate::parser::ParserContext, + input: &mut ::cssparser::Parser) + -> Result<$name, ()> { + input.expect_ident_matching($css).map(|_| $name) + } + } + + impl $crate::values::computed::ComputedValueAsSpecified for $name {} + no_viewport_percentage!($name); + }; +} diff --git a/components/style/values/mod.rs b/components/style/values/mod.rs index 4ce3d1f8dc1..63bcc366bad 100644 --- a/components/style/values/mod.rs +++ b/components/style/values/mod.rs @@ -11,81 +11,12 @@ use Atom; pub use cssparser::{RGBA, Token, Parser, serialize_identifier, serialize_string}; use parser::{Parse, ParserContext}; -use properties::animated_properties::Animatable; use std::ascii::AsciiExt; use std::borrow::Cow; use std::fmt::{self, Debug}; use std::hash; use style_traits::ToCss; -macro_rules! define_numbered_css_keyword_enum { - ($name: ident: $( $css: expr => $variant: ident = $value: expr ),+,) => { - define_numbered_css_keyword_enum!($name: $( $css => $variant = $value ),+); - }; - ($name: ident: $( $css: expr => $variant: ident = $value: expr ),+) => { - #[allow(non_camel_case_types, missing_docs)] - #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] - #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] - pub enum $name { - $( $variant = $value ),+ - } - - impl Parse for $name { - #[allow(missing_docs)] - fn parse(_context: &ParserContext, input: &mut ::cssparser::Parser) -> Result<$name, ()> { - match_ignore_ascii_case! { &try!(input.expect_ident()), - $( $css => Ok($name::$variant), )+ - _ => Err(()) - } - } - } - - impl ToCss for $name { - fn to_css(&self, dest: &mut W) -> ::std::fmt::Result - where W: ::std::fmt::Write, - { - match *self { - $( $name::$variant => dest.write_str($css) ),+ - } - } - } - } -} - -/// A macro used to implement HasViewportPercentage trait -/// for a given type that may never contain viewport units. -macro_rules! no_viewport_percentage { - ($name: ident) => { - impl $crate::values::HasViewportPercentage for $name { - #[inline] - fn has_viewport_percentage(&self) -> bool { - false - } - } - }; -} - -/// A macro for implementing `ComputedValueAsSpecified`, `Parse` -/// and `HasViewportPercentage` traits for the enums defined -/// using `define_css_keyword_enum` macro. -/// -/// NOTE: We should either move `Parse` trait to `style_traits` -/// or `define_css_keyword_enum` macro to this crate, but that -/// may involve significant cleanup in both the crates. -macro_rules! add_impls_for_keyword_enum { - ($name:ident) => { - impl Parse for $name { - #[inline] - fn parse(_context: &ParserContext, input: &mut ::cssparser::Parser) -> Result { - $name::parse(input) - } - } - - impl ComputedValueAsSpecified for $name {} - no_viewport_percentage!($name); - }; -} - pub mod computed; pub mod generics; pub mod specified; @@ -112,46 +43,6 @@ impl HasViewportPercentage for Box { } } -use self::computed::ComputedValueAsSpecified; - -macro_rules! define_keyword_type { - ($name: ident, $css: expr) => { - #[derive(Clone, PartialEq, Copy)] - #[cfg_attr(feature = "servo", derive(HeapSizeOf))] - #[allow(missing_docs)] - pub struct $name; - - impl ::style_traits::ToCss for $name { - fn to_css(&self, dest: &mut W) -> ::std::fmt::Result where W: ::std::fmt::Write { - write!(dest, $css) - } - } - - impl Animatable for $name { - #[inline] - fn add_weighted(&self, _other: &Self, _self_progress: f64, _other_progress: f64) - -> Result { - Ok($name) - } - } - - impl fmt::Debug for $name { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, $css) - } - } - - impl Parse for $name { - fn parse(_context: &ParserContext, input: &mut ::cssparser::Parser) -> Result<$name, ()> { - input.expect_ident_matching($css).map(|_| $name) - } - } - - impl ComputedValueAsSpecified for $name {} - no_viewport_percentage!($name); - }; -} - define_keyword_type!(None_, "none"); define_keyword_type!(Auto, "auto"); define_keyword_type!(Normal, "normal"); diff --git a/components/style/values/specified/position.rs b/components/style/values/specified/position.rs index abeef00fe21..dab81a26736 100644 --- a/components/style/values/specified/position.rs +++ b/components/style/values/specified/position.rs @@ -12,8 +12,8 @@ use parser::{Parse, ParserContext}; use std::fmt; use style_traits::ToCss; use values::HasViewportPercentage; -use values::computed::{CalcLengthOrPercentage, ComputedValueAsSpecified, Context}; -use values::computed::{LengthOrPercentage as ComputedLengthOrPercentage, ToComputedValue}; +use values::computed::{CalcLengthOrPercentage, LengthOrPercentage as ComputedLengthOrPercentage}; +use values::computed::{Context, ToComputedValue}; use values::generics::position::Position as GenericPosition; use values::specified::{AllowQuirks, LengthOrPercentage, Percentage};