diff --git a/components/style/parser.rs b/components/style/parser.rs index 1b7c65e2559..6dbfe1cfa01 100644 --- a/components/style/parser.rs +++ b/components/style/parser.rs @@ -157,12 +157,12 @@ impl<'a> ParserContext<'a> { /// /// The derive code understands the following attributes on each of the variants: /// -/// * `#[css(aliases = "foo,bar")]` can be used to alias a value with another +/// * `#[parse(aliases = "foo,bar")]` can be used to alias a value with another /// at parse-time. /// -/// * `#[css(parse_condition = "function")]` can be used to make the parsing of -/// the value conditional on `function`, which will be invoked with a -/// `&ParserContext` reference. +/// * `#[parse(condition = "function")]` can be used to make the parsing of the +/// value conditional on `function`, which needs to fulfill +/// `fn(&ParserContext) -> bool`. pub trait Parse: Sized { /// Parse a value of this type. /// diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index d266d3e27ac..11a1283f1cc 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -594,7 +594,7 @@ aliases.append(alias) %> % if aliases: - #[css(aliases = "${','.join(aliases)}")] + #[parse(aliases = "${','.join(aliases)}")] % endif % endif ${to_camel_case(variant)}, diff --git a/components/style/values/specified/box.rs b/components/style/values/specified/box.rs index 020c8112ad1..1f56583575c 100644 --- a/components/style/values/specified/box.rs +++ b/components/style/values/specified/box.rs @@ -53,9 +53,9 @@ pub enum Display { TableCaption, ListItem, None, - #[css(aliases = "-webkit-flex")] + #[parse(aliases = "-webkit-flex")] Flex, - #[css(aliases = "-webkit-inline-flex")] + #[parse(aliases = "-webkit-inline-flex")] InlineFlex, #[cfg(feature = "gecko")] Grid, @@ -84,31 +84,31 @@ pub enum Display { #[cfg(feature = "gecko")] MozInlineBox, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozGrid, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozInlineGrid, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozGridGroup, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozGridLine, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozStack, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozInlineStack, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozDeck, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozPopup, #[cfg(feature = "gecko")] - #[css(parse_condition = "moz_display_values_enabled")] + #[parse(condition = "moz_display_values_enabled")] MozGroupbox, } diff --git a/components/style_derive/lib.rs b/components/style_derive/lib.rs index 88f0bbadfb1..8c8c0705e8f 100644 --- a/components/style_derive/lib.rs +++ b/components/style_derive/lib.rs @@ -40,7 +40,7 @@ pub fn derive_to_animated_value(stream: TokenStream) -> TokenStream { to_animated_value::derive(input).into() } -#[proc_macro_derive(Parse, attributes(css))] +#[proc_macro_derive(Parse, attributes(css, parse))] pub fn derive_parse(stream: TokenStream) -> TokenStream { let input = syn::parse(stream).unwrap(); parse::derive(input).into() @@ -64,7 +64,7 @@ pub fn derive_to_css(stream: TokenStream) -> TokenStream { to_css::derive(input).into() } -#[proc_macro_derive(SpecifiedValueInfo, attributes(css, value_info))] +#[proc_macro_derive(SpecifiedValueInfo, attributes(css, parse, value_info))] pub fn derive_specified_value_info(stream: TokenStream) -> TokenStream { let input = syn::parse(stream).unwrap(); specified_value_info::derive(input).into() diff --git a/components/style_derive/parse.rs b/components/style_derive/parse.rs index 8b9044fb495..13d8aa6f48b 100644 --- a/components/style_derive/parse.rs +++ b/components/style_derive/parse.rs @@ -4,10 +4,17 @@ use cg; use quote::Tokens; -use syn::DeriveInput; +use syn::{DeriveInput, Path}; use synstructure; use to_css::CssVariantAttrs; +#[darling(attributes(parse), default)] +#[derive(Default, FromVariant)] +pub struct ParseVariantAttrs { + pub aliases: Option, + pub condition: Option, +} + pub fn derive(input: DeriveInput) -> Tokens { let name = &input.ident; let s = synstructure::Structure::new(&input); @@ -20,18 +27,21 @@ pub fn derive(input: DeriveInput) -> Tokens { "Parse is only supported for single-variant enums for now" ); - let variant_attrs = cg::parse_variant_attrs_from_ast::(&variant.ast()); - if variant_attrs.skip { + let css_variant_attrs = + cg::parse_variant_attrs_from_ast::(&variant.ast()); + let parse_attrs = + cg::parse_variant_attrs_from_ast::(&variant.ast()); + if css_variant_attrs.skip { return match_body; } let identifier = cg::to_css_identifier( - &variant_attrs.keyword.unwrap_or(variant.ast().ident.as_ref().into()), + &css_variant_attrs.keyword.unwrap_or(variant.ast().ident.as_ref().into()), ); let ident = &variant.ast().ident; - saw_condition |= variant_attrs.parse_condition.is_some(); - let condition = match variant_attrs.parse_condition { + saw_condition |= parse_attrs.condition.is_some(); + let condition = match parse_attrs.condition { Some(ref p) => quote! { if #p(context) }, None => quote! { }, }; @@ -41,7 +51,7 @@ pub fn derive(input: DeriveInput) -> Tokens { #identifier #condition => Ok(#name::#ident), }; - let aliases = match variant_attrs.aliases { + let aliases = match parse_attrs.aliases { Some(aliases) => aliases, None => return body, }; diff --git a/components/style_derive/specified_value_info.rs b/components/style_derive/specified_value_info.rs index 7aae081641d..37471b041a8 100644 --- a/components/style_derive/specified_value_info.rs +++ b/components/style_derive/specified_value_info.rs @@ -6,6 +6,7 @@ use cg; use quote::Tokens; use syn::{Data, DeriveInput, Fields, Ident, Type}; use to_css::{CssFieldAttrs, CssInputAttrs, CssVariantAttrs}; +use parse::ParseVariantAttrs; pub fn derive(mut input: DeriveInput) -> Tokens { let css_attrs = cg::parse_input_attrs::(&input); @@ -33,10 +34,11 @@ pub fn derive(mut input: DeriveInput) -> Tokens { for v in e.variants.iter() { let css_attrs = cg::parse_variant_attrs::(&v); let info_attrs = cg::parse_variant_attrs::(&v); + let parse_attrs = cg::parse_variant_attrs::(&v); if css_attrs.skip { continue; } - if let Some(aliases) = css_attrs.aliases { + if let Some(aliases) = parse_attrs.aliases { for alias in aliases.split(",") { values.push(alias.to_string()); } diff --git a/components/style_derive/to_css.rs b/components/style_derive/to_css.rs index 4853f41ee53..471cf37b6de 100644 --- a/components/style_derive/to_css.rs +++ b/components/style_derive/to_css.rs @@ -234,8 +234,6 @@ pub struct CssVariantAttrs { pub comma: bool, pub dimension: bool, pub keyword: Option, - pub aliases: Option, - pub parse_condition: Option, pub skip: bool, } diff --git a/components/style_traits/specified_value_info.rs b/components/style_traits/specified_value_info.rs index d9f4578b1a8..e0dd5544d0a 100644 --- a/components/style_traits/specified_value_info.rs +++ b/components/style_traits/specified_value_info.rs @@ -43,7 +43,7 @@ pub type KeywordsCollectFn<'a> = &'a mut FnMut(&[&'static str]); /// name is listed in `collect_completion_keywords`. /// * If `#[css(skip)]` is found, the content inside the variant or /// field is ignored. -/// * Values listed in `#[css(if_empty)]`, `#[css(aliases)]`, and +/// * Values listed in `#[css(if_empty)]`, `#[parse(aliases)]`, and /// `#[css(keyword)]` are added into `collect_completion_keywords`. /// /// In addition to `css` attributes, it also has `value_info` helper