Skip to content

Commit c60b407

Browse files
committed
Turn yield from into multiple yield in PHPUnit Dataprovider
1 parent 948ddb1 commit c60b407

File tree

3 files changed

+93
-2
lines changed

3 files changed

+93
-2
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 SkipYieldFromExpr 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 self::someData();
17+
}
18+
19+
public static function someData(): iterable
20+
{
21+
yield ['value1', 'value2'];
22+
yield ['value3', 'value4'];
23+
yield ['value5', 'value6'];
24+
yield ['value7', 'value8'];
25+
}
26+
}
27+
28+
?>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace Rector\PHPUnit\Tests\CodeQuality\Rector\Class_\YieldDataProviderRector\Fixture;
4+
5+
use PHPUnit\Framework\TestCase;
6+
7+
final class UseDataProviderTest 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+
['value5', 'value6'],
20+
['value7', 'value8'],
21+
];
22+
}
23+
24+
}
25+
26+
?>
27+
-----
28+
<?php
29+
30+
namespace Rector\PHPUnit\Tests\CodeQuality\Rector\Class_\YieldDataProviderRector\Fixture;
31+
32+
use PHPUnit\Framework\TestCase;
33+
34+
final class UseDataProviderTest extends TestCase
35+
{
36+
#[\PHPUnit\Framework\Attributes\DataProvider('dataProvider')]
37+
public function test(string $val1, string $val2): void
38+
{
39+
}
40+
41+
public static function dataProvider(): \Iterator
42+
{
43+
yield ['value1', 'value2'];
44+
yield ['value3', 'value4'];
45+
yield ['value5', 'value6'];
46+
yield ['value7', 'value8'];
47+
}
48+
49+
}
50+
51+
?>

rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PhpParser\Node;
88
use PhpParser\Node\Expr\Array_;
9+
use PhpParser\Node\Expr\YieldFrom;
910
use PhpParser\Node\Name\FullyQualified;
1011
use PhpParser\Node\Stmt\Class_;
1112
use PhpParser\Node\Stmt\ClassMethod;
@@ -126,7 +127,11 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod
126127
}
127128

128129
foreach ($classMethod->stmts as $statement) {
129-
if ($statement instanceof Return_) {
130+
if ($statement instanceof Node\Stmt\Expression) {
131+
$statement = $statement->expr;
132+
}
133+
134+
if ($statement instanceof Return_ || $statement instanceof YieldFrom) {
130135
$returnedExpr = $statement->expr;
131136
if (! $returnedExpr instanceof Array_) {
132137
return null;
@@ -150,7 +155,14 @@ private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Ar
150155

151156
$commentReturn = [];
152157
foreach ((array) $classMethod->stmts as $key => $classMethodStmt) {
153-
if (! $classMethodStmt instanceof Return_) {
158+
if ($classMethodStmt instanceof Node\Stmt\Expression) {
159+
$classMethodStmt = $classMethodStmt->expr;
160+
}
161+
162+
if (
163+
! $classMethodStmt instanceof Return_
164+
&& ! $classMethodStmt instanceof YieldFrom
165+
) {
154166
continue;
155167
}
156168

0 commit comments

Comments
 (0)