From 40470264db6443d2ed6010d80a9d4b4f9de4e0bd Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 19:45:30 +0200 Subject: [PATCH 01/10] YieldDataProviderRector: Added failling test --- .../skip_yield_from_with_return.php.inc | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc new file mode 100644 index 00000000..2b1c5808 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc @@ -0,0 +1,31 @@ + From af3a9ccf7d4de85de50aa36ce6074c103fc07066 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 19:47:35 +0200 Subject: [PATCH 02/10] fix --- rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index fe64c818..ad27b252 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -128,12 +128,16 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod } $totalStmts = count($classMethod->stmts); + if ($totalStmts !== 1) { + return null; + } + foreach ($classMethod->stmts as $statement) { if ($statement instanceof Expression) { $statement = $statement->expr; } - if ($statement instanceof Return_ || ($statement instanceof YieldFrom && $totalStmts === 1)) { + if ($statement instanceof Return_ || $statement instanceof YieldFrom) { $returnedExpr = $statement->expr; if (! $returnedExpr instanceof Array_) { return null; From a0bc509ff7a0aacc03837c3ef8751532287e2cb1 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 19:50:01 +0200 Subject: [PATCH 03/10] Update skip_yield_from_with_return.php.inc --- .../Fixture/skip_yield_from_with_return.php.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc index 2b1c5808..e2ceb145 100644 --- a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc @@ -4,7 +4,7 @@ namespace Rector\PHPUnit\Tests\CodeQuality\Rector\Class_\YieldDataProviderRector use PHPUnit\Framework\TestCase; -final class UseDataProviderTest extends TestCase +final class SkipYieldFromExprWithReturn extends TestCase { #[\PHPUnit\Framework\Attributes\DataProvider('dataProvider')] public function test(string $val1, string $val2): void From dda7f5ed69bcc3d87d8d9bbb71d80983f240f604 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 20:11:36 +0200 Subject: [PATCH 04/10] added another test --- .../Fixture/multi_stmts_return.php.inc | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/multi_stmts_return.php.inc diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/multi_stmts_return.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/multi_stmts_return.php.inc new file mode 100644 index 00000000..1b6cf78b --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/multi_stmts_return.php.inc @@ -0,0 +1,56 @@ + +----- + From 4d10c629215b3a0faf31d0ad2667e0916b9127b9 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 20:13:33 +0200 Subject: [PATCH 05/10] Update YieldDataProviderRector.php --- .../Rector/Class_/YieldDataProviderRector.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index ad27b252..a464b271 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -128,10 +128,8 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod } $totalStmts = count($classMethod->stmts); - if ($totalStmts !== 1) { - return null; - } + $yieldOrReturn = null; foreach ($classMethod->stmts as $statement) { if ($statement instanceof Expression) { $statement = $statement->expr; @@ -139,15 +137,26 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod if ($statement instanceof Return_ || $statement instanceof YieldFrom) { $returnedExpr = $statement->expr; + if (! $returnedExpr instanceof Array_) { return null; } - return $returnedExpr; + if ($yieldOrReturn !== null) { + return null; + } + + $yieldOrReturn = $returnedExpr; + } elseif ( + !$statement instanceof Node\Expr\Assign + && !$statement instanceof Node\Expr\AssignRef + && !$statement instanceof Node\Expr\AssignOp + ) { + return null; } } - return null; + return $yieldOrReturn; } private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Array_ $array): void From eca878f0b6c9e37f0d654405b07977a54bc94ba6 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 20:13:54 +0200 Subject: [PATCH 06/10] rector --- .../Rector/Class_/YieldDataProviderRector.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index a464b271..585f09e7 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -6,6 +6,9 @@ use PhpParser\Node; use PhpParser\Node\Expr\Array_; +use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\AssignOp; +use PhpParser\Node\Expr\AssignRef; use PhpParser\Node\Expr\YieldFrom; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; @@ -127,8 +130,6 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod return null; } - $totalStmts = count($classMethod->stmts); - $yieldOrReturn = null; foreach ($classMethod->stmts as $statement) { if ($statement instanceof Expression) { @@ -142,15 +143,15 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod return null; } - if ($yieldOrReturn !== null) { + if ($yieldOrReturn instanceof Array_) { return null; } $yieldOrReturn = $returnedExpr; } elseif ( - !$statement instanceof Node\Expr\Assign - && !$statement instanceof Node\Expr\AssignRef - && !$statement instanceof Node\Expr\AssignOp + ! $statement instanceof Assign + && ! $statement instanceof AssignRef + && ! $statement instanceof AssignOp ) { return null; } From 26eadb02407b7e1493655cbb216f580c568e5727 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 20:14:34 +0200 Subject: [PATCH 07/10] Update YieldDataProviderRector.php --- .../CodeQuality/Rector/Class_/YieldDataProviderRector.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index 585f09e7..f0e7d197 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -130,7 +130,7 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod return null; } - $yieldOrReturn = null; + $yieldFromOrReturn = null; foreach ($classMethod->stmts as $statement) { if ($statement instanceof Expression) { $statement = $statement->expr; @@ -143,11 +143,11 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod return null; } - if ($yieldOrReturn instanceof Array_) { + if ($yieldFromOrReturn instanceof Array_) { return null; } - $yieldOrReturn = $returnedExpr; + $yieldFromOrReturn = $returnedExpr; } elseif ( ! $statement instanceof Assign && ! $statement instanceof AssignRef @@ -157,7 +157,7 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod } } - return $yieldOrReturn; + return $yieldFromOrReturn; } private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Array_ $array): void From d6200f2cc79c3ab03a6ecf6bcd6360f3d8e990ee Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 20:42:31 +0200 Subject: [PATCH 08/10] skip multiple yield from --- .../Fixture/skip_yield_from_multiple.php.inc | 28 +++++++++++++++++++ .../Rector/Class_/YieldDataProviderRector.php | 20 +++++++++---- 2 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_multiple.php.inc diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_multiple.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_multiple.php.inc new file mode 100644 index 00000000..6eee4e9d --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_multiple.php.inc @@ -0,0 +1,28 @@ + diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index f0e7d197..d562731e 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -22,6 +22,7 @@ use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\NodeTransformer; use Rector\PHPStan\ScopeFetcher; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; @@ -45,7 +46,8 @@ public function __construct( private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer, private readonly PhpDocTypeChanger $phpDocTypeChanger, - private readonly DocBlockUpdater $docBlockUpdater + private readonly DocBlockUpdater $docBlockUpdater, + private readonly BetterNodeFinder $betterNodeFinder, ) { } @@ -130,24 +132,30 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod return null; } - $yieldFromOrReturn = null; + $yieldedFromExpr = null; foreach ($classMethod->stmts as $statement) { if ($statement instanceof Expression) { $statement = $statement->expr; } - if ($statement instanceof Return_ || $statement instanceof YieldFrom) { + if ($statement instanceof Return_) { $returnedExpr = $statement->expr; if (! $returnedExpr instanceof Array_) { return null; } - if ($yieldFromOrReturn instanceof Array_) { + return $returnedExpr; + } elseif ($statement instanceof YieldFrom) { + if (! $statement->expr instanceof Array_) { return null; } - $yieldFromOrReturn = $returnedExpr; + if ($yieldedFromExpr !== null) { + return null; + } + + $yieldedFromExpr = $statement->expr; } elseif ( ! $statement instanceof Assign && ! $statement instanceof AssignRef @@ -157,7 +165,7 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod } } - return $yieldFromOrReturn; + return $yieldedFromExpr; } private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Array_ $array): void From a6e40533f9829bdffa9122e99a030d48538020e2 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 20:42:47 +0200 Subject: [PATCH 09/10] run rector --- .../Rector/Class_/YieldDataProviderRector.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index d562731e..735d120d 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -22,7 +22,6 @@ use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; -use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\NodeTransformer; use Rector\PHPStan\ScopeFetcher; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; @@ -47,7 +46,6 @@ public function __construct( private readonly IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer, private readonly PhpDocTypeChanger $phpDocTypeChanger, private readonly DocBlockUpdater $docBlockUpdater, - private readonly BetterNodeFinder $betterNodeFinder, ) { } @@ -137,24 +135,21 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod if ($statement instanceof Expression) { $statement = $statement->expr; } - if ($statement instanceof Return_) { $returnedExpr = $statement->expr; - if (! $returnedExpr instanceof Array_) { return null; } - return $returnedExpr; - } elseif ($statement instanceof YieldFrom) { + } + + if ($statement instanceof YieldFrom) { if (! $statement->expr instanceof Array_) { return null; } - - if ($yieldedFromExpr !== null) { + if ($yieldedFromExpr instanceof Array_) { return null; } - $yieldedFromExpr = $statement->expr; } elseif ( ! $statement instanceof Assign From c129775cb1baa3f6cfda1be07a35415892747988 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 19 Oct 2025 20:44:13 +0200 Subject: [PATCH 10/10] run rector --- rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index 735d120d..71ccd6aa 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -135,11 +135,13 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod if ($statement instanceof Expression) { $statement = $statement->expr; } + if ($statement instanceof Return_) { $returnedExpr = $statement->expr; if (! $returnedExpr instanceof Array_) { return null; } + return $returnedExpr; } @@ -147,9 +149,11 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod if (! $statement->expr instanceof Array_) { return null; } + if ($yieldedFromExpr instanceof Array_) { return null; } + $yieldedFromExpr = $statement->expr; } elseif ( ! $statement instanceof Assign