Skip to content

Commit

Permalink
Replace non_ts_pseudo_class_list include hack with higher order macro
Browse files Browse the repository at this point in the history
MozReview-Commit-ID: IBGhult0Ujv
  • Loading branch information
Manishearth committed Mar 15, 2017
1 parent 1caf8a7 commit c4f5f46
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 32 deletions.
3 changes: 3 additions & 0 deletions components/style/gecko/mod.rs
Expand Up @@ -4,6 +4,9 @@

//! Gecko-specific style-system bits.

#[macro_use]
mod non_ts_pseudo_class_list;

pub mod arc_types;
pub mod conversions;
pub mod data;
Expand Down
43 changes: 23 additions & 20 deletions components/style/gecko/non_ts_pseudo_class_list.rs
Expand Up @@ -6,21 +6,20 @@
* This file contains a helper macro includes all supported non-tree-structural
* pseudo-classes.
*
* This file is NOT INTENDED to be compiled as a standalone module.
*
* FIXME: Find a way to autogenerate this file.
*
* Expected usage is as follows:
* ```
* 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),
* )* ) => {
* // Do stuff.
* }
* }
* include!("non_ts_pseudo_class_list.rs")
* apply_non_ts_list!(use_pseudo_class_list)
* }
* ```
*
Expand All @@ -30,21 +29,25 @@
* see selector_parser.rs for more details.
*/

pseudo_class_list! {
("any-link", AnyLink, anyLink, _, _),
("link", Link, link, _, _),
("visited", Visited, visited, _, _),
("active", Active, active, IN_ACTIVE_STATE, _),
("focus", Focus, focus, IN_FOCUS_STATE, _),
("fullscreen", Fullscreen, fullscreen, IN_FULLSCREEN_STATE, _),
("hover", Hover, hover, IN_HOVER_STATE, _),
("enabled", Enabled, enabled, IN_ENABLED_STATE, _),
("disabled", Disabled, disabled, IN_DISABLED_STATE, _),
("checked", Checked, checked, IN_CHECKED_STATE, _),
("indeterminate", Indeterminate, indeterminate, IN_INDETERMINATE_STATE, _),
("read-write", ReadWrite, _, IN_READ_WRITE_STATE, _),
("read-only", ReadOnly, _, IN_READ_WRITE_STATE, _),
macro_rules! apply_non_ts_list {
($apply_macro:ident) => {
$apply_macro! {
("any-link", AnyLink, anyLink, _, _),
("link", Link, link, _, _),
("visited", Visited, visited, _, _),
("active", Active, active, IN_ACTIVE_STATE, _),
("focus", Focus, focus, IN_FOCUS_STATE, _),
("fullscreen", Fullscreen, fullscreen, IN_FULLSCREEN_STATE, _),
("hover", Hover, hover, IN_HOVER_STATE, _),
("enabled", Enabled, enabled, IN_ENABLED_STATE, _),
("disabled", Disabled, disabled, IN_DISABLED_STATE, _),
("checked", Checked, checked, IN_CHECKED_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-table-border-nonzero", MozTableBorderNonzero, mozTableBorderNonzero, _, PSEUDO_CLASS_INTERNAL),
("-moz-browser-frame", MozBrowserFrame, mozBrowserFrame, _, PSEUDO_CLASS_INTERNAL),
("-moz-table-border-nonzero", MozTableBorderNonzero, mozTableBorderNonzero, _, PSEUDO_CLASS_INTERNAL),
}
}
}
24 changes: 12 additions & 12 deletions components/style/gecko/selector_parser.rs
Expand Up @@ -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),)*) => {
#[doc = "Our representation of a non tree-structural pseudo-class."]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
Expand All @@ -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 {
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),)*) => {
match *self {
$(NonTSPseudoClass::$name => concat!(":", $css),)*
}
}
}
dest.write_str(include!("non_ts_pseudo_class_list.rs"))
dest.write_str(apply_non_ts_list!(pseudo_class_serialize))
}
}

Expand All @@ -173,14 +173,14 @@ impl NonTSPseudoClass {
(_) => (false);
($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),)*) => {
match *self {
$(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.
Expand All @@ -189,14 +189,14 @@ impl NonTSPseudoClass {
(_) => (ElementState::empty());
($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),)*) => {
match *self {
$(NonTSPseudoClass::$name => flag!($state),)*
}
}
}
include!("non_ts_pseudo_class_list.rs")
apply_non_ts_list!(pseudo_class_state)
}

/// Convert NonTSPseudoClass to Gecko's CSSPseudoClassType.
Expand All @@ -206,14 +206,14 @@ impl NonTSPseudoClass {
($gecko_type:ident) =>
(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),)*) => {
match *self {
$(NonTSPseudoClass::$name => gecko_type!($gecko_type),)*
}
}
}
include!("non_ts_pseudo_class_list.rs")
apply_non_ts_list!(pseudo_class_geckotype)
}
}

Expand Down Expand Up @@ -248,15 +248,15 @@ impl<'a> ::selectors::Parser for SelectorParser<'a> {
type Impl = SelectorImpl;

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),)*) => {
match_ignore_ascii_case! { &name,
$($css => NonTSPseudoClass::$name,)*
_ => return Err(())
}
}
}
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() {
Ok(pseudo_class)
} else {
Expand Down

0 comments on commit c4f5f46

Please sign in to comment.