Skip to content

Commit df07ca0

Browse files
committed
Updated Rector to commit a5395fc2837b19a76f9f98b4c5915341164afdac
rectorphp/rector-src@a5395fc [Php80] Prevent adding empty return when stringable always throws (#6968)
1 parent 53c8309 commit df07ca0

3 files changed

Lines changed: 19 additions & 4 deletions

File tree

rules/Php80/Rector/Class_/StringableForToStringRector.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
use PhpParser\Node\Scalar\String_;
1313
use PhpParser\Node\Stmt\Class_;
1414
use PhpParser\Node\Stmt\ClassMethod;
15+
use PhpParser\Node\Stmt\Expression;
1516
use PhpParser\Node\Stmt\Function_;
1617
use PhpParser\Node\Stmt\Return_;
1718
use PhpParser\NodeVisitor;
1819
use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer;
1920
use Rector\NodeAnalyzer\ClassAnalyzer;
21+
use Rector\NodeAnalyzer\TerminatedNodeAnalyzer;
2022
use Rector\PhpParser\Node\BetterNodeFinder;
2123
use Rector\Rector\AbstractRector;
2224
use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer;
@@ -46,17 +48,22 @@ final class StringableForToStringRector extends AbstractRector implements MinPhp
4648
* @readonly
4749
*/
4850
private BetterNodeFinder $betterNodeFinder;
51+
/**
52+
* @readonly
53+
*/
54+
private TerminatedNodeAnalyzer $terminatedNodeAnalyzer;
4955
/**
5056
* @var string
5157
*/
5258
private const STRINGABLE = 'Stringable';
5359
private bool $hasChanged = \false;
54-
public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer, ReturnTypeInferer $returnTypeInferer, ClassAnalyzer $classAnalyzer, BetterNodeFinder $betterNodeFinder)
60+
public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer, ReturnTypeInferer $returnTypeInferer, ClassAnalyzer $classAnalyzer, BetterNodeFinder $betterNodeFinder, TerminatedNodeAnalyzer $terminatedNodeAnalyzer)
5561
{
5662
$this->familyRelationsAnalyzer = $familyRelationsAnalyzer;
5763
$this->returnTypeInferer = $returnTypeInferer;
5864
$this->classAnalyzer = $classAnalyzer;
5965
$this->betterNodeFinder = $betterNodeFinder;
66+
$this->terminatedNodeAnalyzer = $terminatedNodeAnalyzer;
6067
}
6168
public function provideMinPhpVersion() : int
6269
{
@@ -135,6 +142,10 @@ private function processNotStringType(ClassMethod $toStringClassMethod) : void
135142
$hasReturn = $this->betterNodeFinder->hasInstancesOfInFunctionLikeScoped($toStringClassMethod, Return_::class);
136143
if (!$hasReturn) {
137144
$emptyStringReturn = new Return_(new String_(''));
145+
$lastStmt = $toStringClassMethod->stmts[\count($toStringClassMethod->stmts) - 1] ?? null;
146+
if ($lastStmt instanceof Expression && $this->terminatedNodeAnalyzer->isAlwaysTerminated($toStringClassMethod, $lastStmt, $emptyStringReturn)) {
147+
return;
148+
}
138149
$toStringClassMethod->stmts[] = $emptyStringReturn;
139150
$this->hasChanged = \true;
140151
return;

src/Application/VersionResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ final class VersionResolver
1919
* @api
2020
* @var string
2121
*/
22-
public const PACKAGE_VERSION = 'c2588bb049fd6eb4587f47e00bd269216fba0463';
22+
public const PACKAGE_VERSION = 'a5395fc2837b19a76f9f98b4c5915341164afdac';
2323
/**
2424
* @api
2525
* @var string
2626
*/
27-
public const RELEASE_DATE = '2025-06-09 11:26:53';
27+
public const RELEASE_DATE = '2025-06-09 20:46:01';
2828
/**
2929
* @var int
3030
*/

src/NodeAnalyzer/TerminatedNodeAnalyzer.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PhpParser\Node\Stmt;
1111
use PhpParser\Node\Stmt\Break_;
1212
use PhpParser\Node\Stmt\ClassLike;
13+
use PhpParser\Node\Stmt\ClassMethod;
1314
use PhpParser\Node\Stmt\Continue_;
1415
use PhpParser\Node\Stmt\Else_;
1516
use PhpParser\Node\Stmt\Expression;
@@ -40,7 +41,10 @@ final class TerminatedNodeAnalyzer
4041
* @var array<class-string<Node>>
4142
*/
4243
private const ALLOWED_CONTINUE_CURRENT_STMTS = [InlineHTML::class, Nop::class];
43-
public function isAlwaysTerminated(StmtsAwareInterface $stmtsAware, Stmt $node, Stmt $currentStmt) : bool
44+
/**
45+
* @param \Rector\Contract\PhpParser\Node\StmtsAwareInterface|\PhpParser\Node\Stmt\ClassMethod $stmtsAware
46+
*/
47+
public function isAlwaysTerminated($stmtsAware, Stmt $node, Stmt $currentStmt) : bool
4448
{
4549
if (\in_array(\get_class($currentStmt), self::ALLOWED_CONTINUE_CURRENT_STMTS, \true)) {
4650
return \false;

0 commit comments

Comments
 (0)