Skip to content

Commit 4b40665

Browse files
committed
[DowngradePhp80] Handle multiple coalesce before throw on DowngradeThrowExprRector
1 parent 22ce946 commit 4b40665

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Rector\Tests\DowngradePhp80\Rector\Expression\DowngradeThrowExprRector\Fixture;
4+
5+
class MultipleCoalesce
6+
{
7+
public function run($content)
8+
{
9+
$contentId = $content->getInternalId() ?? $content->getId() ?? throw new \LogicException('content id is required for ackVersion');
10+
}
11+
}
12+
13+
?>
14+
-----
15+
<?php
16+
17+
namespace Rector\Tests\DowngradePhp80\Rector\Expression\DowngradeThrowExprRector\Fixture;
18+
19+
class MultipleCoalesce
20+
{
21+
public function run($content)
22+
{
23+
if (($content->getInternalId() ?? $content->getId()) === null) {
24+
throw new \LogicException('content id is required for ackVersion');
25+
}
26+
$contentId = $content->getInternalId() ?? $content->getId();
27+
}
28+
}
29+
30+
?>

rules/DowngradePhp80/Rector/Expression/DowngradeThrowExprRector.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,30 @@ private function refactorTernary(Ternary $ternary, ?Assign $assign): If_|null|ar
180180
private function refactorCoalesce(Coalesce $coalesce, ?Assign $assign): If_|null|array
181181
{
182182
if (! $coalesce->right instanceof Throw_) {
183+
$rightCoalesce = $coalesce->right;
184+
$leftCoalesce = $coalesce->left;
185+
186+
while ($rightCoalesce instanceof Coalesce) {
187+
$leftCoalesce = new Coalesce($leftCoalesce, $rightCoalesce->left);
188+
$rightCoalesce = $rightCoalesce->right;
189+
}
190+
191+
if ($rightCoalesce instanceof Throw_) {
192+
$coalesce = new Coalesce($leftCoalesce, $rightCoalesce);
193+
return $this->processCoalesce($coalesce, $assign);
194+
}
195+
183196
return null;
184197
}
185198

199+
return $this->processCoalesce($coalesce, $assign);
200+
}
201+
202+
/**
203+
* @return If_|Stmt[]|null
204+
*/
205+
private function processCoalesce(Coalesce $coalesce, ?Assign $assign): If_|null|array
206+
{
186207
if (! $this->coalesceAnalyzer->hasIssetableLeft($coalesce)) {
187208
return null;
188209
}

src/NodeAnalyzer/CoalesceAnalyzer.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ final class CoalesceAnalyzer
2525

2626
public function hasIssetableLeft(Coalesce $coalesce): bool
2727
{
28+
if ($coalesce->left instanceof Coalesce) {
29+
return true;
30+
}
31+
2832
$leftClass = $coalesce->left::class;
2933
return in_array($leftClass, self::ISSETABLE_EXPR, true);
3034
}

0 commit comments

Comments
 (0)