diff --git a/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php b/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php index 4201dcb73d7..4b256f8a614 100644 --- a/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php +++ b/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php @@ -5,6 +5,7 @@ namespace Rector\BetterPhpDocParser\PhpDocManipulator; use PhpParser\Node\Param; +use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\Type\Constant\ConstantArrayType; @@ -12,6 +13,7 @@ use PHPStan\Type\NeverType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; use Rector\PHPStanStaticTypeMapper\ValueObject\TypeKind; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -123,4 +125,24 @@ public function changeParamType(PhpDocInfo $phpDocInfo, Type $newType, Param $pa $phpDocInfo->addTagValueNode($paramTagValueNode); } } + + public function copyPropertyDocToParam(Property $property, Param $param): void + { + $phpDocInfo = $property->getAttribute(AttributeKey::PHP_DOC_INFO); + if (! $phpDocInfo) { + return; + } + + $varTag = $phpDocInfo->getVarTagValueNode(); + if (! $varTag instanceof VarTagValueNode) { + return; + } + + if ($varTag->description !== '') { + return; + } + + $phpDocInfo->removeByType(VarTagValueNode::class); + $param->setAttribute(AttributeKey::PHP_DOC_INFO, $phpDocInfo); + } } diff --git a/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/Fixture/copy_doc.php.inc b/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/Fixture/copy_doc.php.inc new file mode 100644 index 00000000000..31b260503c5 --- /dev/null +++ b/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/Fixture/copy_doc.php.inc @@ -0,0 +1,57 @@ +y = $y; + $this->z = $z; + } +} +?> +----- + diff --git a/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php b/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php index 8fb9be04ef3..597dc37ce09 100644 --- a/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php +++ b/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\Core\NodeAnalyzer\ParamAnalyzer; use Rector\Core\Rector\AbstractRector; @@ -37,7 +38,8 @@ public function __construct( private PromotedPropertyCandidateResolver $promotedPropertyCandidateResolver, private VariableRenamer $variableRenamer, private VarTagRemover $varTagRemover, - private ParamAnalyzer $paramAnalyzer + private ParamAnalyzer $paramAnalyzer, + private PhpDocTypeChanger $phpDocTypeChanger ) { } @@ -132,6 +134,8 @@ public function refactor(Node $node): ?Node // Copy over attributes of the "old" property $param->attrGroups = $property->attrGroups; $this->processNullableType($property, $param); + + $this->phpDocTypeChanger->copyPropertyDocToParam($property, $param); } return $node;