Refactor how @return is parsed

This commit is contained in:
ConnorSkees 2020-02-28 01:02:11 -05:00
parent a91ab9007e
commit 46b96d03b1
2 changed files with 28 additions and 10 deletions

View File

@ -73,11 +73,24 @@ impl AtRule {
let (name, func) = Function::decl_from_tokens(toks, scope)?; let (name, func) = Function::decl_from_tokens(toks, scope)?;
AtRule::Function(name, Box::new(func)) AtRule::Function(name, Box::new(func))
} }
AtRuleKind::Return => AtRule::Return( AtRuleKind::Return => {
// todo: return may not end in semicolon let mut t = Vec::new();
toks.take_while(|t| t.kind != TokenKind::Symbol(Symbol::SemiColon)) let mut n = 0;
.collect(), while let Some(tok) = toks.peek() {
), match tok.kind {
TokenKind::Symbol(Symbol::OpenCurlyBrace) => n += 1,
TokenKind::Symbol(Symbol::CloseCurlyBrace) => n -= 1,
TokenKind::Interpolation => n += 1,
TokenKind::Symbol(Symbol::SemiColon) => break,
_ => {}
}
if n < 0 {
break;
}
t.push(toks.next().unwrap());
}
AtRule::Return(t)
},
AtRuleKind::Use => todo!("@use not yet implemented"), AtRuleKind::Use => todo!("@use not yet implemented"),
AtRuleKind::Annotation => todo!("@annotation not yet implemented"), AtRuleKind::Annotation => todo!("@annotation not yet implemented"),
AtRuleKind::AtRoot => todo!("@at-root not yet implemented"), AtRuleKind::AtRoot => todo!("@at-root not yet implemented"),

View File

@ -38,8 +38,13 @@ test!(
"@function a($a) {\n @return $a;\n}\n\nb {\ncolor: a(red,);\n}\n", "@function a($a) {\n @return $a;\n}\n\nb {\ncolor: a(red,);\n}\n",
"b {\n color: red;\n}\n" "b {\n color: red;\n}\n"
); );
// test!( test!(
// return_no_semicolon, return_no_semicolon,
// "@function a() {\n @return 1\n}\n\nb {\ncolor: a();\n}\n", "@function a() {\n @return 1\n}\n\nb {\ncolor: a();\n}\n",
// "b {\n color: 1;\n}\n" "b {\n color: 1;\n}\n"
// ); );
test!(
two_returns,
"@function a() {\n @return 1; @return 2;\n}\n\nb {\ncolor: a();\n}\n",
"b {\n color: 1;\n}\n"
);