From 4569e7f24e5e8d48b7510ded50493096a7078135 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 30 Sep 2025 20:19:32 +0700 Subject: [PATCH 1/3] [TypeDeclarationDocblocks] Allow override dummy array param on AddParamArrayDocblockFromDataProviderRector --- .../override_dummy_array_param.php.inc | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/override_dummy_array_param.php.inc 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 @@ + +----- + From 7fbf5ed3050a9bff8f3715678ecbc2c0f44f5ea7 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 30 Sep 2025 20:24:49 +0700 Subject: [PATCH 2/3] implemented --- .../NodeDocblockTypeDecorator.php | 4 ++ ...ramArrayDocblockFromDataProviderRector.php | 38 +++++++------------ 2 files changed, 17 insertions(+), 25 deletions(-) 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/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); } } From 9022fbb33807c19fe91aea0f1341be35422b77f9 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 30 Sep 2025 13:27:33 +0000 Subject: [PATCH 3/3] [ci-review] Rector Rectify --- ...dParamArrayDocblockFromAssignsParamToParamReferenceRector.php | 1 - 1 file changed, 1 deletion(-) 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;