diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector/Fixture/override_dummy_array_param.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector/Fixture/override_dummy_array_param.php.inc new file mode 100644 index 00000000000..9c26cd1216f --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector/Fixture/override_dummy_array_param.php.inc @@ -0,0 +1,33 @@ + +----- + diff --git a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php index 2178a14a9f6..a526ad68ee1 100644 --- a/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php +++ b/rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php @@ -4,6 +4,7 @@ namespace Rector\TypeDeclarationDocblocks; +use PhpParser\Node\Param; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; @@ -18,6 +19,7 @@ use PHPStan\Type\NeverType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Privatization\TypeManipulator\TypeNormalizer; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -28,6 +30,7 @@ public function __construct( private TypeNormalizer $typeNormalizer, private StaticTypeMapper $staticTypeMapper, private DocBlockUpdater $docBlockUpdater, + private PhpDocTypeChanger $phpDocTypeChanger ) { } @@ -35,6 +38,7 @@ public function decorateGenericIterableParamType( Type $type, PhpDocInfo $phpDocInfo, ClassMethod $classMethod, + Param $param, string $parameterName ): bool { if ($this->isBareMixedType($type)) { @@ -50,9 +54,7 @@ public function decorateGenericIterableParamType( return false; } - $paramTagValueNode = new ParamTagValueNode($typeNode, false, '$' . $parameterName, '', false); - - $this->addTagValueNodeAndUpdatePhpDocInfo($phpDocInfo, $paramTagValueNode, $classMethod); + $this->phpDocTypeChanger->changeParamType($classMethod, $phpDocInfo, $normalizedType, $param, $parameterName); return true; } diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php index a67d880da1e..1805942e693 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php @@ -14,6 +14,7 @@ use Rector\Rector\AbstractRector; use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator; use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayDimFetchFinder; +use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -25,6 +26,7 @@ final class AddParamArrayDocblockFromAssignsParamToParamReferenceRector extends public function __construct( private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly ArrayDimFetchFinder $arrayDimFetchFinder, + private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer, private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator, ) { } @@ -101,7 +103,9 @@ 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; } @@ -114,11 +118,11 @@ public function refactor(Node $node): ?Node $assignedExprType = $this->getType($exprs[0]); $iterableType = new ArrayType(new MixedType(), $assignedExprType); - $hasParamTypeChanged = $this->nodeDocblockTypeDecorator->decorateGenericIterableParamType( $iterableType, $phpDocInfo, $node, + $param, $paramName ); diff --git a/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php b/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php index 36408389a68..ddf5f25009d 100644 --- a/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php @@ -127,6 +127,7 @@ public function refactor(Node $node): ?Node $resolvedParameterType, $classMethodPhpDocInfo, $classMethod, + $param, $parameterName ); diff --git a/rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php b/rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php index e714fab753b..bff9f6a1f18 100644 --- a/rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php +++ b/rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php @@ -4,18 +4,19 @@ namespace Rector\TypeDeclarationDocblocks\TagNodeAnalyzer; +use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; final class UsefulArrayTagNodeAnalyzer { - public function isUsefulArrayTag(?ReturnTagValueNode $returnTagValueNode): bool + public function isUsefulArrayTag(null|ReturnTagValueNode|ParamTagValueNode $tagValueNode): bool { - if (! $returnTagValueNode instanceof ReturnTagValueNode) { + if (! $tagValueNode instanceof ReturnTagValueNode && ! $tagValueNode instanceof ParamTagValueNode) { return false; } - $type = $returnTagValueNode->type; + $type = $tagValueNode->type; if (! $type instanceof IdentifierTypeNode) { return true; }