зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1457635: Move represents_keyword to the css attributes. r=xidorn
MozReview-Commit-ID: 21yuU4h34AQ
This commit is contained in:
Родитель
42257e0c21
Коммит
3058209ae5
|
@ -23,12 +23,13 @@ pub enum BorderImageSideWidth<LengthOrPercentage, Number> {
|
|||
|
||||
/// A generic value for the `border-image-slice` property.
|
||||
#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo,
|
||||
ToComputedValue)]
|
||||
ToComputedValue, ToCss)]
|
||||
pub struct BorderImageSlice<NumberOrPercentage> {
|
||||
/// The offsets.
|
||||
#[css(field_bound)]
|
||||
pub offsets: Rect<NumberOrPercentage>,
|
||||
/// Whether to fill the middle part.
|
||||
#[value_info(represents_keyword)]
|
||||
#[css(represents_keyword)]
|
||||
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> {
|
||||
/// Returns a new `BorderRadius<L>`.
|
||||
#[inline]
|
||||
|
|
|
@ -4,14 +4,12 @@
|
|||
|
||||
//! Generic types for CSS values related to effects.
|
||||
|
||||
use std::fmt::{self, Write};
|
||||
use style_traits::values::{CssWriter, SequenceWriter, ToCss};
|
||||
#[cfg(feature = "gecko")]
|
||||
use values::specified::url::SpecifiedUrl;
|
||||
|
||||
/// A generic value for a single `box-shadow`.
|
||||
#[derive(Animate, Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo,
|
||||
ToAnimatedValue, ToAnimatedZero)]
|
||||
ToAnimatedValue, ToAnimatedZero, ToCss)]
|
||||
pub struct BoxShadow<Color, SizeLength, BlurShapeLength, ShapeLength> {
|
||||
/// The base shadow.
|
||||
pub base: SimpleShadow<Color, SizeLength, BlurShapeLength>,
|
||||
|
@ -19,7 +17,7 @@ pub struct BoxShadow<Color, SizeLength, BlurShapeLength, ShapeLength> {
|
|||
pub spread: ShapeLength,
|
||||
/// Whether this is an inset box shadow.
|
||||
#[animation(constant)]
|
||||
#[value_info(represents_keyword)]
|
||||
#[css(represents_keyword)]
|
||||
pub inset: bool,
|
||||
}
|
||||
|
||||
|
@ -80,27 +78,3 @@ pub struct SimpleShadow<Color, SizeLength, ShapeLength> {
|
|||
/// Blur radius.
|
||||
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(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1947,11 +1947,11 @@ pub struct FontSynthesis {
|
|||
/// If a `font-weight` is requested that the font family does not contain,
|
||||
/// the user agent may synthesize the requested weight from the weights
|
||||
/// that do exist in the font family.
|
||||
#[value_info(represents_keyword)]
|
||||
#[css(represents_keyword)]
|
||||
pub weight: bool,
|
||||
/// 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.
|
||||
#[value_info(represents_keyword)]
|
||||
#[css(represents_keyword)]
|
||||
pub style: bool,
|
||||
}
|
||||
|
||||
|
|
|
@ -424,14 +424,14 @@ pub enum AutoFlow {
|
|||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, MallocSizeOf, PartialEq, SpecifiedValueInfo,
|
||||
ToComputedValue)]
|
||||
ToComputedValue, ToCss)]
|
||||
/// Controls how the auto-placement algorithm works
|
||||
/// specifying exactly how auto-placed items get flowed into the grid
|
||||
pub struct GridAutoFlow {
|
||||
/// Specifiy how auto-placement algorithm fills each `row` or `column` in turn
|
||||
pub autoflow: AutoFlow,
|
||||
/// Specify use `dense` packing algorithm or not
|
||||
#[value_info(represents_keyword)]
|
||||
#[css(represents_keyword)]
|
||||
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 {
|
||||
/// [ row | column ] || dense
|
||||
fn parse<'i, 't>(
|
||||
|
|
|
@ -140,13 +140,13 @@ fn derive_struct_fields<'a>(
|
|||
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()
|
||||
.expect("only named field should use represents_keyword");
|
||||
values.push(cg::to_css_identifier(ident.as_ref()));
|
||||
return None;
|
||||
}
|
||||
let css_attrs = cg::parse_field_attrs::<CssFieldAttrs>(field);
|
||||
if let Some(if_empty) = css_attrs.if_empty {
|
||||
values.push(if_empty);
|
||||
}
|
||||
|
@ -176,6 +176,5 @@ struct ValueInfoVariantAttrs {
|
|||
#[darling(attributes(value_info), default)]
|
||||
#[derive(Default, FromField)]
|
||||
struct ValueInfoFieldAttrs {
|
||||
represents_keyword: bool,
|
||||
other_values: Option<String>,
|
||||
}
|
||||
|
|
|
@ -189,6 +189,15 @@ fn derive_single_field_expr(
|
|||
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 {
|
||||
if attrs.field_bound {
|
||||
let ty = &field.ast().ty;
|
||||
|
@ -236,5 +245,6 @@ pub struct CssFieldAttrs {
|
|||
pub field_bound: bool,
|
||||
pub iterable: bool,
|
||||
pub skip: bool,
|
||||
pub represents_keyword: bool,
|
||||
pub skip_if: Option<Path>,
|
||||
}
|
||||
|
|
|
@ -56,8 +56,6 @@ pub type KeywordsCollectFn<'a> = &'a mut FnMut(&[&'static str]);
|
|||
/// * `#[value_info(starts_with_keyword)]` can be used on variants to
|
||||
/// add the name of a non-unit variant (serialized like `ToCss`) into
|
||||
/// `collect_completion_keywords`.
|
||||
/// * `#[value_info(represents_keyword)]` can be used on fields into
|
||||
/// `collect_completion_keywords`.
|
||||
pub trait SpecifiedValueInfo {
|
||||
/// Supported CssTypes by the given value type.
|
||||
///
|
||||
|
|
|
@ -37,6 +37,9 @@ use std::fmt::{self, Write};
|
|||
/// * 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
|
||||
/// 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
|
||||
/// implement `Debug` by a single call to `ToCss::to_css`.
|
||||
pub trait ToCss {
|
||||
|
|
Загрузка…
Ссылка в новой задаче