diff --git a/CHANGELOG b/CHANGELOG index 8dff4caad..6ad25b2a8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -321,9 +321,9 @@ * improved the performance of the filesystem loader * removed features that were deprecated in 1.x -# 1.43.2 (2020-XX-XX) +# 1.44.0 (2020-XX-XX) - * n/a + * Add support for ES2015 style object initialisation shortcut { a } is the same as { 'a': a } # 1.43.1 (2020-08-05) diff --git a/doc/templates.rst b/doc/templates.rst index b83e96a04..3c7d1f96d 100644 --- a/doc/templates.rst +++ b/doc/templates.rst @@ -560,6 +560,11 @@ exist: {# keys as integer #} { 2: 'foo', 4: 'bar' } + {# keys can be omitted if it is the same as the variable name #} + { foo } + {# is equivalent to the following #} + { 'foo': foo } + {# keys as expressions (the expression must be enclosed into parentheses) #} {% set foo = 'foo' %} { (foo): 'foo', (1 + 1): 'bar', (foo ~ 'b'): 'baz' } diff --git a/src/ExpressionParser.php b/src/ExpressionParser.php index edf26fafe..c171925c0 100644 --- a/src/ExpressionParser.php +++ b/src/ExpressionParser.php @@ -366,7 +366,16 @@ class ExpressionParser // * a string -- 'a' // * a name, which is equivalent to a string -- a // * an expression, which must be enclosed in parentheses -- (1 + 2) - if (($token = $stream->nextIf(/* Token::STRING_TYPE */ 7)) || ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) || $token = $stream->nextIf(/* Token::NUMBER_TYPE */ 6)) { + if ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) { + $key = new ConstantExpression($token->getValue(), $token->getLine()); + + // {a} is a shortcut for {a:a} + if ($stream->test(Token::PUNCTUATION_TYPE, [',', '}'])) { + $value = new NameExpression($key->getAttribute('value'), $key->getTemplateLine()); + $node->addElement($value, $key); + continue; + } + } elseif (($token = $stream->nextIf(/* Token::STRING_TYPE */ 7)) || $token = $stream->nextIf(/* Token::NUMBER_TYPE */ 6)) { $key = new ConstantExpression($token->getValue(), $token->getLine()); } elseif ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) { $key = $this->parseExpression(); diff --git a/tests/ExpressionParserTest.php b/tests/ExpressionParserTest.php index c6b3a067d..1b6f385da 100644 --- a/tests/ExpressionParserTest.php +++ b/tests/ExpressionParserTest.php @@ -84,6 +84,7 @@ class ExpressionParserTest extends TestCase return [ ['{{ [1, "a": "b"] }}'], ['{{ {"a": "b", 2} }}'], + ['{{ {"a"} }}'], ]; } @@ -160,6 +161,12 @@ class ExpressionParserTest extends TestCase new ConstantExpression('c', 1), ], 1), ], + ['{{ {a, b} }}', new ArrayExpression([ + new ConstantExpression('a', 1), + new NameExpression('a', 1), + new ConstantExpression('b', 1), + new NameExpression('b', 1), + ], 1)], ]; }