allow arbitrary control flow inside @ for

This commit is contained in:
ConnorSkees 2020-04-23 18:53:19 -04:00
parent 9bb7c05d19
commit 69764ceaa3
2 changed files with 22 additions and 2 deletions

View File

@ -42,12 +42,27 @@ impl For {
span: self.var.span, span: self.var.span,
}, },
)?; )?;
stmts.extend(eat_stmts( for stmt in eat_stmts(
&mut self.body.clone().into_iter().peekmore(), &mut self.body.clone().into_iter().peekmore(),
scope, scope,
super_selector, super_selector,
false, false,
)?); )? {
match stmt.node {
Stmt::AtRule(AtRule::For(f)) => {
stmts.extend(f.ruleset_eval(scope, super_selector)?)
}
Stmt::AtRule(AtRule::While(w)) => {
// TODO: should at_root be false? scoping
stmts.extend(w.ruleset_eval(scope, super_selector, false)?)
}
Stmt::AtRule(AtRule::Include(s)) | Stmt::AtRule(AtRule::Each(s)) => {
stmts.extend(s)
}
Stmt::AtRule(AtRule::If(i)) => stmts.extend(i.eval(scope, super_selector)?),
_ => stmts.push(stmt),
}
}
} }
Ok(stmts) Ok(stmts)
} }

View File

@ -53,3 +53,8 @@ test!(
"@function foo() {\n @for $i from 1 through 2 {\n @if $i==2 {\n @return $i;\n }\n }\n}\na {\n color: foo();\n}\n", "@function foo() {\n @for $i from 1 through 2 {\n @if $i==2 {\n @return $i;\n }\n }\n}\na {\n color: foo();\n}\n",
"a {\n color: 2;\n}\n" "a {\n color: 2;\n}\n"
); );
test!(
inner_if,
"a {\n @for $i from 1 to 3 {\n @if $i==2 {\n color: red;\n }\n }\n}\n",
"a {\n color: red;\n}\n"
);