Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace non_ts_pseudo_class_list include hack with higher order macro #15971

Merged
merged 1 commit into from Mar 16, 2017
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -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;
@@ -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)
* }
* ```
*
@@ -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),
}
}
}
@@ -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)]
@@ -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))
}
}

@@ -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.
@@ -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.
@@ -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)
}
}

@@ -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 {
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.