mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
Replace non_ts_pseudo_class_list include hack with higher order macro
MozReview-Commit-ID: IBGhult0Ujv
This commit is contained in:
parent
1caf8a71dc
commit
c4f5f469b8
3 changed files with 38 additions and 32 deletions
|
@ -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;
|
||||||
|
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue