Replace non_ts_pseudo_class_list include hack with higher order macro

MozReview-Commit-ID: IBGhult0Ujv
This commit is contained in:
Manish Goregaokar 2017-03-15 14:49:35 -07:00 committed by Manish Goregaokar
parent 1caf8a71dc
commit c4f5f469b8
3 changed files with 38 additions and 32 deletions

View file

@ -4,6 +4,9 @@
//! Gecko-specific style-system bits. //! Gecko-specific style-system bits.
#[macro_use]
mod non_ts_pseudo_class_list;
pub mod arc_types; pub mod arc_types;
pub mod conversions; pub mod conversions;
pub mod data; pub mod data;

View file

@ -6,21 +6,20 @@
* This file contains a helper macro includes all supported non-tree-structural * This file contains a helper macro includes all supported non-tree-structural
* pseudo-classes. * pseudo-classes.
* *
* This file is NOT INTENDED to be compiled as a standalone module.
*
* FIXME: Find a way to autogenerate this file. * FIXME: Find a way to autogenerate this file.
* *
* Expected usage is as follows: * Expected usage is as follows:
* ``` * ```
* fn use_pseudo_class() { * fn use_pseudo_class() {
* macro_rules! pseudo_class_list { * macro_rules! use_pseudo_class_list {
* ( $( * ( $(
* ($css:expr, $name:ident, $gecko_type:tt, $state:tt, $flags:tt), * ($css:expr, $name:ident, $gecko_type:tt, $state:tt, $flags:tt),
* )* ) => { * )* ) => {
* // Do stuff. * // Do stuff.
* } * }
* } * }
* include!("non_ts_pseudo_class_list.rs") * apply_non_ts_list!(use_pseudo_class_list)
* } * }
* ``` * ```
* *
@ -30,21 +29,25 @@
* see selector_parser.rs for more details. * see selector_parser.rs for more details.
*/ */
pseudo_class_list! { macro_rules! apply_non_ts_list {
("any-link", AnyLink, anyLink, _, _), ($apply_macro:ident) => {
("link", Link, link, _, _), $apply_macro! {
("visited", Visited, visited, _, _), ("any-link", AnyLink, anyLink, _, _),
("active", Active, active, IN_ACTIVE_STATE, _), ("link", Link, link, _, _),
("focus", Focus, focus, IN_FOCUS_STATE, _), ("visited", Visited, visited, _, _),
("fullscreen", Fullscreen, fullscreen, IN_FULLSCREEN_STATE, _), ("active", Active, active, IN_ACTIVE_STATE, _),
("hover", Hover, hover, IN_HOVER_STATE, _), ("focus", Focus, focus, IN_FOCUS_STATE, _),
("enabled", Enabled, enabled, IN_ENABLED_STATE, _), ("fullscreen", Fullscreen, fullscreen, IN_FULLSCREEN_STATE, _),
("disabled", Disabled, disabled, IN_DISABLED_STATE, _), ("hover", Hover, hover, IN_HOVER_STATE, _),
("checked", Checked, checked, IN_CHECKED_STATE, _), ("enabled", Enabled, enabled, IN_ENABLED_STATE, _),
("indeterminate", Indeterminate, indeterminate, IN_INDETERMINATE_STATE, _), ("disabled", Disabled, disabled, IN_DISABLED_STATE, _),
("read-write", ReadWrite, _, IN_READ_WRITE_STATE, _), ("checked", Checked, checked, IN_CHECKED_STATE, _),
("read-only", ReadOnly, _, IN_READ_WRITE_STATE, _), ("indeterminate", Indeterminate, indeterminate, IN_INDETERMINATE_STATE, _),
("read-write", ReadWrite, _, IN_READ_WRITE_STATE, _),
("read-only", ReadOnly, _, IN_READ_WRITE_STATE, _),
("-moz-browser-frame", MozBrowserFrame, mozBrowserFrame, _, PSEUDO_CLASS_INTERNAL), ("-moz-browser-frame", MozBrowserFrame, mozBrowserFrame, _, PSEUDO_CLASS_INTERNAL),
("-moz-table-border-nonzero", MozTableBorderNonzero, mozTableBorderNonzero, _, PSEUDO_CLASS_INTERNAL), ("-moz-table-border-nonzero", MozTableBorderNonzero, mozTableBorderNonzero, _, PSEUDO_CLASS_INTERNAL),
}
}
} }

View file

@ -138,7 +138,7 @@ bitflags! {
} }
} }
macro_rules! pseudo_class_list { macro_rules! pseudo_class_name {
($(($css:expr, $name:ident, $_gecko_type:tt, $_state:tt, $_flags:tt),)*) => { ($(($css:expr, $name:ident, $_gecko_type:tt, $_state:tt, $_flags:tt),)*) => {
#[doc = "Our representation of a non tree-structural pseudo-class."] #[doc = "Our representation of a non tree-structural pseudo-class."]
#[derive(Clone, Debug, PartialEq, Eq, Hash)] #[derive(Clone, Debug, PartialEq, Eq, Hash)]
@ -150,18 +150,18 @@ macro_rules! pseudo_class_list {
} }
} }
} }
include!("non_ts_pseudo_class_list.rs"); apply_non_ts_list!(pseudo_class_name);
impl ToCss for NonTSPseudoClass { impl ToCss for NonTSPseudoClass {
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
macro_rules! pseudo_class_list { macro_rules! pseudo_class_serialize {
($(($css:expr, $name:ident, $_gecko_type:tt, $_state:tt, $_flags:tt),)*) => { ($(($css:expr, $name:ident, $_gecko_type:tt, $_state:tt, $_flags:tt),)*) => {
match *self { match *self {
$(NonTSPseudoClass::$name => concat!(":", $css),)* $(NonTSPseudoClass::$name => concat!(":", $css),)*
} }
} }
} }
dest.write_str(include!("non_ts_pseudo_class_list.rs")) dest.write_str(apply_non_ts_list!(pseudo_class_serialize))
} }
} }
@ -173,14 +173,14 @@ impl NonTSPseudoClass {
(_) => (false); (_) => (false);
($flags:expr) => ($flags.contains(PSEUDO_CLASS_INTERNAL)); ($flags:expr) => ($flags.contains(PSEUDO_CLASS_INTERNAL));
} }
macro_rules! pseudo_class_list { macro_rules! pseudo_class_check_internal {
($(($_css:expr, $name:ident, $_gecko_type:tt, $_state:tt, $flags:tt),)*) => { ($(($_css:expr, $name:ident, $_gecko_type:tt, $_state:tt, $flags:tt),)*) => {
match *self { match *self {
$(NonTSPseudoClass::$name => check_flag!($flags),)* $(NonTSPseudoClass::$name => check_flag!($flags),)*
} }
} }
} }
include!("non_ts_pseudo_class_list.rs") apply_non_ts_list!(pseudo_class_check_internal)
} }
/// Get the state flag associated with a pseudo-class, if any. /// Get the state flag associated with a pseudo-class, if any.
@ -189,14 +189,14 @@ impl NonTSPseudoClass {
(_) => (ElementState::empty()); (_) => (ElementState::empty());
($state:ident) => (::element_state::$state); ($state:ident) => (::element_state::$state);
} }
macro_rules! pseudo_class_list { macro_rules! pseudo_class_state {
($(($_css:expr, $name:ident, $_gecko_type:tt, $state:tt, $_flags:tt),)*) => { ($(($_css:expr, $name:ident, $_gecko_type:tt, $state:tt, $_flags:tt),)*) => {
match *self { match *self {
$(NonTSPseudoClass::$name => flag!($state),)* $(NonTSPseudoClass::$name => flag!($state),)*
} }
} }
} }
include!("non_ts_pseudo_class_list.rs") apply_non_ts_list!(pseudo_class_state)
} }
/// Convert NonTSPseudoClass to Gecko's CSSPseudoClassType. /// Convert NonTSPseudoClass to Gecko's CSSPseudoClassType.
@ -206,14 +206,14 @@ impl NonTSPseudoClass {
($gecko_type:ident) => ($gecko_type:ident) =>
(Some(::gecko_bindings::structs::CSSPseudoClassType::$gecko_type)); (Some(::gecko_bindings::structs::CSSPseudoClassType::$gecko_type));
} }
macro_rules! pseudo_class_list { macro_rules! pseudo_class_geckotype {
($(($_css:expr, $name:ident, $gecko_type:tt, $_state:tt, $_flags:tt),)*) => { ($(($_css:expr, $name:ident, $gecko_type:tt, $_state:tt, $_flags:tt),)*) => {
match *self { match *self {
$(NonTSPseudoClass::$name => gecko_type!($gecko_type),)* $(NonTSPseudoClass::$name => gecko_type!($gecko_type),)*
} }
} }
} }
include!("non_ts_pseudo_class_list.rs") apply_non_ts_list!(pseudo_class_geckotype)
} }
} }
@ -248,7 +248,7 @@ impl<'a> ::selectors::Parser for SelectorParser<'a> {
type Impl = SelectorImpl; type Impl = SelectorImpl;
fn parse_non_ts_pseudo_class(&self, name: Cow<str>) -> Result<NonTSPseudoClass, ()> { fn parse_non_ts_pseudo_class(&self, name: Cow<str>) -> Result<NonTSPseudoClass, ()> {
macro_rules! pseudo_class_list { macro_rules! pseudo_class_parse {
($(($css:expr, $name:ident, $_gecko_type:tt, $_state:tt, $_flags:tt),)*) => { ($(($css:expr, $name:ident, $_gecko_type:tt, $_state:tt, $_flags:tt),)*) => {
match_ignore_ascii_case! { &name, match_ignore_ascii_case! { &name,
$($css => NonTSPseudoClass::$name,)* $($css => NonTSPseudoClass::$name,)*
@ -256,7 +256,7 @@ impl<'a> ::selectors::Parser for SelectorParser<'a> {
} }
} }
} }
let pseudo_class = include!("non_ts_pseudo_class_list.rs"); let pseudo_class = apply_non_ts_list!(pseudo_class_parse);
if !pseudo_class.is_internal() || self.in_user_agent_stylesheet() { if !pseudo_class.is_internal() || self.in_user_agent_stylesheet() {
Ok(pseudo_class) Ok(pseudo_class)
} else { } else {