remove devour_whitespace from selector parsing

This commit is contained in:
ConnorSkees 2020-06-23 04:57:06 -04:00
parent 36530a3309
commit dc3208cc05

View File

@ -3,7 +3,7 @@ use codemap::Span;
use crate::{ use crate::{
error::SassResult, error::SassResult,
parse::Parser, parse::Parser,
utils::{devour_whitespace, is_name, is_name_start, read_until_closing_paren}, utils::{is_name, is_name_start, read_until_closing_paren},
Token, Token,
}; };
@ -86,7 +86,7 @@ impl<'a, 'b> SelectorParser<'a, 'b> {
fn parse_selector_list(&mut self) -> SassResult<SelectorList> { fn parse_selector_list(&mut self) -> SassResult<SelectorList> {
let mut components = vec![self.parse_complex_selector(false)?]; let mut components = vec![self.parse_complex_selector(false)?];
devour_whitespace(self.parser.toks); self.parser.whitespace();
let mut line_break = false; let mut line_break = false;
@ -132,7 +132,7 @@ impl<'a, 'b> SelectorParser<'a, 'b> {
// todo: or patterns // todo: or patterns
loop { loop {
devour_whitespace(self.parser.toks); self.parser.whitespace();
// todo: can we do while let Some(..) = self.parser.toks.peek() ? // todo: can we do while let Some(..) = self.parser.toks.peek() ?
match self.parser.toks.peek() { match self.parser.toks.peek() {
@ -307,7 +307,7 @@ impl<'a, 'b> SelectorParser<'a, 'b> {
} }
}; };
devour_whitespace(self.parser.toks); self.parser.whitespace();
let unvendored = unvendor(&name); let unvendored = unvendor(&name);
@ -318,25 +318,25 @@ impl<'a, 'b> SelectorParser<'a, 'b> {
// todo: lowercase? // todo: lowercase?
if SELECTOR_PSEUDO_ELEMENTS.contains(&unvendored) { if SELECTOR_PSEUDO_ELEMENTS.contains(&unvendored) {
selector = Some(self.parse_selector_list()?); selector = Some(self.parse_selector_list()?);
devour_whitespace(self.parser.toks); self.parser.whitespace();
self.expect_closing_paren()?; self.expect_closing_paren()?;
} else { } else {
argument = Some(self.declaration_value()?); argument = Some(self.declaration_value()?);
} }
} else if SELECTOR_PSEUDO_CLASSES.contains(&unvendored) { } else if SELECTOR_PSEUDO_CLASSES.contains(&unvendored) {
selector = Some(self.parse_selector_list()?); selector = Some(self.parse_selector_list()?);
devour_whitespace(self.parser.toks); self.parser.whitespace();
self.expect_closing_paren()?; self.expect_closing_paren()?;
} else if unvendored == "nth-child" || unvendored == "nth-last-child" { } else if unvendored == "nth-child" || unvendored == "nth-last-child" {
let mut this_arg = self.parse_a_n_plus_b()?; let mut this_arg = self.parse_a_n_plus_b()?;
let found_whitespace = devour_whitespace(self.parser.toks); let found_whitespace = self.parser.whitespace();
#[allow(clippy::match_same_arms)] #[allow(clippy::match_same_arms)]
match (found_whitespace, self.parser.toks.peek()) { match (found_whitespace, self.parser.toks.peek()) {
(_, Some(Token { kind: ')', .. })) => {} (_, Some(Token { kind: ')', .. })) => {}
(true, _) => { (true, _) => {
self.expect_identifier("of")?; self.expect_identifier("of")?;
this_arg.push_str(" of"); this_arg.push_str(" of");
devour_whitespace(self.parser.toks); self.parser.whitespace();
selector = Some(self.parse_selector_list()?); selector = Some(self.parse_selector_list()?);
} }
_ => {} _ => {}
@ -473,7 +473,7 @@ impl<'a, 'b> SelectorParser<'a, 'b> {
buf.push(t.kind); buf.push(t.kind);
self.parser.toks.next(); self.parser.toks.next();
} }
devour_whitespace(self.parser.toks); self.parser.whitespace();
if let Some(t) = self.parser.toks.peek() { if let Some(t) = self.parser.toks.peek() {
if t.kind != 'n' && t.kind != 'N' { if t.kind != 'n' && t.kind != 'N' {
return Ok(buf); return Ok(buf);
@ -493,14 +493,14 @@ impl<'a, 'b> SelectorParser<'a, 'b> {
buf.push('n'); buf.push('n');
devour_whitespace(self.parser.toks); self.parser.whitespace();
if let Some(t @ Token { kind: '+', .. }) | Some(t @ Token { kind: '-', .. }) = if let Some(t @ Token { kind: '+', .. }) | Some(t @ Token { kind: '-', .. }) =
self.parser.toks.peek() self.parser.toks.peek()
{ {
buf.push(t.kind); buf.push(t.kind);
self.parser.toks.next(); self.parser.toks.next();
devour_whitespace(self.parser.toks); self.parser.whitespace();
match self.parser.toks.peek() { match self.parser.toks.peek() {
Some(t) if !t.kind.is_ascii_digit() => { Some(t) if !t.kind.is_ascii_digit() => {
return Err(("Expected a number.", self.span).into()) return Err(("Expected a number.", self.span).into())