|
11 | 11 | use PhpParser\Node\Expr\BinaryOp\NotIdentical; |
12 | 12 | use PhpParser\Node\Expr\Isset_; |
13 | 13 | use PhpParser\Node\Expr\Ternary; |
| 14 | +use Rector\NodeTypeResolver\Node\AttributeKey; |
14 | 15 | use Rector\PhpParser\Node\Value\ValueResolver; |
15 | 16 | use Rector\Rector\AbstractRector; |
| 17 | +use Rector\ValueObject\Application\File; |
16 | 18 | use Rector\ValueObject\PhpVersionFeature; |
17 | 19 | use Rector\VersionBonding\Contract\MinPhpVersionInterface; |
18 | 20 | use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; |
@@ -112,9 +114,43 @@ private function processTernaryWithIsset(Ternary $ternary, Isset_ $isset): ?Coal |
112 | 114 | return null; |
113 | 115 | } |
114 | 116 |
|
| 117 | + if ($ternary->else instanceof Ternary && $this->isTernaryParenthesized($this->file, $ternary->cond, $ternary)) { |
| 118 | + $ternary->else->setAttribute(AttributeKey::WRAPPED_IN_PARENTHESES, true); |
| 119 | + } |
| 120 | + |
115 | 121 | return new Coalesce($ternary->if, $ternary->else); |
116 | 122 | } |
117 | 123 |
|
| 124 | + private function isTernaryParenthesized(File $file, Expr $expr, Ternary $ternary): bool |
| 125 | + { |
| 126 | + $oldTokens = $file->getOldTokens(); |
| 127 | + $endTokenPost = $ternary->getEndTokenPos(); |
| 128 | + |
| 129 | + if (isset($oldTokens[$endTokenPost]) && (string) $oldTokens[$endTokenPost] === ')') { |
| 130 | + $startTokenPos = $ternary->else->getStartTokenPos(); |
| 131 | + $previousEndTokenPost = $expr->getEndTokenPos(); |
| 132 | + |
| 133 | + while ($startTokenPos > $previousEndTokenPost) { |
| 134 | + --$startTokenPos; |
| 135 | + |
| 136 | + if (! isset($oldTokens[$startTokenPos])) { |
| 137 | + return false; |
| 138 | + } |
| 139 | + |
| 140 | + // handle space before open parentheses |
| 141 | + if (trim((string) $oldTokens[$startTokenPos]) === '') { |
| 142 | + continue; |
| 143 | + } |
| 144 | + |
| 145 | + return (string) $oldTokens[$startTokenPos] === '('; |
| 146 | + } |
| 147 | + |
| 148 | + return false; |
| 149 | + } |
| 150 | + |
| 151 | + return false; |
| 152 | + } |
| 153 | + |
118 | 154 | private function isNullMatch(Expr $possibleNullExpr, Expr $firstNode, Expr $secondNode): bool |
119 | 155 | { |
120 | 156 | if (! $this->valueResolver->isNull($possibleNullExpr)) { |
|
0 commit comments