From d96f04106338a2a0b12151671bdc94ffe486862d Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 11 Aug 2025 20:03:49 +0700 Subject: [PATCH] [TypeDeclaration] Keep Generic type docblock on TypedPropertyFromDocblockSetUpDefinedRector --- .../Fixture/keep_generic_type_doc.php.inc | 43 +++++++++++++++++++ ...PropertyFromDocblockSetUpDefinedRector.php | 17 +++++++- 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 rules-tests/TypeDeclaration/Rector/Class_/TypedPropertyFromDocblockSetUpDefinedRector/Fixture/keep_generic_type_doc.php.inc diff --git a/rules-tests/TypeDeclaration/Rector/Class_/TypedPropertyFromDocblockSetUpDefinedRector/Fixture/keep_generic_type_doc.php.inc b/rules-tests/TypeDeclaration/Rector/Class_/TypedPropertyFromDocblockSetUpDefinedRector/Fixture/keep_generic_type_doc.php.inc new file mode 100644 index 00000000000..ac1056a79f6 --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/Class_/TypedPropertyFromDocblockSetUpDefinedRector/Fixture/keep_generic_type_doc.php.inc @@ -0,0 +1,43 @@ + + */ + private $someType; + + protected function setUp(): void + { + $this->someType = $this->create('string'); + } +} + +?> +----- + + */ + private \Iterator $someType; + + protected function setUp(): void + { + $this->someType = $this->create('string'); + } +} + +?> \ No newline at end of file diff --git a/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromDocblockSetUpDefinedRector.php b/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromDocblockSetUpDefinedRector.php index 8e50b591ff6..98d73554fec 100644 --- a/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromDocblockSetUpDefinedRector.php +++ b/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromDocblockSetUpDefinedRector.php @@ -13,6 +13,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; +use Rector\DeadCode\PhpDoc\DeadVarTagValueNodeAnalyzer; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; @@ -34,7 +35,8 @@ public function __construct( private readonly ConstructorAssignDetector $constructorAssignDetector, private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly StaticTypeMapper $staticTypeMapper, - private readonly DocBlockUpdater $docBlockUpdater + private readonly DocBlockUpdater $docBlockUpdater, + private readonly DeadVarTagValueNodeAnalyzer $deadVarTagValueNodeAnalyzer ) { } @@ -145,10 +147,11 @@ public function refactor(Node $node): ?Node continue; } + $property->type = $nativePropertyTypeNode; + // remove var tag $this->removeVarTag($propertyPhpDocInfo, $property); - $property->type = $nativePropertyTypeNode; $hasChanged = true; } @@ -166,6 +169,16 @@ public function provideMinPhpVersion(): int private function removeVarTag(PhpDocInfo $propertyPhpDocInfo, Property $property): void { + $varTagValueNode = $propertyPhpDocInfo->getVarTagValueNode(); + + if (! $varTagValueNode instanceof VarTagValueNode) { + return; + } + + if (! $this->deadVarTagValueNodeAnalyzer->isDead($varTagValueNode, $property)) { + return; + } + $propertyPhpDocInfo->removeByType(VarTagValueNode::class); $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($property); }