diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/override_dummy_array_param.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/override_dummy_array_param.php.inc new file mode 100644 index 00000000000..fe34b5646a1 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/override_dummy_array_param.php.inc @@ -0,0 +1,49 @@ + +----- + diff --git a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php index a526ad68ee1..2bf77471cac 100644 --- a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php +++ b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php @@ -130,6 +130,10 @@ private function addTagValueNodeAndUpdatePhpDocInfo( private function isBareMixedType(Type $type): bool { + if ($type instanceof MixedType) { + return true; + } + $normalizedResolvedParameterType = $this->typeNormalizer->generalizeConstantTypes($type); // most likely mixed, skip diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php index 1805942e693..97e4cbf7c72 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php @@ -7,7 +7,6 @@ use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php index 17dc975174c..50fd46c89b7 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php @@ -6,17 +6,13 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; -use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; -use PHPStan\Type\ArrayType; -use PHPStan\Type\MixedType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; -use Rector\Privatization\TypeManipulator\TypeNormalizer; use Rector\Rector\AbstractRector; -use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\TypeAnalyzer\ParameterTypeFromDataProviderResolver; +use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator; use Rector\TypeDeclarationDocblocks\NodeFinder\DataProviderMethodsFinder; +use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -27,12 +23,11 @@ final class AddParamArrayDocblockFromDataProviderRector extends AbstractRector { public function __construct( private readonly PhpDocInfoFactory $phpDocInfoFactory, - private readonly DocBlockUpdater $docBlockUpdater, private readonly TestsNodeAnalyzer $testsNodeAnalyzer, private readonly DataProviderMethodsFinder $dataProviderMethodsFinder, private readonly ParameterTypeFromDataProviderResolver $parameterTypeFromDataProviderResolver, - private readonly StaticTypeMapper $staticTypeMapper, - private readonly TypeNormalizer $typeNormalizer, + private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer, + private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator ) { } @@ -137,7 +132,7 @@ public function refactor(Node $node): ?Node $paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName); // already defined, lets skip it - if ($paramTagValueNode instanceof ParamTagValueNode) { + if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag($paramTagValueNode)) { continue; } @@ -146,26 +141,19 @@ public function refactor(Node $node): ?Node $dataProviderNodes->getClassMethods() ); - // skip mixed type, as it is not informative - if ($parameterType instanceof ArrayType && $parameterType->getItemType() instanceof MixedType) { - continue; - } + $hasParamTypeChanged = $this->nodeDocblockTypeDecorator->decorateGenericIterableParamType( + $parameterType, + $phpDocInfo, + $classMethod, + $param, + $paramName + ); - if ($parameterType instanceof MixedType) { + if (! $hasParamTypeChanged) { continue; } - $generalizedParameterType = $this->typeNormalizer->generalizeConstantTypes($parameterType); - - $parameterTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode( - $generalizedParameterType - ); - - $paramTagValueNode = new ParamTagValueNode($parameterTypeNode, false, '$' . $paramName, '', false); - $phpDocInfo->addTagValueNode($paramTagValueNode); $hasChanged = true; - - $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); } }