Skip to content

Commit 0c91a0f

Browse files
authored
[Php80] Handle has silent void on StringableForToStringRector (#6970)
* [Php80] Handle has silent void on StringableForToStringRector * s * clean up * more fixture
1 parent ccfbef8 commit 0c91a0f

3 files changed

Lines changed: 76 additions & 14 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\Php80\Rector\Class_\StringableForToStringRector\Fixture;
6+
7+
class PossibleVoid
8+
{
9+
public function __toString()
10+
{
11+
if (rand(0, 1)) {
12+
return 'something';
13+
}
14+
}
15+
}
16+
17+
?>
18+
-----
19+
<?php
20+
21+
declare(strict_types=1);
22+
23+
namespace Rector\Tests\Php80\Rector\Class_\StringableForToStringRector\Fixture;
24+
25+
class PossibleVoid implements \Stringable
26+
{
27+
public function __toString(): string
28+
{
29+
if (rand(0, 1)) {
30+
return 'something';
31+
}
32+
return '';
33+
}
34+
}
35+
36+
?>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\Php80\Rector\Class_\StringableForToStringRector\Fixture;
6+
7+
class PossibleVoid2
8+
{
9+
public function __toString()
10+
{
11+
if (rand(0, 1)) {
12+
return;
13+
}
14+
return 'something';
15+
}
16+
}
17+
18+
?>
19+
-----
20+
<?php
21+
22+
declare(strict_types=1);
23+
24+
namespace Rector\Tests\Php80\Rector\Class_\StringableForToStringRector\Fixture;
25+
26+
class PossibleVoid2 implements \Stringable
27+
{
28+
public function __toString(): string
29+
{
30+
if (rand(0, 1)) {
31+
return '';
32+
}
33+
return 'something';
34+
}
35+
}
36+
37+
?>

rules/Php80/Rector/Class_/StringableForToStringRector.php

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,16 @@
1111
use PhpParser\Node\Identifier;
1212
use PhpParser\Node\Name\FullyQualified;
1313
use PhpParser\Node\Scalar\String_;
14-
use PhpParser\Node\Stmt;
1514
use PhpParser\Node\Stmt\Class_;
1615
use PhpParser\Node\Stmt\ClassMethod;
1716
use PhpParser\Node\Stmt\Function_;
1817
use PhpParser\Node\Stmt\Return_;
1918
use PhpParser\NodeVisitor;
2019
use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer;
2120
use Rector\NodeAnalyzer\ClassAnalyzer;
22-
use Rector\NodeAnalyzer\TerminatedNodeAnalyzer;
23-
use Rector\PhpParser\Node\BetterNodeFinder;
2421
use Rector\Rector\AbstractRector;
2522
use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer;
23+
use Rector\TypeDeclaration\TypeInferer\SilentVoidResolver;
2624
use Rector\ValueObject\MethodName;
2725
use Rector\ValueObject\PhpVersionFeature;
2826
use Rector\VersionBonding\Contract\MinPhpVersionInterface;
@@ -45,8 +43,7 @@ public function __construct(
4543
private readonly FamilyRelationsAnalyzer $familyRelationsAnalyzer,
4644
private readonly ReturnTypeInferer $returnTypeInferer,
4745
private readonly ClassAnalyzer $classAnalyzer,
48-
private readonly BetterNodeFinder $betterNodeFinder,
49-
private readonly TerminatedNodeAnalyzer $terminatedNodeAnalyzer
46+
private readonly SilentVoidResolver $silentVoidResolver
5047
) {
5148
}
5249

@@ -145,16 +142,8 @@ private function processNotStringType(ClassMethod $toStringClassMethod): void
145142
return;
146143
}
147144

148-
$hasReturn = $this->betterNodeFinder->hasInstancesOfInFunctionLikeScoped($toStringClassMethod, Return_::class);
149-
if (! $hasReturn) {
145+
if ($this->silentVoidResolver->hasSilentVoid($toStringClassMethod)) {
150146
$emptyStringReturn = new Return_(new String_(''));
151-
152-
$lastStmt = $toStringClassMethod->stmts[count($toStringClassMethod->stmts) - 1] ?? null;
153-
154-
if ($lastStmt instanceof Stmt && $this->terminatedNodeAnalyzer->isAlwaysTerminated($toStringClassMethod, $lastStmt, $emptyStringReturn)) {
155-
return;
156-
}
157-
158147
$toStringClassMethod->stmts[] = $emptyStringReturn;
159148

160149
$this->hasChanged = true;

0 commit comments

Comments
 (0)