Skip to content

Commit b650d6e

Browse files
samsonasikstaabm
andauthored
[PHPUnit] Change @return array<> to @return Iterator<> on YieldDataProviderRector (#415)
* YieldDataProviderRector: added failling test * Update use_data_provider_with_phpdoc.php.inc * Update rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/use_data_provider_with_phpdoc.php.inc Co-authored-by: Abdul Malik Ikhsan <[email protected]> * Closes #414 --------- Co-authored-by: Markus Staab <[email protected]> Co-authored-by: Markus Staab <[email protected]>
1 parent 2c63591 commit b650d6e

File tree

2 files changed

+81
-2
lines changed

2 files changed

+81
-2
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
namespace Rector\PHPUnit\Tests\CodeQuality\Rector\Class_\YieldDataProviderRector\Fixture;
4+
5+
use PHPUnit\Framework\TestCase;
6+
7+
final class UseDataProviderTestPhpdoc extends TestCase
8+
{
9+
#[\PHPUnit\Framework\Attributes\DataProvider('dataProvider')]
10+
#[\PHPUnit\Framework\Attributes\DataProvider('provideDataForProvider')]
11+
public function test(string $filePath): void
12+
{
13+
}
14+
15+
/** @return array<int, array<string>> */
16+
public static function provideDataForProvider()
17+
{
18+
return [
19+
['<?php implode("", $foo, );', '<?php implode($foo, "", );']
20+
];
21+
}
22+
23+
public static function dataProvider()
24+
{
25+
return [
26+
['<?php implode(\'\', $foo, );', '<?php implode($foo, );'],
27+
['<?php implode(\'\', $foo, );', '<?php implode($foo, );']
28+
];
29+
}
30+
}
31+
32+
?>
33+
-----
34+
<?php
35+
36+
namespace Rector\PHPUnit\Tests\CodeQuality\Rector\Class_\YieldDataProviderRector\Fixture;
37+
38+
use PHPUnit\Framework\TestCase;
39+
40+
final class UseDataProviderTestPhpdoc extends TestCase
41+
{
42+
#[\PHPUnit\Framework\Attributes\DataProvider('dataProvider')]
43+
#[\PHPUnit\Framework\Attributes\DataProvider('provideDataForProvider')]
44+
public function test(string $filePath): void
45+
{
46+
}
47+
48+
/** @return \Iterator<int, array<string>> */
49+
public static function provideDataForProvider(): \Iterator
50+
{
51+
yield ['<?php implode("", $foo, );', '<?php implode($foo, "", );'];
52+
}
53+
54+
public static function dataProvider(): \Iterator
55+
{
56+
yield ['<?php implode(\'\', $foo, );', '<?php implode($foo, );'];
57+
yield ['<?php implode(\'\', $foo, );', '<?php implode($foo, );'];
58+
}
59+
}
60+
61+
?>

rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
use PhpParser\Node\Stmt\ClassMethod;
1212
use PhpParser\Node\Stmt\Return_;
1313
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
14+
use PHPStan\Type\ArrayType;
15+
use PHPStan\Type\Generic\GenericObjectType;
1416
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
17+
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
1518
use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer;
1619
use Rector\NodeTypeResolver\Node\AttributeKey;
1720
use Rector\PhpParser\NodeTransformer;
@@ -35,7 +38,8 @@ public function __construct(
3538
private readonly TestsNodeAnalyzer $testsNodeAnalyzer,
3639
private readonly DataProviderClassMethodFinder $dataProviderClassMethodFinder,
3740
private readonly PhpDocInfoFactory $phpDocInfoFactory,
38-
private readonly IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer
41+
private readonly IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer,
42+
private readonly PhpDocTypeChanger $phpDocTypeChanger,
3943
) {
4044
}
4145

@@ -166,6 +170,20 @@ private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Ar
166170
private function removeReturnTag(ClassMethod $classMethod): void
167171
{
168172
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod);
169-
$phpDocInfo->removeByType(ReturnTagValueNode::class);
173+
174+
if ($phpDocInfo->getReturnType() instanceof ArrayType) {
175+
$keyType = $phpDocInfo->getReturnType()
176+
->getIterableKeyType();
177+
$itemType = $phpDocInfo->getReturnType()
178+
->getIterableValueType();
179+
180+
$this->phpDocTypeChanger->changeReturnType(
181+
$classMethod,
182+
$phpDocInfo,
183+
new GenericObjectType('Iterator', [$keyType, $itemType])
184+
);
185+
} else {
186+
$phpDocInfo->removeByType(ReturnTagValueNode::class);
187+
}
170188
}
171189
}

0 commit comments

Comments
 (0)