diff --git a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php index 653dbcddab7..f418cf6795f 100644 --- a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php +++ b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php @@ -16,6 +16,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\Type\ArrayType; @@ -288,7 +289,20 @@ final class DocBlockManipulator return; } - $this->removeTagFromNode($node, 'return'); + if ($node->getDocComment()) { + $phpDocInfo = $this->createPhpDocInfoFromNode($node); + $returnTagValueNode = $phpDocInfo->getByType(ReturnTagValueNode::class); + + // overide existing type + if ($returnTagValueNode) { + $newPHPStanPhpDocType = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($newType); + $returnTagValueNode->type = $newPHPStanPhpDocType; + + $this->updateNodeWithPhpDocInfo($node, $phpDocInfo); + return; + } + } + $this->addTypeSpecificTag($node, 'return', $newType); } diff --git a/packages/NodeTypeResolver/src/StaticTypeMapper.php b/packages/NodeTypeResolver/src/StaticTypeMapper.php index dec4cac3634..4be091d0076 100644 --- a/packages/NodeTypeResolver/src/StaticTypeMapper.php +++ b/packages/NodeTypeResolver/src/StaticTypeMapper.php @@ -101,6 +101,8 @@ final class StaticTypeMapper $unionTypesNodes[] = $this->mapPHPStanTypeToPHPStanPhpDocTypeNode($unionedType); } + $unionTypesNodes = array_unique($unionTypesNodes); + return new AttributeAwareUnionTypeNode($unionTypesNodes); } @@ -129,6 +131,10 @@ final class StaticTypeMapper return new IdentifierTypeNode('\\' . $phpStanType->getClassName()); } + if ($phpStanType instanceof NullType) { + return new IdentifierTypeNode('null'); + } + throw new NotImplementedException(__METHOD__ . ' for ' . get_class($phpStanType)); } diff --git a/packages/TypeDeclaration/tests/Rector/ClassMethod/AddArrayReturnDocTypeRector/Fixture/with_comment.php.inc b/packages/TypeDeclaration/tests/Rector/ClassMethod/AddArrayReturnDocTypeRector/Fixture/with_comment.php.inc new file mode 100644 index 00000000000..03aeaaa781f --- /dev/null +++ b/packages/TypeDeclaration/tests/Rector/ClassMethod/AddArrayReturnDocTypeRector/Fixture/with_comment.php.inc @@ -0,0 +1,43 @@ +values; + } +} + +?> +----- +values; + } +} + +?>