From fcedad6f8a5ab5cef31e5cf859f02255c86ff57a Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 30 Jun 2026 13:22:52 +0200 Subject: [PATCH] [CodeQuality] Keep parentheses around Ternary operand in SimplifyConditionsRector Fixes #8121 - inverting a binary op whose operand is a ternary dropped the parentheses, changing evaluation due to lower ternary precedence. --- .../Fixture/keep_parentheses.php.inc | 19 +++++++++++++++++++ .../Identical/SimplifyConditionsRector.php | 10 ++++++++++ 2 files changed, 29 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Identical/SimplifyConditionsRector/Fixture/keep_parentheses.php.inc diff --git a/rules-tests/CodeQuality/Rector/Identical/SimplifyConditionsRector/Fixture/keep_parentheses.php.inc b/rules-tests/CodeQuality/Rector/Identical/SimplifyConditionsRector/Fixture/keep_parentheses.php.inc new file mode 100644 index 00000000000..9ce312ce317 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Identical/SimplifyConditionsRector/Fixture/keep_parentheses.php.inc @@ -0,0 +1,19 @@ + +----- += (1 ? 2 : 1)) { + } +} + +?> diff --git a/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php b/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php index 45af8787a59..bff176492df 100644 --- a/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php +++ b/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php @@ -11,7 +11,9 @@ use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\BooleanNot; +use PhpParser\Node\Expr\Ternary; use Rector\NodeManipulator\BinaryOpManipulator; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php71\ValueObject\TwoNodeMatch; use Rector\PhpParser\Node\AssignAndBinaryMap; use Rector\PhpParser\Node\Value\ValueResolver; @@ -118,6 +120,14 @@ private function createInversedBooleanOp(BinaryOp $binaryOp): ?BinaryOp return null; } + if ($binaryOp->left instanceof Ternary) { + $binaryOp->left->setAttribute(AttributeKey::WRAPPED_IN_PARENTHESES, true); + } + + if ($binaryOp->right instanceof Ternary) { + $binaryOp->right->setAttribute(AttributeKey::WRAPPED_IN_PARENTHESES, true); + } + return new $inversedBinaryClass($binaryOp->left, $binaryOp->right); } }