From 0ded248e1e691576c2ff44163480080df9ad6d68 Mon Sep 17 00:00:00 2001 From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com> Date: Mon, 23 Mar 2020 23:52:15 -0400 Subject: [PATCH] allow comma separated bracketed list in function args --- src/args.rs | 25 +++++++++++++++++++++++++ src/value/parse.rs | 6 +++++- tests/functions.rs | 5 +++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/args.rs b/src/args.rs index 93ecfb5..0129ea8 100644 --- a/src/args.rs +++ b/src/args.rs @@ -180,6 +180,10 @@ pub(crate) fn eat_call_args>( return Ok(CallArgs(args)); } TokenKind::Symbol(Symbol::Comma) => break, + TokenKind::Symbol(Symbol::OpenSquareBrace) => { + val.push(tok); + val.extend(read_until_close_square_brace(toks)); + } TokenKind::Symbol(Symbol::OpenParen) => { val.push(tok); val.extend(read_until_close_paren(toks)); @@ -225,3 +229,24 @@ fn read_until_close_paren>(toks: &mut Peekable) -> } v } + +fn read_until_close_square_brace>(toks: &mut Peekable) -> Vec { + 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 +} diff --git a/src/value/parse.rs b/src/value/parse.rs index 0531629..711f57b 100644 --- a/src/value/parse.rs +++ b/src/value/parse.rs @@ -281,7 +281,11 @@ impl Value { if let Some(tok) = toks.peek() { if tok.is_symbol(Symbol::CloseSquareBrace) { 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)?; diff --git a/tests/functions.rs b/tests/functions.rs index e849911..810544b 100644 --- a/tests/functions.rs +++ b/tests/functions.rs @@ -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", "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" +);