From 3ebb47c459b85b1fd04ca16c92050c9a10b528c8 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 23 Sep 2025 20:46:51 +0700 Subject: [PATCH 1/2] [TypeDeclaration] Skip already has @ return docblock on AddReturnArrayDocblockBasedOnArrayMapRector --- .../skip_already_has_return_doc.php.inc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector/Fixture/skip_already_has_return_doc.php.inc diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector/Fixture/skip_already_has_return_doc.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector/Fixture/skip_already_has_return_doc.php.inc new file mode 100644 index 00000000000..968e5c169b7 --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector/Fixture/skip_already_has_return_doc.php.inc @@ -0,0 +1,18 @@ + + */ + public function process(array $items) + { + return array_map(function ($item): stdClass { + return $item; + }, $items); + } +} From 01d343609d3db9e2013fd296cbcf10726237d35a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 23 Sep 2025 20:53:55 +0700 Subject: [PATCH 2/2] Fix --- .../AddReturnArrayDocblockBasedOnArrayMapRector.php | 6 ++++++ .../AddReturnDocblockForCommonObjectDenominatorRector.php | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector.php index d820ddedcef..832fc9480aa 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PHPStan\Type\ArrayType; +use PHPStan\Type\IntersectionType; use PHPStan\Type\MixedType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; @@ -125,6 +126,11 @@ public function refactor(Node $node): null|Function_|ClassMethod $functionLikePhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $returnOriginalType = $functionLikePhpDocInfo->getReturnType(); + if ($returnOriginalType instanceof IntersectionType && $returnOriginalType->isArray()->yes()) { + return null; + } + $hasChanged = $this->phpDocTypeChanger->changeReturnType($node, $functionLikePhpDocInfo, $arrayType); if ($hasChanged) { return $node; diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddReturnDocblockForCommonObjectDenominatorRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddReturnDocblockForCommonObjectDenominatorRector.php index bd0e8474a51..b12e0b160d4 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddReturnDocblockForCommonObjectDenominatorRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddReturnDocblockForCommonObjectDenominatorRector.php @@ -9,7 +9,6 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ArrayType; use PHPStan\Type\Constant\ConstantArrayType; @@ -109,10 +108,6 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); - if ($phpDocInfo->getReturnTagValue() instanceof ReturnTagValueNode) { - return null; - } - $returnType = $phpDocInfo->getReturnType(); if (! $returnType instanceof MixedType || $returnType->isExplicitMixed()) {