diff --git a/components/selectors/builder.rs b/components/selectors/builder.rs index f100166f48d..0be3eb90e0c 100644 --- a/components/selectors/builder.rs +++ b/components/selectors/builder.rs @@ -36,6 +36,7 @@ use std::slice; /// (from left to right). Once the process is complete, callers should invoke /// build(), which transforms the contents of the SelectorBuilder into a heap- /// allocated Selector and leaves the builder in a drained state. +#[derive(Debug)] pub struct SelectorBuilder { /// The entire sequence of simple selectors, from left to right, without combinators. /// @@ -104,7 +105,7 @@ impl SelectorBuilder { parsed_slotted: bool, ) -> ThinArc> { // Compute the specificity and flags. - let mut spec = SpecificityAndFlags(specificity(self.simple_selectors.iter())); + let mut spec = SpecificityAndFlags(specificity(&*self, self.simple_selectors.iter())); if parsed_pseudo { spec.0 |= HAS_PSEUDO_BIT; } @@ -268,25 +269,35 @@ impl From for u32 { } } -fn specificity(iter: slice::Iter>) -> u32 +fn specificity(builder: &SelectorBuilder, iter: slice::Iter>) -> u32 where Impl: SelectorImpl, { - complex_selector_specificity(iter).into() + complex_selector_specificity(builder, iter).into() } -fn complex_selector_specificity(mut iter: slice::Iter>) -> Specificity +fn complex_selector_specificity( + builder: &SelectorBuilder, + mut iter: slice::Iter>, +) -> Specificity where Impl: SelectorImpl, { fn simple_selector_specificity( + builder: &SelectorBuilder, simple_selector: &Component, specificity: &mut Specificity, ) where Impl: SelectorImpl, { match *simple_selector { - Component::Combinator(..) => unreachable!(), + Component::Combinator(ref combinator) => { + unreachable!( + "Found combinator {:?} in simple selectors vector? {:?}", + combinator, + builder, + ); + } // FIXME(emilio): Spec doesn't define any particular specificity for // ::slotted(), so apply the general rule for pseudos per: // @@ -326,7 +337,7 @@ where }, Component::Negation(ref negated) => { for ss in negated.iter() { - simple_selector_specificity(&ss, specificity); + simple_selector_specificity(builder, &ss, specificity); } }, } @@ -334,7 +345,7 @@ where let mut specificity = Default::default(); for simple_selector in &mut iter { - simple_selector_specificity(&simple_selector, &mut specificity); + simple_selector_specificity(builder, &simple_selector, &mut specificity); } specificity } diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index 2c9d6505776..3210f1085b0 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -92,7 +92,7 @@ macro_rules! with_all_bounds { /// NB: We need Clone so that we can derive(Clone) on struct with that /// are parameterized on SelectorImpl. See /// - pub trait SelectorImpl: Clone + Sized + 'static { + pub trait SelectorImpl: Clone + Debug + Sized + 'static { type ExtraMatchingData: Sized + Default + 'static; type AttrValue: $($InSelector)*; type Identifier: $($InSelector)*;