Removing recursion from ComplexSelector

formatting

formatting
This commit is contained in:
Matthew 2017-04-10 07:46:50 -04:00
parent ca3cd64d6b
commit ec04de4ab7
4 changed files with 26 additions and 6 deletions

1
Cargo.lock generated
View file

@ -2393,6 +2393,7 @@ dependencies = [
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"precomputed-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"smallvec 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]

View file

@ -21,3 +21,4 @@ matches = "0.1"
cssparser = "0.12.1"
fnv = "1.0"
precomputed-hash = "0.1"
smallvec = "0.3"

View file

@ -7,6 +7,7 @@
#[macro_use] extern crate matches;
extern crate fnv;
extern crate precomputed_hash;
extern crate smallvec;
pub mod bloom;
pub mod matching;

View file

@ -360,13 +360,30 @@ impl<Impl: SelectorImpl> ToCss for Selector<Impl> {
impl<Impl: SelectorImpl> ToCss for ComplexSelector<Impl> {
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
if let Some((ref next, ref combinator)) = self.next {
next.to_css(dest)?;
use smallvec::SmallVec;
let mut current = self;
let mut nodes = SmallVec::<[&Self;8]>::new();
nodes.push(current);
loop {
match current.next {
None => break,
Some((ref next, _)) => {
current = &**next;
nodes.push(next);
}
}
}
for selector in nodes.iter().rev() {
if let Some((_, ref combinator)) = selector.next {
combinator.to_css(dest)?;
}
for simple in &self.compound_selector {
for simple in &selector.compound_selector {
simple.to_css(dest)?;
}
}
Ok(())
}
}