Skip to content

Commit 7bb52fb

Browse files
[DowngradePhp80] Handle short circuit on DowngradeNullsafeToTernaryOperatorRector (#254)
* [DowngradePhp80] Handle short circuit on DowngradeNullsafeToTernaryOperatorRector * [DowngradePhp80] Handle short circuit on DowngradeNullsafeToTernaryOperatorRector * [ci-review] Rector Rectify * more fixture * fix * [ci-review] Rector Rectify * cs fix --------- Co-authored-by: GitHub Action <[email protected]>
1 parent 8470519 commit 7bb52fb

File tree

6 files changed

+180
-4
lines changed

6 files changed

+180
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
4+
5+
final class ShortCircuit
6+
{
7+
public function run(bool $param)
8+
{
9+
return $this->clock?->now()->format('U.u');
10+
}
11+
}
12+
13+
?>
14+
-----
15+
<?php
16+
17+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
18+
19+
final class ShortCircuit
20+
{
21+
public function run(bool $param)
22+
{
23+
return ($nullsafeVariable1 = $this->clock) ? $nullsafeVariable1->now()->format('U.u') : null;
24+
}
25+
}
26+
27+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
4+
5+
final class ShortCircuit2
6+
{
7+
public function run(bool $param)
8+
{
9+
return $this->clock?->now()->format;
10+
}
11+
}
12+
13+
?>
14+
-----
15+
<?php
16+
17+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
18+
19+
final class ShortCircuit2
20+
{
21+
public function run(bool $param)
22+
{
23+
return ($nullsafeVariable1 = $this->clock) ? $nullsafeVariable1->now()->format : null;
24+
}
25+
}
26+
27+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
4+
5+
final class ShortCircuit3
6+
{
7+
public function run(bool $param)
8+
{
9+
return $this->clock?->now->format;
10+
}
11+
}
12+
13+
?>
14+
-----
15+
<?php
16+
17+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
18+
19+
final class ShortCircuit3
20+
{
21+
public function run(bool $param)
22+
{
23+
return ($nullsafeVariable1 = $this->clock) ? $nullsafeVariable1->now->format : null;
24+
}
25+
}
26+
27+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
4+
5+
final class ShortCircuit4
6+
{
7+
public function run(bool $param)
8+
{
9+
return $this->clock?->now->format('U.u');
10+
}
11+
}
12+
13+
?>
14+
-----
15+
<?php
16+
17+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
18+
19+
final class ShortCircuit4
20+
{
21+
public function run(bool $param)
22+
{
23+
return ($nullsafeVariable1 = $this->clock) ? $nullsafeVariable1->now->format('U.u') : null;
24+
}
25+
}
26+
27+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
4+
5+
final class ShortCircuit5
6+
{
7+
public function run(bool $param)
8+
{
9+
return $this->clock?->now()->format;
10+
}
11+
}
12+
13+
?>
14+
-----
15+
<?php
16+
17+
namespace Rector\Tests\DowngradePhp80\Rector\NullsafeMethodCall\DowngradeNullsafeToTernaryOperatorRector\Fixture;
18+
19+
final class ShortCircuit5
20+
{
21+
public function run(bool $param)
22+
{
23+
return ($nullsafeVariable1 = $this->clock) ? $nullsafeVariable1->now()->format : null;
24+
}
25+
}
26+
27+
?>

rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,59 @@ public function getRuleDefinition(): RuleDefinition
5555
*/
5656
public function getNodeTypes(): array
5757
{
58-
return [NullsafeMethodCall::class, NullsafePropertyFetch::class];
58+
return [MethodCall::class, PropertyFetch::class, NullsafeMethodCall::class, NullsafePropertyFetch::class];
5959
}
6060

6161
/**
62-
* @param NullsafeMethodCall|NullsafePropertyFetch $node
62+
* @param MethodCall|NullsafeMethodCall|NullsafePropertyFetch $node
6363
*/
64-
public function refactor(Node $node): Ternary
64+
public function refactor(Node $node): ?Ternary
6565
{
66+
if ($node instanceof MethodCall || $node instanceof PropertyFetch) {
67+
if ($node->var instanceof NullsafeMethodCall || $node->var instanceof NullsafePropertyFetch) {
68+
$nullsafeVariable = $this->createNullsafeVariable();
69+
70+
$assign = new Assign($nullsafeVariable, $node->var->var);
71+
if ($node instanceof MethodCall) {
72+
if ($node->var instanceof NullsafeMethodCall) {
73+
$methodCallOrPropertyFetch = new MethodCall(new MethodCall(
74+
$nullsafeVariable,
75+
$node->var->name,
76+
$node->var->args
77+
), $node->name, $node->args);
78+
return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull());
79+
}
80+
81+
$methodCallOrPropertyFetch = new MethodCall(new PropertyFetch(
82+
$nullsafeVariable,
83+
$node->var->name
84+
), $node->name, $node->args);
85+
return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull());
86+
}
87+
88+
if ($node->var instanceof NullsafeMethodCall) {
89+
$methodCallOrPropertyFetch = new PropertyFetch(new MethodCall(
90+
$nullsafeVariable,
91+
$node->var->name,
92+
$node->var->args
93+
), $node->name);
94+
return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull());
95+
}
96+
97+
$methodCallOrPropertyFetch = new PropertyFetch(new PropertyFetch(
98+
$nullsafeVariable,
99+
$node->var->name
100+
), $node->name);
101+
return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull());
102+
}
103+
104+
return null;
105+
}
106+
66107
$nullsafeVariable = $this->createNullsafeVariable();
67108

68109
$methodCallOrPropertyFetch = $node instanceof NullsafeMethodCall
69-
? new MethodCall($nullsafeVariable, $node->name, $node->getArgs())
110+
? new MethodCall($nullsafeVariable, $node->name, $node->args)
70111
: new PropertyFetch($nullsafeVariable, $node->name);
71112

72113
$assign = new Assign($nullsafeVariable, $node->var);

0 commit comments

Comments
 (0)