style: Move represents_keyword to the css attributes.

Bug: 1457635
Reviewed-by: xidorn
MozReview-Commit-ID: 21yuU4h34AQ
This commit is contained in:
Emilio Cobos Álvarez 2018-04-29 04:48:47 +02:00
parent a375baf84b
commit c508d8576d
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
8 changed files with 24 additions and 69 deletions

View file

@ -23,12 +23,13 @@ pub enum BorderImageSideWidth<LengthOrPercentage, Number> {
/// A generic value for the `border-image-slice` property. /// A generic value for the `border-image-slice` property.
#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, #[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo,
ToComputedValue)] ToComputedValue, ToCss)]
pub struct BorderImageSlice<NumberOrPercentage> { pub struct BorderImageSlice<NumberOrPercentage> {
/// The offsets. /// The offsets.
#[css(field_bound)]
pub offsets: Rect<NumberOrPercentage>, pub offsets: Rect<NumberOrPercentage>,
/// Whether to fill the middle part. /// Whether to fill the middle part.
#[value_info(represents_keyword)] #[css(represents_keyword)]
pub fill: bool, pub fill: bool,
} }
@ -86,22 +87,6 @@ where
} }
} }
impl<N> ToCss for BorderImageSlice<N>
where
N: PartialEq + ToCss,
{
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: Write,
{
self.offsets.to_css(dest)?;
if self.fill {
dest.write_str(" fill")?;
}
Ok(())
}
}
impl<L> BorderRadius<L> { impl<L> BorderRadius<L> {
/// Returns a new `BorderRadius<L>`. /// Returns a new `BorderRadius<L>`.
#[inline] #[inline]

View file

@ -4,14 +4,12 @@
//! Generic types for CSS values related to effects. //! Generic types for CSS values related to effects.
use std::fmt::{self, Write};
use style_traits::values::{CssWriter, SequenceWriter, ToCss};
#[cfg(feature = "gecko")] #[cfg(feature = "gecko")]
use values::specified::url::SpecifiedUrl; use values::specified::url::SpecifiedUrl;
/// A generic value for a single `box-shadow`. /// A generic value for a single `box-shadow`.
#[derive(Animate, Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, #[derive(Animate, Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo,
ToAnimatedValue, ToAnimatedZero)] ToAnimatedValue, ToAnimatedZero, ToCss)]
pub struct BoxShadow<Color, SizeLength, BlurShapeLength, ShapeLength> { pub struct BoxShadow<Color, SizeLength, BlurShapeLength, ShapeLength> {
/// The base shadow. /// The base shadow.
pub base: SimpleShadow<Color, SizeLength, BlurShapeLength>, pub base: SimpleShadow<Color, SizeLength, BlurShapeLength>,
@ -19,7 +17,7 @@ pub struct BoxShadow<Color, SizeLength, BlurShapeLength, ShapeLength> {
pub spread: ShapeLength, pub spread: ShapeLength,
/// Whether this is an inset box shadow. /// Whether this is an inset box shadow.
#[animation(constant)] #[animation(constant)]
#[value_info(represents_keyword)] #[css(represents_keyword)]
pub inset: bool, pub inset: bool,
} }
@ -80,27 +78,3 @@ pub struct SimpleShadow<Color, SizeLength, ShapeLength> {
/// Blur radius. /// Blur radius.
pub blur: ShapeLength, pub blur: ShapeLength,
} }
impl<Color, SizeLength, BlurShapeLength, ShapeLength> ToCss
for BoxShadow<Color, SizeLength, BlurShapeLength, ShapeLength>
where
Color: ToCss,
SizeLength: ToCss,
BlurShapeLength: ToCss,
ShapeLength: ToCss,
{
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: Write,
{
{
let mut writer = SequenceWriter::new(&mut *dest, " ");
writer.item(&self.base)?;
writer.item(&self.spread)?;
}
if self.inset {
dest.write_str(" inset")?;
}
Ok(())
}
}

View file

@ -1947,11 +1947,11 @@ pub struct FontSynthesis {
/// If a `font-weight` is requested that the font family does not contain, /// If a `font-weight` is requested that the font family does not contain,
/// the user agent may synthesize the requested weight from the weights /// the user agent may synthesize the requested weight from the weights
/// that do exist in the font family. /// that do exist in the font family.
#[value_info(represents_keyword)] #[css(represents_keyword)]
pub weight: bool, pub weight: bool,
/// If a font-style is requested that the font family does not contain, /// If a font-style is requested that the font family does not contain,
/// the user agent may synthesize the requested style from the normal face in the font family. /// the user agent may synthesize the requested style from the normal face in the font family.
#[value_info(represents_keyword)] #[css(represents_keyword)]
pub style: bool, pub style: bool,
} }

View file

@ -424,14 +424,14 @@ pub enum AutoFlow {
} }
#[derive(Clone, Copy, Debug, Eq, MallocSizeOf, PartialEq, SpecifiedValueInfo, #[derive(Clone, Copy, Debug, Eq, MallocSizeOf, PartialEq, SpecifiedValueInfo,
ToComputedValue)] ToComputedValue, ToCss)]
/// Controls how the auto-placement algorithm works /// Controls how the auto-placement algorithm works
/// specifying exactly how auto-placed items get flowed into the grid /// specifying exactly how auto-placed items get flowed into the grid
pub struct GridAutoFlow { pub struct GridAutoFlow {
/// Specifiy how auto-placement algorithm fills each `row` or `column` in turn /// Specifiy how auto-placement algorithm fills each `row` or `column` in turn
pub autoflow: AutoFlow, pub autoflow: AutoFlow,
/// Specify use `dense` packing algorithm or not /// Specify use `dense` packing algorithm or not
#[value_info(represents_keyword)] #[css(represents_keyword)]
pub dense: bool, pub dense: bool,
} }
@ -446,20 +446,6 @@ impl GridAutoFlow {
} }
} }
impl ToCss for GridAutoFlow {
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: Write,
{
self.autoflow.to_css(dest)?;
if self.dense {
dest.write_str(" dense")?;
}
Ok(())
}
}
impl Parse for GridAutoFlow { impl Parse for GridAutoFlow {
/// [ row | column ] || dense /// [ row | column ] || dense
fn parse<'i, 't>( fn parse<'i, 't>(

View file

@ -140,13 +140,13 @@ fn derive_struct_fields<'a>(
values.push(value.to_string()); values.push(value.to_string());
} }
} }
if info_attrs.represents_keyword { let css_attrs = cg::parse_field_attrs::<CssFieldAttrs>(field);
if css_attrs.represents_keyword {
let ident = field.ident.as_ref() let ident = field.ident.as_ref()
.expect("only named field should use represents_keyword"); .expect("only named field should use represents_keyword");
values.push(cg::to_css_identifier(ident.as_ref())); values.push(cg::to_css_identifier(ident.as_ref()));
return None; return None;
} }
let css_attrs = cg::parse_field_attrs::<CssFieldAttrs>(field);
if let Some(if_empty) = css_attrs.if_empty { if let Some(if_empty) = css_attrs.if_empty {
values.push(if_empty); values.push(if_empty);
} }
@ -176,6 +176,5 @@ struct ValueInfoVariantAttrs {
#[darling(attributes(value_info), default)] #[darling(attributes(value_info), default)]
#[derive(Default, FromField)] #[derive(Default, FromField)]
struct ValueInfoFieldAttrs { struct ValueInfoFieldAttrs {
represents_keyword: bool,
other_values: Option<String>, other_values: Option<String>,
} }

View file

@ -189,6 +189,15 @@ fn derive_single_field_expr(
writer.item(&item)?; writer.item(&item)?;
} }
} }
} else if attrs.represents_keyword {
let ident =
field.ast().ident.as_ref().expect("Unnamed field with represents_keyword?");
let ident = cg::to_css_identifier(ident.as_ref());
quote! {
if *#field {
writer.raw_item(#ident)?;
}
}
} else { } else {
if attrs.field_bound { if attrs.field_bound {
let ty = &field.ast().ty; let ty = &field.ast().ty;
@ -236,5 +245,6 @@ pub struct CssFieldAttrs {
pub field_bound: bool, pub field_bound: bool,
pub iterable: bool, pub iterable: bool,
pub skip: bool, pub skip: bool,
pub represents_keyword: bool,
pub skip_if: Option<Path>, pub skip_if: Option<Path>,
} }

View file

@ -56,8 +56,6 @@ pub type KeywordsCollectFn<'a> = &'a mut FnMut(&[&'static str]);
/// * `#[value_info(starts_with_keyword)]` can be used on variants to /// * `#[value_info(starts_with_keyword)]` can be used on variants to
/// add the name of a non-unit variant (serialized like `ToCss`) into /// add the name of a non-unit variant (serialized like `ToCss`) into
/// `collect_completion_keywords`. /// `collect_completion_keywords`.
/// * `#[value_info(represents_keyword)]` can be used on fields into
/// `collect_completion_keywords`.
pub trait SpecifiedValueInfo { pub trait SpecifiedValueInfo {
/// Supported CssTypes by the given value type. /// Supported CssTypes by the given value type.
/// ///

View file

@ -37,6 +37,9 @@ use std::fmt::{self, Write};
/// * if `#[css(skip_if = "function")]` is found on a field, the `ToCss` call /// * if `#[css(skip_if = "function")]` is found on a field, the `ToCss` call
/// for that field is skipped if `function` returns true. This function is /// for that field is skipped if `function` returns true. This function is
/// provided the field as an argument; /// provided the field as an argument;
/// * `#[css(represents_keyword)]` can be used on bool fields in order to
/// serialize the field name if the field is true, or nothing otherwise. It
/// also collects those keywords for `SpecifiedValueInfo`.
/// * finally, one can put `#[css(derive_debug)]` on the whole type, to /// * finally, one can put `#[css(derive_debug)]` on the whole type, to
/// implement `Debug` by a single call to `ToCss::to_css`. /// implement `Debug` by a single call to `ToCss::to_css`.
pub trait ToCss { pub trait ToCss {