From 11e96c7ca6159cfa6fc5be93a2dfd92b5670a34d Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 7 Oct 2025 19:02:40 +0700 Subject: [PATCH 1/8] [TypeDeclarationDocblocks] Use existing UsefulArrayTagNodeAnalyzer and NodeDocblockTypeDecorator services that specifically handle/validate bare mixed already on AddParamArrayDocblockBasedOnArrayMapRector --- ...aramArrayDocblockBasedOnArrayMapRector.php | 41 ++++++++----------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php index b8f2ae415bd..7cd6975744d 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php @@ -4,7 +4,6 @@ namespace Rector\TypeDeclarationDocblocks\Rector\ClassMethod; -use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Param; @@ -14,11 +13,12 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; +use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator; use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayMapClosureExprFinder; +use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -32,7 +32,8 @@ public function __construct( private readonly StaticTypeMapper $staticTypeMapper, private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly DocBlockUpdater $docBlockUpdater, - private readonly PhpDocTypeChanger $phpDocTypeChanger, + private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer, + private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator ) { } @@ -112,21 +113,24 @@ public function refactor(Node $node): ?Node continue; } - $paramType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($paramTypeNode); - $arrayParamType = new ArrayType(new MixedType(), $paramType); - - if ($this->isAlreadyNonMixedParamType($functionPhpDocInfo, $paramName)) { + if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag( + $functionPhpDocInfo->getParamTagValueByName($paramName) + )) { continue; } - $this->phpDocTypeChanger->changeParamType( - $node, - $functionPhpDocInfo, + $paramType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($paramTypeNode); + $arrayParamType = new ArrayType(new MixedType(), $paramType); + + if ($this->nodeDocblockTypeDecorator->decorateGenericIterableParamType( $arrayParamType, + $functionPhpDocInfo, + $node, $param, $paramName - ); - $hasChanged = true; + )) { + $hasChanged = true; + } } } @@ -161,17 +165,4 @@ private function isMixedArrayType(Type $type): bool return $type->getKeyType() instanceof MixedType; } - - private function isAlreadyNonMixedParamType( - PhpDocInfo $functionPhpDocInfo, - string $paramName - ): bool { - $currentParamType = $functionPhpDocInfo->getParamType($paramName); - if ($currentParamType instanceof MixedType) { - return false; - } - - // has useful param type already? - return ! $this->isMixedArrayType($currentParamType); - } } From 053b716516cd7c3565526df8b6b62e9c0f68b8e8 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 7 Oct 2025 19:02:47 +0700 Subject: [PATCH 2/8] [TypeDeclarationDocblocks] Use existing UsefulArrayTagNodeAnalyzer and NodeDocblockTypeDecorator services that specifically handle/validate bare mixed already on AddParamArrayDocblockBasedOnArrayMapRector --- .../ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php index 7cd6975744d..07446eb2533 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php @@ -139,8 +139,6 @@ public function refactor(Node $node): ?Node return null; } - $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); - return $node; } From eb23fa16ff50ddf1ee4c5c15f2e7feb3883f7afc Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 7 Oct 2025 19:04:28 +0700 Subject: [PATCH 3/8] [TypeDeclarationDocblocks] Use existing UsefulArrayTagNodeAnalyzer and NodeDocblockTypeDecorator services that specifically handle/validate bare mixed already on AddParamArrayDocblockBasedOnArrayMapRector --- ...ddParamArrayDocblockBasedOnArrayMapRector.php | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php index 07446eb2533..9b6cf452a9e 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php @@ -11,9 +11,7 @@ use PhpParser\Node\Stmt\Function_; use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; -use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator; @@ -31,7 +29,6 @@ public function __construct( private readonly ArrayMapClosureExprFinder $arrayMapClosureExprFinder, private readonly StaticTypeMapper $staticTypeMapper, private readonly PhpDocInfoFactory $phpDocInfoFactory, - private readonly DocBlockUpdater $docBlockUpdater, private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer, private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator ) { @@ -150,17 +147,4 @@ private function isArrayParam(Param $param): bool return $this->isName($param->type, 'array'); } - - private function isMixedArrayType(Type $type): bool - { - if (! $type instanceof ArrayType) { - return false; - } - - if (! $type->getItemType() instanceof MixedType) { - return false; - } - - return $type->getKeyType() instanceof MixedType; - } } From 70af0c0f4a27f62eed9d491218ac924a62656350 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 7 Oct 2025 19:05:49 +0700 Subject: [PATCH 4/8] [TypeDeclarationDocblocks] Use existing UsefulArrayTagNodeAnalyzer and NodeDocblockTypeDecorator services that specifically handle/validate bare mixed already on AddParamArrayDocblockBasedOnArrayMapRector --- .../Fixture/override_bare_mixed.php.inc | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_bare_mixed.php.inc diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_bare_mixed.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_bare_mixed.php.inc new file mode 100644 index 00000000000..c88c3b6b82f --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_bare_mixed.php.inc @@ -0,0 +1,33 @@ + trim($item), $items); + } +} + +?> +----- + trim($item), $items); + } +} + +?> From 3d14400d5e0b54c947df32901be2f1fd9855170b Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 7 Oct 2025 19:06:48 +0700 Subject: [PATCH 5/8] add more fixture --- .../Fixture/override_dummy_array.php.inc | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_dummy_array.php.inc diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_dummy_array.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_dummy_array.php.inc new file mode 100644 index 00000000000..425af84cf8e --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_dummy_array.php.inc @@ -0,0 +1,33 @@ + trim($item), $items); + } +} + +?> +----- + trim($item), $items); + } +} + +?> From 00430ebeb426a7a33d1f1990722ab8a987b84796 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 7 Oct 2025 19:12:32 +0700 Subject: [PATCH 6/8] fix --- rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php index 14d42c9195f..3224805356f 100644 --- a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php +++ b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php @@ -33,7 +33,7 @@ public function __construct( public function decorateGenericIterableParamType( Type $type, PhpDocInfo $phpDocInfo, - ClassMethod $classMethod, + FunctionLike $functionLike, Param $param, string $parameterName ): bool { @@ -49,7 +49,7 @@ public function decorateGenericIterableParamType( return false; } - $this->phpDocTypeChanger->changeParamTypeNode($classMethod, $phpDocInfo, $param, $parameterName, $typeNode); + $this->phpDocTypeChanger->changeParamTypeNode($functionLike, $phpDocInfo, $param, $parameterName, $typeNode); return true; } From eadad28853a8f3892dbf861d4c518a902d27ae0e Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 7 Oct 2025 12:15:32 +0000 Subject: [PATCH 7/8] [ci-review] Rector Rectify --- rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php | 1 - 1 file changed, 1 deletion(-) diff --git a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php index 3224805356f..6e552bf8ba7 100644 --- a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php +++ b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php @@ -6,7 +6,6 @@ use PhpParser\Node\FunctionLike; use PhpParser\Node\Param; -use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; From 502bb59d6f3dff6615dc6542ba3fcdabcbf745ea Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 7 Oct 2025 19:15:55 +0700 Subject: [PATCH 8/8] fix --- .../PhpDocManipulator/PhpDocTypeChanger.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php b/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php index 6e596d79c86..8cb0abd62bc 100644 --- a/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php +++ b/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php @@ -115,7 +115,7 @@ public function changeReturnTypeNode( } public function changeParamTypeNode( - ClassMethod $classMethod, + FunctionLike $functionLike, PhpDocInfo $phpDocInfo, Param $param, string $paramName, @@ -129,7 +129,7 @@ public function changeParamTypeNode( $phpDocInfo->addTagValueNode($paramTagValueNode); } - $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($functionLike); } public function changeReturnType(FunctionLike $functionLike, PhpDocInfo $phpDocInfo, Type $newType): bool