From 69764ceaa33f55c546d6f66eec75d12ece3bcb72 Mon Sep 17 00:00:00 2001 From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com> Date: Thu, 23 Apr 2020 18:53:19 -0400 Subject: [PATCH] allow arbitrary control flow inside @ for --- src/atrule/for_rule.rs | 19 +++++++++++++++++-- tests/for.rs | 5 +++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/atrule/for_rule.rs b/src/atrule/for_rule.rs index 4eda27d..032b8b4 100644 --- a/src/atrule/for_rule.rs +++ b/src/atrule/for_rule.rs @@ -42,12 +42,27 @@ impl For { span: self.var.span, }, )?; - stmts.extend(eat_stmts( + for stmt in eat_stmts( &mut self.body.clone().into_iter().peekmore(), scope, super_selector, 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) } diff --git a/tests/for.rs b/tests/for.rs index 3201dfa..57ea36e 100644 --- a/tests/for.rs +++ b/tests/for.rs @@ -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", "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" +);