Skip to content

Commit f6963ae

Browse files
[TypeDeclarationDocblocks] Allow override dummy array param on AddParamArrayDocblockFromDataProviderRector (#7376)
* [TypeDeclarationDocblocks] Allow override dummy array param on AddParamArrayDocblockFromDataProviderRector * implemented * [ci-review] Rector Rectify --------- Co-authored-by: GitHub Action <actions@github.com>
1 parent 8d39262 commit f6963ae

File tree

4 files changed

+66
-26
lines changed

4 files changed

+66
-26
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDataProviderRector\Fixture;
4+
5+
use PHPUnit\Framework\Attributes\DataProvider;
6+
use PHPUnit\Framework\TestCase;
7+
8+
final class OverrideDummyArrayParam extends TestCase
9+
{
10+
/**
11+
* @param array $names
12+
*/
13+
#[DataProvider('provideData')]
14+
public function test(array $names): void
15+
{
16+
}
17+
18+
public static function provideData()
19+
{
20+
yield [['Tom', 'John']];
21+
}
22+
}
23+
24+
?>
25+
-----
26+
<?php
27+
28+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDataProviderRector\Fixture;
29+
30+
use PHPUnit\Framework\Attributes\DataProvider;
31+
use PHPUnit\Framework\TestCase;
32+
33+
final class OverrideDummyArrayParam extends TestCase
34+
{
35+
/**
36+
* @param string[] $names
37+
*/
38+
#[DataProvider('provideData')]
39+
public function test(array $names): void
40+
{
41+
}
42+
43+
public static function provideData()
44+
{
45+
yield [['Tom', 'John']];
46+
}
47+
}
48+
49+
?>

rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ private function addTagValueNodeAndUpdatePhpDocInfo(
130130

131131
private function isBareMixedType(Type $type): bool
132132
{
133+
if ($type instanceof MixedType) {
134+
return true;
135+
}
136+
133137
$normalizedResolvedParameterType = $this->typeNormalizer->generalizeConstantTypes($type);
134138

135139
// most likely mixed, skip

rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use PhpParser\Node;
88
use PhpParser\Node\Identifier;
99
use PhpParser\Node\Stmt\ClassMethod;
10-
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
1110
use PHPStan\Type\ArrayType;
1211
use PHPStan\Type\MixedType;
1312
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;

rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,13 @@
66

77
use PhpParser\Node;
88
use PhpParser\Node\Stmt\Class_;
9-
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
10-
use PHPStan\Type\ArrayType;
11-
use PHPStan\Type\MixedType;
129
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
13-
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
1410
use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer;
15-
use Rector\Privatization\TypeManipulator\TypeNormalizer;
1611
use Rector\Rector\AbstractRector;
17-
use Rector\StaticTypeMapper\StaticTypeMapper;
1812
use Rector\TypeDeclaration\TypeAnalyzer\ParameterTypeFromDataProviderResolver;
13+
use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator;
1914
use Rector\TypeDeclarationDocblocks\NodeFinder\DataProviderMethodsFinder;
15+
use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer;
2016
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
2117
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
2218

@@ -27,12 +23,11 @@ final class AddParamArrayDocblockFromDataProviderRector extends AbstractRector
2723
{
2824
public function __construct(
2925
private readonly PhpDocInfoFactory $phpDocInfoFactory,
30-
private readonly DocBlockUpdater $docBlockUpdater,
3126
private readonly TestsNodeAnalyzer $testsNodeAnalyzer,
3227
private readonly DataProviderMethodsFinder $dataProviderMethodsFinder,
3328
private readonly ParameterTypeFromDataProviderResolver $parameterTypeFromDataProviderResolver,
34-
private readonly StaticTypeMapper $staticTypeMapper,
35-
private readonly TypeNormalizer $typeNormalizer,
29+
private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer,
30+
private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator
3631
) {
3732
}
3833

@@ -137,7 +132,7 @@ public function refactor(Node $node): ?Node
137132
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName);
138133

139134
// already defined, lets skip it
140-
if ($paramTagValueNode instanceof ParamTagValueNode) {
135+
if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag($paramTagValueNode)) {
141136
continue;
142137
}
143138

@@ -146,26 +141,19 @@ public function refactor(Node $node): ?Node
146141
$dataProviderNodes->getClassMethods()
147142
);
148143

149-
// skip mixed type, as it is not informative
150-
if ($parameterType instanceof ArrayType && $parameterType->getItemType() instanceof MixedType) {
151-
continue;
152-
}
144+
$hasParamTypeChanged = $this->nodeDocblockTypeDecorator->decorateGenericIterableParamType(
145+
$parameterType,
146+
$phpDocInfo,
147+
$classMethod,
148+
$param,
149+
$paramName
150+
);
153151

154-
if ($parameterType instanceof MixedType) {
152+
if (! $hasParamTypeChanged) {
155153
continue;
156154
}
157155

158-
$generalizedParameterType = $this->typeNormalizer->generalizeConstantTypes($parameterType);
159-
160-
$parameterTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode(
161-
$generalizedParameterType
162-
);
163-
164-
$paramTagValueNode = new ParamTagValueNode($parameterTypeNode, false, '$' . $paramName, '', false);
165-
$phpDocInfo->addTagValueNode($paramTagValueNode);
166156
$hasChanged = true;
167-
168-
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod);
169157
}
170158

171159
}

0 commit comments

Comments
 (0)