@@ -1362,6 +1362,7 @@ public function parsesNestedBracketedTernaryOperation(): void
13621362 $ expressionParser ->parse ($ tokens )
13631363 );
13641364 }
1365+
13651366 /**
13661367 * @test
13671368 */
@@ -1436,6 +1437,62 @@ public function parsesNestedUnbracketedTernaryOperation(): void
14361437 );
14371438 }
14381439
1440+ /**
1441+ * @test
1442+ */
1443+ public function parsesTernaryOperationWithComplexParentheses (): void
1444+ {
1445+ $ expressionParser = new ExpressionParser ();
1446+ $ tokens = $ this ->createTokenIterator ('(((foo)) === ((null))) ? 1 : (((0))) ' );
1447+
1448+ $ expectedExpressioNode = new ExpressionNode (
1449+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 35 ]),
1450+ root: new TernaryOperationNode (
1451+ condition: new ExpressionNode (
1452+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 21 ]),
1453+ root: new BinaryOperationNode (
1454+ rangeInSource: $ this ->range ([0 , 1 ], [0 , 20 ]),
1455+ leftOperand: new ExpressionNode (
1456+ rangeInSource: $ this ->range ([0 , 1 ], [0 , 7 ]),
1457+ root: new ValueReferenceNode (
1458+ rangeInSource: $ this ->range ([0 , 3 ], [0 , 5 ]),
1459+ name: VariableName::from ('foo ' )
1460+ )
1461+ ),
1462+ operator: BinaryOperator::EQUAL ,
1463+ rightOperand: new ExpressionNode (
1464+ rangeInSource: $ this ->range ([0 , 13 ], [0 , 20 ]),
1465+ root: new NullLiteralNode (
1466+ rangeInSource: $ this ->range ([0 , 15 ], [0 , 18 ])
1467+ )
1468+ ),
1469+ )
1470+ ),
1471+ trueBranch: new ExpressionNode (
1472+ rangeInSource: $ this ->range ([0 , 25 ], [0 , 25 ]),
1473+ root: new IntegerLiteralNode (
1474+ rangeInSource: $ this ->range ([0 , 25 ], [0 , 25 ]),
1475+ format: IntegerFormat::DECIMAL ,
1476+ value: '1 '
1477+ )
1478+ ),
1479+ falseBranch: new ExpressionNode (
1480+ rangeInSource: $ this ->range ([0 , 29 ], [0 , 35 ]),
1481+ root: new IntegerLiteralNode (
1482+ rangeInSource: $ this ->range ([0 , 32 ], [0 , 32 ]),
1483+ format: IntegerFormat::DECIMAL ,
1484+ value: '0 '
1485+ ),
1486+ )
1487+ )
1488+ );
1489+
1490+ $ this ->assertEquals (
1491+ $ expectedExpressioNode ,
1492+ $ expressionParser ->parse ($ tokens )
1493+ );
1494+ }
1495+
14391496 /**
14401497 * @test
14411498 */
@@ -1608,4 +1665,48 @@ public function parsesValueReference(): void
16081665 $ expressionParser ->parse ($ tokens )
16091666 );
16101667 }
1668+
1669+ /**
1670+ * @test
1671+ */
1672+ public function parsesMultipleParenthesesAroundValureReferenceCorrecly (): void
1673+ {
1674+ $ expressionParser = new ExpressionParser ();
1675+
1676+ $ tokens = $ this ->createTokenIterator ('(foo) ' );
1677+ $ this ->assertEquals (
1678+ new ExpressionNode (
1679+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 4 ]),
1680+ root: new ValueReferenceNode (
1681+ rangeInSource: $ this ->range ([0 , 1 ], [0 , 3 ]),
1682+ name: VariableName::from ('foo ' )
1683+ )
1684+ ),
1685+ $ expressionParser ->parse ($ tokens )
1686+ );
1687+
1688+ $ tokens = $ this ->createTokenIterator ('((foo)) ' );
1689+ $ this ->assertEquals (
1690+ new ExpressionNode (
1691+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 6 ]),
1692+ root: new ValueReferenceNode (
1693+ rangeInSource: $ this ->range ([0 , 2 ], [0 , 4 ]),
1694+ name: VariableName::from ('foo ' )
1695+ )
1696+ ),
1697+ $ expressionParser ->parse ($ tokens )
1698+ );
1699+
1700+ $ tokens = $ this ->createTokenIterator ('(((foo))) ' );
1701+ $ this ->assertEquals (
1702+ new ExpressionNode (
1703+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 8 ]),
1704+ root: new ValueReferenceNode (
1705+ rangeInSource: $ this ->range ([0 , 3 ], [0 , 5 ]),
1706+ name: VariableName::from ('foo ' )
1707+ )
1708+ ),
1709+ $ expressionParser ->parse ($ tokens )
1710+ );
1711+ }
16111712}
0 commit comments