mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Add more enum types to avoid unreachable!() for selector case-sensitivity
This commit is contained in:
parent
7149a6a29d
commit
76166bce58
6 changed files with 57 additions and 48 deletions
|
@ -12,7 +12,7 @@ pub struct AttrSelectorWithNamespace<Impl: SelectorImpl> {
|
|||
pub namespace: NamespaceConstraint<(Impl::NamespacePrefix, Impl::NamespaceUrl)>,
|
||||
pub local_name: Impl::LocalName,
|
||||
pub local_name_lower: Impl::LocalName,
|
||||
pub operation: AttrSelectorOperation<Impl::AttrValue>,
|
||||
pub operation: ParsedAttrSelectorOperation<Impl::AttrValue>,
|
||||
pub never_matches: bool,
|
||||
}
|
||||
|
||||
|
@ -35,6 +35,16 @@ pub enum NamespaceConstraint<NamespaceUrl> {
|
|||
Specific(NamespaceUrl),
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq, Clone)]
|
||||
pub enum ParsedAttrSelectorOperation<AttrValue> {
|
||||
Exists,
|
||||
WithValue {
|
||||
operator: AttrSelectorOperator,
|
||||
case_sensitivity: ParsedCaseSensitivity,
|
||||
expected_value: AttrValue,
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq, Clone)]
|
||||
pub enum AttrSelectorOperation<AttrValue> {
|
||||
Exists,
|
||||
|
@ -116,32 +126,39 @@ impl AttrSelectorOperator {
|
|||
pub static SELECTOR_WHITESPACE: &'static [char] = &[' ', '\t', '\n', '\r', '\x0C'];
|
||||
|
||||
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
|
||||
pub enum CaseSensitivity {
|
||||
pub enum ParsedCaseSensitivity {
|
||||
CaseSensitive, // Selectors spec says language-defined, but HTML says sensitive.
|
||||
AsciiCaseInsensitive,
|
||||
AsciiCaseInsensitiveIfInHtmlElementInHtmlDocument,
|
||||
}
|
||||
|
||||
impl CaseSensitivity {
|
||||
pub fn to_definite(self, is_html_element_in_html_document: bool) -> Self {
|
||||
if let CaseSensitivity::AsciiCaseInsensitiveIfInHtmlElementInHtmlDocument = self {
|
||||
if is_html_element_in_html_document {
|
||||
impl ParsedCaseSensitivity {
|
||||
pub fn to_unconditional(self, is_html_element_in_html_document: bool) -> CaseSensitivity {
|
||||
match self {
|
||||
ParsedCaseSensitivity::AsciiCaseInsensitiveIfInHtmlElementInHtmlDocument
|
||||
if is_html_element_in_html_document => {
|
||||
CaseSensitivity::AsciiCaseInsensitive
|
||||
} else {
|
||||
}
|
||||
ParsedCaseSensitivity::AsciiCaseInsensitiveIfInHtmlElementInHtmlDocument => {
|
||||
CaseSensitivity::CaseSensitive
|
||||
}
|
||||
} else {
|
||||
self
|
||||
ParsedCaseSensitivity::CaseSensitive => CaseSensitivity::CaseSensitive,
|
||||
ParsedCaseSensitivity::AsciiCaseInsensitive => CaseSensitivity::AsciiCaseInsensitive,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
|
||||
pub enum CaseSensitivity {
|
||||
CaseSensitive, // Selectors spec says language-defined, but HTML says sensitive.
|
||||
AsciiCaseInsensitive,
|
||||
}
|
||||
|
||||
impl CaseSensitivity {
|
||||
pub fn eq(self, a: &[u8], b: &[u8]) -> bool {
|
||||
match self {
|
||||
CaseSensitivity::CaseSensitive => a == b,
|
||||
CaseSensitivity::AsciiCaseInsensitive => a.eq_ignore_ascii_case(b),
|
||||
CaseSensitivity::AsciiCaseInsensitiveIfInHtmlElementInHtmlDocument => {
|
||||
unreachable!("matching.rs should have called case_sensitivity.to_definite()");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -168,9 +185,6 @@ impl CaseSensitivity {
|
|||
true
|
||||
}
|
||||
}
|
||||
CaseSensitivity::AsciiCaseInsensitiveIfInHtmlElementInHtmlDocument => {
|
||||
unreachable!("matching.rs should have called case_sensitivity.to_definite()");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue