From 5835c2344f8570df573f8ba68929f8fa95422a58 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 3 Jun 2019 11:44:35 +0200 Subject: [PATCH] allowed string operators as variables names in assignments --- CHANGELOG | 2 +- src/ExpressionParser.php | 8 +++++++- .../string_operator_as_var_assignment.test | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 test/Twig/Tests/Fixtures/expressions/string_operator_as_var_assignment.test diff --git a/CHANGELOG b/CHANGELOG index ef867b6411..cbe48fa0c7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,6 @@ * 1.42.1 (2019-XX-XX) - * n/a + * allowed string operators as variables names in assignments * 1.42.0 (2019-05-31) diff --git a/src/ExpressionParser.php b/src/ExpressionParser.php index d19cb58a5c..9066ade169 100644 --- a/src/ExpressionParser.php +++ b/src/ExpressionParser.php @@ -649,7 +649,13 @@ public function parseAssignmentExpression() $stream = $this->parser->getStream(); $targets = []; while (true) { - $token = $stream->expect(Token::NAME_TYPE, null, 'Only variables can be assigned to'); + $token = $this->parser->getCurrentToken(); + if ($stream->test(Token::OPERATOR_TYPE) && preg_match(Lexer::REGEX_NAME, $token->getValue())) { + // in this context, string operators are variable names + $this->parser->getStream()->next(); + } else { + $stream->expect(Token::NAME_TYPE, null, 'Only variables can be assigned to'); + } $value = $token->getValue(); if (\in_array(strtolower($value), ['true', 'false', 'none', 'null'])) { throw new SyntaxError(sprintf('You cannot assign a value to "%s".', $value), $token->getLine(), $stream->getSourceContext()); diff --git a/test/Twig/Tests/Fixtures/expressions/string_operator_as_var_assignment.test b/test/Twig/Tests/Fixtures/expressions/string_operator_as_var_assignment.test new file mode 100644 index 0000000000..478d4eb5e5 --- /dev/null +++ b/test/Twig/Tests/Fixtures/expressions/string_operator_as_var_assignment.test @@ -0,0 +1,18 @@ +--TEST-- +Twig supports the string operators as variable names in assignments +--TEMPLATE-- +{% for matches in [1, 2] %} + {{- matches }} +{% endfor %} + +{% set matches = [1, 2] %} + +OK +--DATA-- +return [] +--EXPECT-- +1 +2 + + +OK