diff --git a/components/style/gecko/mod.rs b/components/style/gecko/mod.rs index 625fa77bbfd3..2ee19fc60fc0 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 b9c109f31875..ef0ec883d3d2 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 53fec86f50e7..efed114f6577 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(&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) -> Result { - 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 {