eagerly evaluate \@if conditions

This commit is contained in:
ConnorSkees 2020-05-23 13:39:47 -04:00
parent 3c97400935
commit c4cfb9112e
3 changed files with 20 additions and 8 deletions

View File

@ -22,12 +22,12 @@ pub(crate) struct If {
#[derive(Debug, Clone)]
pub(crate) struct Branch {
pub cond: Vec<Token>,
pub cond: Spanned<Value>,
pub toks: Vec<Token>,
}
impl Branch {
pub fn new(cond: Vec<Token>, toks: Vec<Token>) -> Branch {
pub fn new(cond: Spanned<Value>, toks: Vec<Token>) -> Branch {
Branch { cond, toks }
}
}
@ -35,14 +35,17 @@ impl Branch {
impl If {
pub fn from_tokens<I: Iterator<Item = Token>>(
toks: &mut PeekMoreIterator<I>,
scope: &Scope,
super_selector: &Selector,
span_before: Span,
) -> SassResult<If> {
devour_whitespace_or_comment(toks)?;
let mut branches = Vec::new();
let init_cond = read_until_open_curly_brace(toks);
if toks.next().is_none() {
let init_toks = read_until_open_curly_brace(toks);
if init_toks.is_empty() || toks.next().is_none() {
return Err(("Expected expression.", span_before).into());
}
let init_cond = Value::from_vec(init_toks, scope, super_selector)?;
devour_whitespace_or_comment(toks)?;
let mut init_toks = read_until_closing_curly_brace(toks);
if let Some(tok) = toks.next() {
@ -76,7 +79,7 @@ impl If {
match tok.kind.to_ascii_lowercase() {
'i' if toks.next().unwrap().kind.to_ascii_lowercase() == 'f' => {
toks.next();
let cond = read_until_open_curly_brace(toks);
let cond = Value::from_vec(read_until_open_curly_brace(toks), scope, super_selector)?;
toks.next();
devour_whitespace(toks);
branches.push(Branch::new(cond, read_until_closing_curly_brace(toks)));
@ -111,8 +114,7 @@ impl If {
let mut toks = Vec::new();
let mut found_true = false;
for branch in self.branches {
let val = Value::from_vec(branch.cond, scope, super_selector)?;
if val.node.is_true(val.span)? {
if branch.cond.node.is_true(branch.cond.span)? {
toks = branch.toks;
found_true = true;
break;

View File

@ -216,7 +216,7 @@ impl AtRule {
span: kind_span,
},
AtRuleKind::If => Spanned {
node: AtRule::If(If::from_tokens(toks, kind_span)?),
node: AtRule::If(If::from_tokens(toks, scope, super_selector, kind_span)?),
span: kind_span,
},
AtRuleKind::For => Spanned {

View File

@ -113,8 +113,18 @@ error!(
"@if",
"Error: Expected expression."
);
error!(
no_condition,
"@if{}",
"Error: Expected expression."
);
error!(
nothing_after_open_curly,
"@if foo {",
"Error: expected \"}\"."
);
error!(
condition_is_evaluated_eagerly,
"@if 1 + 1 =s {\n}",
"Error: expected \"=\"."
);