bug #4731 Fix spread operator behavior (fabpot)

This PR was merged into the 3.x branch.

Discussion
----------

Fix spread operator behavior

Closes #4637

Commits
-------

2376bbaf3e Fix spread operator behavior
This commit is contained in:
Fabien Potencier
2026-01-13 10:14:41 +01:00
3 changed files with 17 additions and 2 deletions
@@ -33,6 +33,7 @@ final class UnaryOperatorExpressionParser extends AbstractExpressionParser imple
private ?PrecedenceChange $precedenceChange = null,
private ?string $description = null,
private array $aliases = [],
private ?int $operandPrecedence = null,
) {
}
@@ -41,7 +42,7 @@ final class UnaryOperatorExpressionParser extends AbstractExpressionParser imple
*/
public function parse(Parser $parser, Token $token): AbstractExpression
{
return new ($this->nodeClass)($parser->parseExpression($this->precedence), $token->getLine());
return new ($this->nodeClass)($parser->parseExpression($this->operandPrecedence ?? $this->precedence), $token->getLine());
}
public function getName(): string
+1 -1
View File
@@ -333,7 +333,7 @@ final class CoreExtension extends AbstractExtension
return [
// unary operators
new UnaryOperatorExpressionParser(NotUnary::class, 'not', 50, new PrecedenceChange('twig/twig', '3.15', 70)),
new UnaryOperatorExpressionParser(SpreadUnary::class, '...', 512, description: 'Spread operator'),
new UnaryOperatorExpressionParser(SpreadUnary::class, '...', 512, description: 'Spread operator', operandPrecedence: 0),
new UnaryOperatorExpressionParser(NegUnary::class, '-', 500),
new UnaryOperatorExpressionParser(PosUnary::class, '+', 500),
@@ -0,0 +1,14 @@
--TEST--
Twig spread operator precedence with ternary operator
--TEMPLATE--
{{ [...true ? ['a'] : ['b']]|join }}
{{ [...false ? ['a'] : ['b']]|join }}
{{ [...(true ? ['a'] : ['b'])]|join }}
{{ {a: 1, ...true ? {b: 2} : {c: 3}}|keys|join(',') }}
--DATA--
return []
--EXPECT--
a
b
a
a,b