mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
Auto merge of #17999 - emilio:pseudo-enumerated-array, r=heycam
style: Use an enumerated array for per-pseudo maps. <!-- 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/17999) <!-- Reviewable:end -->
This commit is contained in:
commit
b6d46789f8
6 changed files with 294 additions and 155 deletions
|
@ -175,9 +175,14 @@ pub enum PseudoElement {
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
/// The number of eager pseudo-elements.
|
||||
pub const EAGER_PSEUDO_COUNT: usize = 4;
|
||||
|
||||
/// The number of non-functional pseudo-elements.
|
||||
pub const SIMPLE_PSEUDO_COUNT: usize = 71;
|
||||
|
||||
/// The list of eager pseudos.
|
||||
pub const EAGER_PSEUDOS: [PseudoElement; EAGER_PSEUDO_COUNT] = [
|
||||
PseudoElement::Before,
|
||||
|
@ -188,88 +193,7 @@ pub const EAGER_PSEUDOS: [PseudoElement; EAGER_PSEUDO_COUNT] = [
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
impl PseudoElement {
|
||||
/// Executes a closure with each simple (not functional)
|
||||
/// pseudo-element as an argument.
|
||||
pub fn each_simple<F>(mut fun: F)
|
||||
where F: FnMut(Self),
|
||||
{
|
||||
fun(PseudoElement::After);
|
||||
fun(PseudoElement::Before);
|
||||
fun(PseudoElement::Backdrop);
|
||||
fun(PseudoElement::Cue);
|
||||
fun(PseudoElement::FirstLetter);
|
||||
fun(PseudoElement::FirstLine);
|
||||
fun(PseudoElement::MozSelection);
|
||||
fun(PseudoElement::MozFocusInner);
|
||||
fun(PseudoElement::MozFocusOuter);
|
||||
fun(PseudoElement::MozListBullet);
|
||||
fun(PseudoElement::MozListNumber);
|
||||
fun(PseudoElement::MozMathAnonymous);
|
||||
fun(PseudoElement::MozNumberWrapper);
|
||||
fun(PseudoElement::MozNumberText);
|
||||
fun(PseudoElement::MozNumberSpinBox);
|
||||
fun(PseudoElement::MozNumberSpinUp);
|
||||
fun(PseudoElement::MozNumberSpinDown);
|
||||
fun(PseudoElement::MozProgressBar);
|
||||
fun(PseudoElement::MozRangeTrack);
|
||||
fun(PseudoElement::MozRangeProgress);
|
||||
fun(PseudoElement::MozRangeThumb);
|
||||
fun(PseudoElement::MozMeterBar);
|
||||
fun(PseudoElement::MozPlaceholder);
|
||||
fun(PseudoElement::Placeholder);
|
||||
fun(PseudoElement::MozColorSwatch);
|
||||
fun(PseudoElement::MozText);
|
||||
fun(PseudoElement::OofPlaceholder);
|
||||
fun(PseudoElement::FirstLetterContinuation);
|
||||
fun(PseudoElement::MozBlockInsideInlineWrapper);
|
||||
fun(PseudoElement::MozMathMLAnonymousBlock);
|
||||
fun(PseudoElement::MozXULAnonymousBlock);
|
||||
fun(PseudoElement::HorizontalFramesetBorder);
|
||||
fun(PseudoElement::VerticalFramesetBorder);
|
||||
fun(PseudoElement::MozLineFrame);
|
||||
fun(PseudoElement::ButtonContent);
|
||||
fun(PseudoElement::CellContent);
|
||||
fun(PseudoElement::DropDownList);
|
||||
fun(PseudoElement::FieldsetContent);
|
||||
fun(PseudoElement::FramesetBlank);
|
||||
fun(PseudoElement::MozDisplayComboboxControlFrame);
|
||||
fun(PseudoElement::HtmlCanvasContent);
|
||||
fun(PseudoElement::InlineTable);
|
||||
fun(PseudoElement::Table);
|
||||
fun(PseudoElement::TableCell);
|
||||
fun(PseudoElement::TableColGroup);
|
||||
fun(PseudoElement::TableCol);
|
||||
fun(PseudoElement::TableWrapper);
|
||||
fun(PseudoElement::TableRowGroup);
|
||||
fun(PseudoElement::TableRow);
|
||||
fun(PseudoElement::Canvas);
|
||||
fun(PseudoElement::PageBreak);
|
||||
fun(PseudoElement::Page);
|
||||
fun(PseudoElement::PageContent);
|
||||
fun(PseudoElement::PageSequence);
|
||||
fun(PseudoElement::ScrolledContent);
|
||||
fun(PseudoElement::ScrolledCanvas);
|
||||
fun(PseudoElement::ScrolledPageSequence);
|
||||
fun(PseudoElement::ColumnContent);
|
||||
fun(PseudoElement::Viewport);
|
||||
fun(PseudoElement::ViewportScroll);
|
||||
fun(PseudoElement::AnonymousFlexItem);
|
||||
fun(PseudoElement::AnonymousGridItem);
|
||||
fun(PseudoElement::Ruby);
|
||||
fun(PseudoElement::RubyBase);
|
||||
fun(PseudoElement::RubyBaseContainer);
|
||||
fun(PseudoElement::RubyText);
|
||||
fun(PseudoElement::RubyTextContainer);
|
||||
fun(PseudoElement::MozSVGMarkerAnonChild);
|
||||
fun(PseudoElement::MozSVGOuterSVGAnonChild);
|
||||
fun(PseudoElement::MozSVGForeignContent);
|
||||
fun(PseudoElement::MozSVGText);
|
||||
}
|
||||
|
||||
/// Get the pseudo-element as an atom.
|
||||
#[inline]
|
||||
pub fn atom(&self) -> Atom {
|
||||
|
@ -360,6 +284,165 @@ impl PseudoElement {
|
|||
}
|
||||
}
|
||||
|
||||
/// Returns an index if the pseudo-element is a simple (non-functional)
|
||||
/// pseudo.
|
||||
#[inline]
|
||||
pub fn simple_index(&self) -> Option<usize> {
|
||||
match *self {
|
||||
PseudoElement::After => Some(0),
|
||||
PseudoElement::Before => Some(1),
|
||||
PseudoElement::Backdrop => Some(2),
|
||||
PseudoElement::Cue => Some(3),
|
||||
PseudoElement::FirstLetter => Some(4),
|
||||
PseudoElement::FirstLine => Some(5),
|
||||
PseudoElement::MozSelection => Some(6),
|
||||
PseudoElement::MozFocusInner => Some(7),
|
||||
PseudoElement::MozFocusOuter => Some(8),
|
||||
PseudoElement::MozListBullet => Some(9),
|
||||
PseudoElement::MozListNumber => Some(10),
|
||||
PseudoElement::MozMathAnonymous => Some(11),
|
||||
PseudoElement::MozNumberWrapper => Some(12),
|
||||
PseudoElement::MozNumberText => Some(13),
|
||||
PseudoElement::MozNumberSpinBox => Some(14),
|
||||
PseudoElement::MozNumberSpinUp => Some(15),
|
||||
PseudoElement::MozNumberSpinDown => Some(16),
|
||||
PseudoElement::MozProgressBar => Some(17),
|
||||
PseudoElement::MozRangeTrack => Some(18),
|
||||
PseudoElement::MozRangeProgress => Some(19),
|
||||
PseudoElement::MozRangeThumb => Some(20),
|
||||
PseudoElement::MozMeterBar => Some(21),
|
||||
PseudoElement::MozPlaceholder => Some(22),
|
||||
PseudoElement::Placeholder => Some(23),
|
||||
PseudoElement::MozColorSwatch => Some(24),
|
||||
PseudoElement::MozText => Some(25),
|
||||
PseudoElement::OofPlaceholder => Some(26),
|
||||
PseudoElement::FirstLetterContinuation => Some(27),
|
||||
PseudoElement::MozBlockInsideInlineWrapper => Some(28),
|
||||
PseudoElement::MozMathMLAnonymousBlock => Some(29),
|
||||
PseudoElement::MozXULAnonymousBlock => Some(30),
|
||||
PseudoElement::HorizontalFramesetBorder => Some(31),
|
||||
PseudoElement::VerticalFramesetBorder => Some(32),
|
||||
PseudoElement::MozLineFrame => Some(33),
|
||||
PseudoElement::ButtonContent => Some(34),
|
||||
PseudoElement::CellContent => Some(35),
|
||||
PseudoElement::DropDownList => Some(36),
|
||||
PseudoElement::FieldsetContent => Some(37),
|
||||
PseudoElement::FramesetBlank => Some(38),
|
||||
PseudoElement::MozDisplayComboboxControlFrame => Some(39),
|
||||
PseudoElement::HtmlCanvasContent => Some(40),
|
||||
PseudoElement::InlineTable => Some(41),
|
||||
PseudoElement::Table => Some(42),
|
||||
PseudoElement::TableCell => Some(43),
|
||||
PseudoElement::TableColGroup => Some(44),
|
||||
PseudoElement::TableCol => Some(45),
|
||||
PseudoElement::TableWrapper => Some(46),
|
||||
PseudoElement::TableRowGroup => Some(47),
|
||||
PseudoElement::TableRow => Some(48),
|
||||
PseudoElement::Canvas => Some(49),
|
||||
PseudoElement::PageBreak => Some(50),
|
||||
PseudoElement::Page => Some(51),
|
||||
PseudoElement::PageContent => Some(52),
|
||||
PseudoElement::PageSequence => Some(53),
|
||||
PseudoElement::ScrolledContent => Some(54),
|
||||
PseudoElement::ScrolledCanvas => Some(55),
|
||||
PseudoElement::ScrolledPageSequence => Some(56),
|
||||
PseudoElement::ColumnContent => Some(57),
|
||||
PseudoElement::Viewport => Some(58),
|
||||
PseudoElement::ViewportScroll => Some(59),
|
||||
PseudoElement::AnonymousFlexItem => Some(60),
|
||||
PseudoElement::AnonymousGridItem => Some(61),
|
||||
PseudoElement::Ruby => Some(62),
|
||||
PseudoElement::RubyBase => Some(63),
|
||||
PseudoElement::RubyBaseContainer => Some(64),
|
||||
PseudoElement::RubyText => Some(65),
|
||||
PseudoElement::RubyTextContainer => Some(66),
|
||||
PseudoElement::MozSVGMarkerAnonChild => Some(67),
|
||||
PseudoElement::MozSVGOuterSVGAnonChild => Some(68),
|
||||
PseudoElement::MozSVGForeignContent => Some(69),
|
||||
PseudoElement::MozSVGText => Some(70),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns an array of `None` values.
|
||||
///
|
||||
/// FIXME(emilio): Integer generics can't come soon enough.
|
||||
pub fn simple_pseudo_none_array<T>() -> [Option<T>; SIMPLE_PSEUDO_COUNT] {
|
||||
[
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None
|
||||
]
|
||||
}
|
||||
|
||||
/// Whether this pseudo-element is an anonymous box.
|
||||
#[inline]
|
||||
pub fn is_anon_box(&self) -> bool {
|
||||
|
|
|
@ -16,10 +16,15 @@ pub enum PseudoElement {
|
|||
}
|
||||
|
||||
<% EAGER_PSEUDOS = ["Before", "After", "FirstLine", "FirstLetter"] %>
|
||||
<% TREE_PSEUDOS = [pseudo for pseudo in PSEUDOS if pseudo.is_tree_pseudo_element()] %>
|
||||
<% SIMPLE_PSEUDOS = [pseudo for pseudo in PSEUDOS if not pseudo.is_tree_pseudo_element()] %>
|
||||
|
||||
/// The number of eager pseudo-elements.
|
||||
pub const EAGER_PSEUDO_COUNT: usize = ${len(EAGER_PSEUDOS)};
|
||||
|
||||
/// The number of non-functional pseudo-elements.
|
||||
pub const SIMPLE_PSEUDO_COUNT: usize = ${len(SIMPLE_PSEUDOS)};
|
||||
|
||||
/// The list of eager pseudos.
|
||||
pub const EAGER_PSEUDOS: [PseudoElement; EAGER_PSEUDO_COUNT] = [
|
||||
% for eager_pseudo_name in EAGER_PSEUDOS:
|
||||
|
@ -27,24 +32,11 @@ pub const EAGER_PSEUDOS: [PseudoElement; EAGER_PSEUDO_COUNT] = [
|
|||
% endfor
|
||||
];
|
||||
|
||||
<% TREE_PSEUDOS = [pseudo for pseudo in PSEUDOS if pseudo.is_tree_pseudo_element()] %>
|
||||
<% SIMPLE_PSEUDOS = [pseudo for pseudo in PSEUDOS if not pseudo.is_tree_pseudo_element()] %>
|
||||
|
||||
<%def name="pseudo_element_variant(pseudo, tree_arg='..')">\
|
||||
PseudoElement::${pseudo.capitalized()}${"({})".format(tree_arg) if pseudo.is_tree_pseudo_element() else ""}\
|
||||
</%def>
|
||||
|
||||
impl PseudoElement {
|
||||
/// Executes a closure with each simple (not functional)
|
||||
/// pseudo-element as an argument.
|
||||
pub fn each_simple<F>(mut fun: F)
|
||||
where F: FnMut(Self),
|
||||
{
|
||||
% for pseudo in SIMPLE_PSEUDOS:
|
||||
fun(${pseudo_element_variant(pseudo)});
|
||||
% endfor
|
||||
}
|
||||
|
||||
/// Get the pseudo-element as an atom.
|
||||
#[inline]
|
||||
pub fn atom(&self) -> Atom {
|
||||
|
@ -55,6 +47,27 @@ impl PseudoElement {
|
|||
}
|
||||
}
|
||||
|
||||
/// Returns an index if the pseudo-element is a simple (non-functional)
|
||||
/// pseudo.
|
||||
#[inline]
|
||||
pub fn simple_index(&self) -> Option<usize> {
|
||||
match *self {
|
||||
% for i, pseudo in enumerate(SIMPLE_PSEUDOS):
|
||||
${pseudo_element_variant(pseudo)} => Some(${i}),
|
||||
% endfor
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns an array of `None` values.
|
||||
///
|
||||
/// FIXME(emilio): Integer generics can't come soon enough.
|
||||
pub fn simple_pseudo_none_array<T>() -> [Option<T>; SIMPLE_PSEUDO_COUNT] {
|
||||
[
|
||||
${",\n".join(["None" for pseudo in SIMPLE_PSEUDOS])}
|
||||
]
|
||||
}
|
||||
|
||||
/// Whether this pseudo-element is an anonymous box.
|
||||
#[inline]
|
||||
pub fn is_anon_box(&self) -> bool {
|
||||
|
|
|
@ -14,7 +14,7 @@ use std::fmt;
|
|||
use string_cache::{Atom, Namespace, WeakAtom, WeakNamespace};
|
||||
use style_traits::{ParseError, StyleParseError};
|
||||
|
||||
pub use gecko::pseudo_element::{PseudoElement, EAGER_PSEUDOS, EAGER_PSEUDO_COUNT};
|
||||
pub use gecko::pseudo_element::{PseudoElement, EAGER_PSEUDOS, EAGER_PSEUDO_COUNT, SIMPLE_PSEUDO_COUNT};
|
||||
pub use gecko::snapshot::SnapshotMap;
|
||||
|
||||
bitflags! {
|
||||
|
@ -413,15 +413,6 @@ impl SelectorImpl {
|
|||
}
|
||||
|
||||
|
||||
#[inline]
|
||||
/// Executes a function for each simple (not functional) pseudo-element.
|
||||
pub fn each_simple_pseudo_element<F>(fun: F)
|
||||
where F: FnMut(PseudoElement),
|
||||
{
|
||||
PseudoElement::each_simple(fun)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
/// Returns the relevant state flag for a given non-tree-structural
|
||||
/// pseudo-class.
|
||||
pub fn pseudo_class_state_flag(pc: &NonTSPseudoClass) -> ElementState {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue