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); + } +} + +?> 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); + } +} + +?> diff --git a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php index 14d42c9195f..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; @@ -33,7 +32,7 @@ public function __construct( public function decorateGenericIterableParamType( Type $type, PhpDocInfo $phpDocInfo, - ClassMethod $classMethod, + FunctionLike $functionLike, Param $param, string $parameterName ): bool { @@ -49,7 +48,7 @@ public function decorateGenericIterableParamType( return false; } - $this->phpDocTypeChanger->changeParamTypeNode($classMethod, $phpDocInfo, $param, $parameterName, $typeNode); + $this->phpDocTypeChanger->changeParamTypeNode($functionLike, $phpDocInfo, $param, $parameterName, $typeNode); return true; } diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php index b8f2ae415bd..9b6cf452a9e 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; @@ -12,13 +11,12 @@ use PhpParser\Node\Stmt\Function_; use PHPStan\Type\ArrayType; 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; @@ -31,8 +29,8 @@ public function __construct( private readonly ArrayMapClosureExprFinder $arrayMapClosureExprFinder, 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 +110,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; + } } } @@ -135,8 +136,6 @@ public function refactor(Node $node): ?Node return null; } - $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); - return $node; } @@ -148,30 +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; - } - - 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); - } } 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