Skip to content

Commit d6200f2

Browse files
committed
skip multiple yield from
1 parent 26eadb0 commit d6200f2

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Rector\PHPUnit\Tests\CodeQuality\Rector\Class_\YieldDataProviderRector\Fixture;
4+
5+
use PHPUnit\Framework\TestCase;
6+
7+
final class SkipMultipleYieldFrom extends TestCase
8+
{
9+
#[\PHPUnit\Framework\Attributes\DataProvider('dataProvider')]
10+
public function test(string $val1, string $val2): void
11+
{
12+
}
13+
14+
public static function dataProvider(): iterable
15+
{
16+
yield from [
17+
['value1', 'value2'],
18+
['value3', 'value4'],
19+
];
20+
yield from [
21+
['value5', 'value6'],
22+
['value7', 'value8'],
23+
];
24+
}
25+
26+
}
27+
28+
?>

rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
2323
use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer;
2424
use Rector\NodeTypeResolver\Node\AttributeKey;
25+
use Rector\PhpParser\Node\BetterNodeFinder;
2526
use Rector\PhpParser\NodeTransformer;
2627
use Rector\PHPStan\ScopeFetcher;
2728
use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer;
@@ -45,7 +46,8 @@ public function __construct(
4546
private readonly PhpDocInfoFactory $phpDocInfoFactory,
4647
private readonly IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer,
4748
private readonly PhpDocTypeChanger $phpDocTypeChanger,
48-
private readonly DocBlockUpdater $docBlockUpdater
49+
private readonly DocBlockUpdater $docBlockUpdater,
50+
private readonly BetterNodeFinder $betterNodeFinder,
4951
) {
5052
}
5153

@@ -130,24 +132,30 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod
130132
return null;
131133
}
132134

133-
$yieldFromOrReturn = null;
135+
$yieldedFromExpr = null;
134136
foreach ($classMethod->stmts as $statement) {
135137
if ($statement instanceof Expression) {
136138
$statement = $statement->expr;
137139
}
138140

139-
if ($statement instanceof Return_ || $statement instanceof YieldFrom) {
141+
if ($statement instanceof Return_) {
140142
$returnedExpr = $statement->expr;
141143

142144
if (! $returnedExpr instanceof Array_) {
143145
return null;
144146
}
145147

146-
if ($yieldFromOrReturn instanceof Array_) {
148+
return $returnedExpr;
149+
} elseif ($statement instanceof YieldFrom) {
150+
if (! $statement->expr instanceof Array_) {
147151
return null;
148152
}
149153

150-
$yieldFromOrReturn = $returnedExpr;
154+
if ($yieldedFromExpr !== null) {
155+
return null;
156+
}
157+
158+
$yieldedFromExpr = $statement->expr;
151159
} elseif (
152160
! $statement instanceof Assign
153161
&& ! $statement instanceof AssignRef
@@ -157,7 +165,7 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod
157165
}
158166
}
159167

160-
return $yieldFromOrReturn;
168+
return $yieldedFromExpr;
161169
}
162170

163171
private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Array_ $array): void

0 commit comments

Comments
 (0)