allow comma separated bracketed list in function args

This commit is contained in:
ConnorSkees 2020-03-23 23:52:15 -04:00
parent 430747d06b
commit 0ded248e1e
3 changed files with 35 additions and 1 deletions

View File

@ -180,6 +180,10 @@ pub(crate) fn eat_call_args<I: Iterator<Item = Token>>(
return Ok(CallArgs(args)); return Ok(CallArgs(args));
} }
TokenKind::Symbol(Symbol::Comma) => break, TokenKind::Symbol(Symbol::Comma) => break,
TokenKind::Symbol(Symbol::OpenSquareBrace) => {
val.push(tok);
val.extend(read_until_close_square_brace(toks));
}
TokenKind::Symbol(Symbol::OpenParen) => { TokenKind::Symbol(Symbol::OpenParen) => {
val.push(tok); val.push(tok);
val.extend(read_until_close_paren(toks)); val.extend(read_until_close_paren(toks));
@ -225,3 +229,24 @@ fn read_until_close_paren<I: Iterator<Item = Token>>(toks: &mut Peekable<I>) ->
} }
v v
} }
fn read_until_close_square_brace<I: Iterator<Item = Token>>(toks: &mut Peekable<I>) -> Vec<Token> {
let mut v = Vec::new();
let mut scope = 0;
for tok in toks {
match tok.kind {
TokenKind::Symbol(Symbol::CloseSquareBrace) => {
if scope <= 1 {
v.push(tok);
return v;
} else {
scope -= 1;
}
}
TokenKind::Symbol(Symbol::OpenSquareBrace) => scope += 1,
_ => {}
}
v.push(tok)
}
v
}

View File

@ -281,7 +281,11 @@ impl Value {
if let Some(tok) = toks.peek() { if let Some(tok) = toks.peek() {
if tok.is_symbol(Symbol::CloseSquareBrace) { if tok.is_symbol(Symbol::CloseSquareBrace) {
toks.next(); toks.next();
return Ok(Value::List(Vec::new(), ListSeparator::Space, Brackets::Bracketed)); return Ok(Value::List(
Vec::new(),
ListSeparator::Space,
Brackets::Bracketed,
));
} }
} }
let inner = Self::from_tokens(toks, scope, super_selector)?; let inner = Self::from_tokens(toks, scope, super_selector)?;

View File

@ -68,3 +68,8 @@ test!(
"@function f() {\n @return g();\n}\n@function g() {\n @return false;\n}\na {\n color: f();\n color: g();\n}\n", "@function f() {\n @return g();\n}\n@function g() {\n @return false;\n}\na {\n color: f();\n color: g();\n}\n",
"a {\n color: false;\n color: false;\n}\n" "a {\n color: false;\n color: false;\n}\n"
); );
test!(
square_bracket_comma_separated,
"@function foo($a) {\n @return $a;\n}\n\na {\n color: foo([a, b]);\n}\n",
"a {\n color: [a, b];\n}\n"
);