remove value_from_vec where unnecessary

This commit is contained in:
Connor Skees 2020-07-07 18:06:28 -04:00
parent aa209702d2
commit 11e859705a
5 changed files with 27 additions and 25 deletions

View File

@ -270,7 +270,7 @@ impl<'a> Parser<'a> {
self.whitespace(); self.whitespace();
if self.toks.peek().is_none() { if self.toks.peek().is_none() {
return Ok(CallArgs(args, span)); return Err(("expected \")\".", span).into());
} }
} }
} }

View File

@ -80,7 +80,7 @@ impl<'a> Parser<'a> {
let mut value = 0; let mut value = 0;
let first = match self.toks.peek() { let first = match self.toks.peek() {
Some(t) => t, Some(t) => t,
None => return Ok(String::new()), None => return Err(("Expected expression.", self.span_before).into()),
}; };
let mut span = first.pos(); let mut span = first.pos();
if first.kind == '\n' { if first.kind == '\n' {
@ -252,8 +252,18 @@ impl<'a> Parser<'a> {
while let Some(tok) = self.toks.next() { while let Some(tok) = self.toks.next() {
span = span.merge(tok.pos()); span = span.merge(tok.pos());
match tok.kind { match tok.kind {
'"' if q == '"' => break, '"' if q == '"' => {
'\'' if q == '\'' => break, return Ok(Spanned {
node: Value::String(s, QuoteKind::Quoted),
span,
})
}
'\'' if q == '\'' => {
return Ok(Spanned {
node: Value::String(s, QuoteKind::Quoted),
span,
})
}
'#' => { '#' => {
if let Some(Token { kind: '{', pos }) = self.toks.peek() { if let Some(Token { kind: '{', pos }) = self.toks.peek() {
self.span_before = self.span_before.merge(*pos); self.span_before = self.span_before.merge(*pos);
@ -318,9 +328,6 @@ impl<'a> Parser<'a> {
_ => s.push(tok.kind), _ => s.push(tok.kind),
} }
} }
Ok(Spanned { Err((format!("Expected {}.", q), span).into())
node: Value::String(s, QuoteKind::Quoted),
span,
})
} }
} }

View File

@ -144,11 +144,10 @@ impl<'a> Parser<'a> {
} }
} }
AtRuleKind::Error => { AtRuleKind::Error => {
let toks = read_until_semicolon_or_closing_curly_brace(self.toks)?;
let Spanned { let Spanned {
node: message, node: message,
span, span,
} = self.parse_value_from_vec(toks)?; } = self.parse_value()?;
return Err(( return Err((
message.inspect(span)?.to_string(), message.inspect(span)?.to_string(),
@ -157,11 +156,10 @@ impl<'a> Parser<'a> {
.into()); .into());
} }
AtRuleKind::Warn => { AtRuleKind::Warn => {
let toks = read_until_semicolon_or_closing_curly_brace(self.toks)?;
let Spanned { let Spanned {
node: message, node: message,
span, span,
} = self.parse_value_from_vec(toks)?; } = self.parse_value()?;
span.merge(kind_string.span); span.merge(kind_string.span);
if let Some(Token { kind: ';', pos }) = self.toks.peek() { if let Some(Token { kind: ';', pos }) = self.toks.peek() {
kind_string.span.merge(*pos); kind_string.span.merge(*pos);
@ -173,11 +171,10 @@ impl<'a> Parser<'a> {
}) })
} }
AtRuleKind::Debug => { AtRuleKind::Debug => {
let toks = read_until_semicolon_or_closing_curly_brace(self.toks)?;
let Spanned { let Spanned {
node: message, node: message,
span, span,
} = self.parse_value_from_vec(toks)?; } = self.parse_value()?;
span.merge(kind_string.span); span.merge(kind_string.span);
if let Some(Token { kind: ';', pos }) = self.toks.peek() { if let Some(Token { kind: ';', pos }) = self.toks.peek() {
kind_string.span.merge(*pos); kind_string.span.merge(*pos);
@ -534,14 +531,12 @@ impl<'a> Parser<'a> {
let mut found_true = false; let mut found_true = false;
let mut body = Vec::new(); let mut body = Vec::new();
let init_cond_toks = read_until_open_curly_brace(self.toks)?; let init_cond = self.parse_value()?.node;
if init_cond_toks.is_empty() {
return Err(("Expected expression.", self.span_before).into());
}
// consume the open curly brace // consume the open curly brace
let span_before = match self.toks.next() { let span_before = match self.toks.next() {
Some(t) => t.pos, Some(Token { kind: '{', pos }) => pos,
None => return Err(("Expected expression.", self.span_before).into()), Some(..) | None => return Err(("expected \"}\".", self.span_before).into()),
}; };
if self.toks.peek().is_none() { if self.toks.peek().is_none() {
@ -550,7 +545,7 @@ impl<'a> Parser<'a> {
self.whitespace_or_comment(); self.whitespace_or_comment();
if self.parse_value_from_vec(init_cond_toks)?.is_true() { if init_cond.is_true() {
found_true = true; found_true = true;
body = Parser { body = Parser {
toks: self.toks, toks: self.toks,

View File

@ -55,8 +55,11 @@ impl<'a> Parser<'a> {
pub(crate) fn parse_value(&mut self) -> SassResult<Spanned<Value>> { pub(crate) fn parse_value(&mut self) -> SassResult<Spanned<Value>> {
self.whitespace(); self.whitespace();
let span = match self.toks.peek() { let span = match self.toks.peek() {
Some(Token { kind: '}', .. })
| Some(Token { kind: ';', .. })
| Some(Token { kind: '{', .. })
| None => return Err(("Expected expression.", self.span_before).into()),
Some(Token { pos, .. }) => *pos, Some(Token { pos, .. }) => *pos,
None => return Err(("Expected expression.", self.span_before).into()),
}; };
let mut last_was_whitespace = false; let mut last_was_whitespace = false;
let mut space_separated = Vec::new(); let mut space_separated = Vec::new();

View File

@ -219,17 +219,14 @@ error!(
"a {$color: {ed;}", "Error: Expected expression." "a {$color: {ed;}", "Error: Expected expression."
); );
error!( error!(
#[ignore = "this test does not fail because the closing brace is included in the value"]
empty_style_value_no_semicolon, empty_style_value_no_semicolon,
"a {color:}", "Error: Expected expression." "a {color:}", "Error: Expected expression."
); );
error!( error!(
#[ignore = "this test does not fail because the semicolon is included in the value"]
empty_style_value_semicolon, empty_style_value_semicolon,
"a {color:;}", "Error: Expected expression." "a {color:;}", "Error: Expected expression."
); );
error!( error!(
#[ignore = "this does not fail"]
ident_colon_closing_brace, ident_colon_closing_brace,
"r:}", "Error: Expected expression." "r:}", "Error: Expected expression."
); );