aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-03-15 16:55:43 -0700
committerGitHub <noreply@github.com>2017-03-15 16:55:43 -0700
commitd30978246162e8a9bfad42b43ab6a05c90421c6e (patch)
tree7ab7ec2f7df9fb3b34d4d2bb8bce6bba54accc39
parent1caf8a71dcdb9d749ad2d2c9d82fe0d913d7e17c (diff)
parentc4f5f469b831111e3ab70dc46be8a981784569fb (diff)
downloadservo-d30978246162e8a9bfad42b43ab6a05c90421c6e.tar.gz
servo-d30978246162e8a9bfad42b43ab6a05c90421c6e.zip
Auto merge of #15971 - Manishearth:nonts, r=nox
Replace non_ts_pseudo_class_list include hack with higher order macro Cleaner, and easier to work with. We may need to expand the functionality to support integer and string pseudo classes like -moz-system-metric <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/15971) <!-- Reviewable:end -->
-rw-r--r--components/style/gecko/mod.rs3
-rw-r--r--components/style/gecko/non_ts_pseudo_class_list.rs43
-rw-r--r--components/style/gecko/selector_parser.rs24
3 files changed, 38 insertions, 32 deletions
diff --git a/components/style/gecko/mod.rs b/components/style/gecko/mod.rs
index 625fa77bbfd..2ee19fc60fc 100644
--- a/components/style/gecko/mod.rs
+++ b/components/style/gecko/mod.rs
@@ -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;
diff --git a/components/style/gecko/non_ts_pseudo_class_list.rs b/components/style/gecko/non_ts_pseudo_class_list.rs
index b9c109f3187..ef0ec883d3d 100644
--- a/components/style/gecko/non_ts_pseudo_class_list.rs
+++ b/components/style/gecko/non_ts_pseudo_class_list.rs
@@ -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),
+ }
+ }
}
diff --git a/components/style/gecko/selector_parser.rs b/components/style/gecko/selector_parser.rs
index 53fec86f50e..efed114f657 100644
--- a/components/style/gecko/selector_parser.rs
+++ b/components/style/gecko/selector_parser.rs
@@ -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,7 +248,7 @@ 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,)*
@@ -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() {
Ok(pseudo_class)
} else {