Skip to content

Commit e43dd7a

Browse files
authored
[DowngradePhp80] Handle multiple coalesce before throw on DowngradeThrowExprRector (#283)
* [DowngradePhp80] Handle multiple coalesce before throw on DowngradeThrowExprRector * direct assign * Fix * fix to use composer/install v2
1 parent 22ce946 commit e43dd7a

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

.github/workflows/tests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ jobs:
2525
coverage: none
2626
ini-values: zend.assertions=1
2727

28-
- uses: "ramsey/composer-install@v1"
28+
- uses: "ramsey/composer-install@v2"
2929

3030
- run: vendor/bin/phpunit
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+
$contentId = $content->getInternalId() ?? $content->getId();
24+
if ($contentId === null) {
25+
throw new \LogicException('content id is required for ackVersion');
26+
}
27+
}
28+
}
29+
30+
?>

rules/DowngradePhp80/Rector/Expression/DowngradeThrowExprRector.php

Lines changed: 28 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, true);
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, bool $assignEarly = false): If_|null|array
206+
{
186207
if (! $this->coalesceAnalyzer->hasIssetableLeft($coalesce)) {
187208
return null;
188209
}
@@ -198,6 +219,13 @@ private function refactorCoalesce(Coalesce $coalesce, ?Assign $assign): If_|null
198219

199220
$assign->expr = $coalesce->left;
200221

222+
if ($assignEarly && $if->cond instanceof Identical) {
223+
$expression = new Expression(new Assign($assign->var, $if->cond->left));
224+
$if->cond->left = $assign->var;
225+
226+
return [$expression, $if];
227+
}
228+
201229
return [$if, new Expression($assign)];
202230
}
203231

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)