diff --git a/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php b/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php index 35468940a..801390097 100644 --- a/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php +++ b/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php @@ -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 diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index 8e4c31c22..8e11be832 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -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), diff --git a/tests/Fixtures/expressions/spread_ternary_precedence.test b/tests/Fixtures/expressions/spread_ternary_precedence.test new file mode 100644 index 000000000..922957acc --- /dev/null +++ b/tests/Fixtures/expressions/spread_ternary_precedence.test @@ -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