diff --git a/src/ExpressionParser/Prefix/GroupingExpressionParser.php b/src/ExpressionParser/Prefix/GroupingExpressionParser.php index 5c6608da4..95a11762f 100644 --- a/src/ExpressionParser/Prefix/GroupingExpressionParser.php +++ b/src/ExpressionParser/Prefix/GroupingExpressionParser.php @@ -17,6 +17,7 @@ use Twig\ExpressionParser\ExpressionParserDescriptionInterface; use Twig\ExpressionParser\PrefixExpressionParserInterface; use Twig\Node\Expression\AbstractExpression; use Twig\Node\Expression\ListExpression; +use Twig\Node\Expression\Variable\AssignContextVariable; use Twig\Node\Expression\Variable\ContextVariable; use Twig\Parser; use Twig\Token; @@ -36,7 +37,7 @@ final class GroupingExpressionParser extends AbstractExpressionParser implements return $expr->setExplicitParentheses(); } - return new ListExpression([$expr], $token->getLine()); + return new ListExpression([self::toAssignContextVariable($expr)], $token->getLine()); } // determine if we are parsing an arrow function arguments @@ -58,7 +59,16 @@ final class GroupingExpressionParser extends AbstractExpressionParser implements throw new SyntaxError('A list of variables must be followed by an arrow.', $stream->getCurrent()->getLine(), $stream->getSourceContext()); } - return new ListExpression($names, $token->getLine()); + return new ListExpression(array_map(self::toAssignContextVariable(...), $names), $token->getLine()); + } + + private static function toAssignContextVariable(AbstractExpression $expr): AssignContextVariable + { + if (!$expr instanceof ContextVariable) { + throw new SyntaxError('A list must only contain variables.', $expr->getTemplateLine(), $expr->getSourceContext()); + } + + return $expr instanceof AssignContextVariable ? $expr : new AssignContextVariable($expr->getAttribute('name'), $expr->getTemplateLine()); } public function getName(): string diff --git a/src/Node/Expression/ArrowFunctionExpression.php b/src/Node/Expression/ArrowFunctionExpression.php index 552b8fe91..9156f7c61 100644 --- a/src/Node/Expression/ArrowFunctionExpression.php +++ b/src/Node/Expression/ArrowFunctionExpression.php @@ -26,14 +26,14 @@ class ArrowFunctionExpression extends AbstractExpression { public function __construct(AbstractExpression $expr, Node $names, $lineno) { - if (!$names instanceof ListExpression && !$names instanceof ContextVariable) { - throw new SyntaxError('The arrow function argument must be a list of variables or a single variable.', $names->getTemplateLine(), $names->getSourceContext()); - } - if ($names instanceof ContextVariable) { $names = new ListExpression([new AssignContextVariable($names->getAttribute('name'), $names->getTemplateLine())], $lineno); } + if (!$names instanceof ListExpression) { + throw new SyntaxError('The arrow function argument must be a list of variables or a single variable.', $names->getTemplateLine(), $names->getSourceContext()); + } + parent::__construct(['expr' => $expr, 'names' => $names], [], $lineno); } diff --git a/src/Node/Expression/ListExpression.php b/src/Node/Expression/ListExpression.php index dd7fc1f9c..9b23857fc 100644 --- a/src/Node/Expression/ListExpression.php +++ b/src/Node/Expression/ListExpression.php @@ -12,12 +12,12 @@ namespace Twig\Node\Expression; use Twig\Compiler; -use Twig\Node\Expression\Variable\ContextVariable; +use Twig\Node\Expression\Variable\AssignContextVariable; class ListExpression extends AbstractExpression { /** - * @param array $items + * @param array $items */ public function __construct(array $items, int $lineno) {