diff --git a/packages/Doctrine/tests/Rector/Property/AddUuidAnnotationsToIdPropertyRector/Fixture/fixture.php.inc b/packages/Doctrine/tests/Rector/Property/AddUuidAnnotationsToIdPropertyRector/Fixture/fixture.php.inc index 1d6b1b94a74c..363f13a056a2 100644 --- a/packages/Doctrine/tests/Rector/Property/AddUuidAnnotationsToIdPropertyRector/Fixture/fixture.php.inc +++ b/packages/Doctrine/tests/Rector/Property/AddUuidAnnotationsToIdPropertyRector/Fixture/fixture.php.inc @@ -37,10 +37,10 @@ use JMS\Serializer\Annotation as Serializer; class SomeFixture { /** + * @var \Ramsey\Uuid\UuidInterface * @ORM\Id * @ORM\Column(type="uuid_binary") * @Serializer\Type("string") - * @var \Ramsey\Uuid\UuidInterface */ private $id; } diff --git a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php index 045a44a54c5c..c4e22fb1fecd 100644 --- a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php +++ b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php @@ -10,7 +10,6 @@ use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\Ast\PhpDocNodeTraverser; -use Rector\Exception\ShouldNotHappenException; use Rector\NodeTypeResolver\StaticTypeMapper; final class DocBlockClassRenamer @@ -54,14 +53,9 @@ function (PhpDocParserNode $node) use ($phpParserNode, $oldType, $newType): PhpD return $node; } - $newIdentifierType = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($newType); - if ($newIdentifierType === null) { - throw new ShouldNotHappenException(); - } - $this->hasNodeChanged = true; - return $newIdentifierType; + return $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($newType); } ); diff --git a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php index a6b94bcdee85..edaef744fe76 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\PhpDocNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\Type\ArrayType; use PHPStan\Type\Constant\ConstantArrayType; @@ -256,8 +257,22 @@ public function changeVarTag(Node $node, Type $newType): void } } - $this->removeTagFromNode($node, 'var', true); - $this->addTypeSpecificTag($node, 'var', $newType); + if ($this->hasTag($node, '@var')) { + // just change the type + $varTag = $this->getTagByName($node, '@var'); + + /** @var VarTagValueNode $varTagValueNode */ + $varTagValueNode = $varTag->value; + + $phpDocType = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($newType); + $varTagValueNode->type = $phpDocType; + + // update doc :) + $phpDocInfo = $this->createPhpDocInfoFromNode($node); + $this->updateNodeWithPhpDocInfo($node, $phpDocInfo); + } else { + $this->addTypeSpecificTag($node, 'var', $newType); + } // to invoke the node override $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); diff --git a/packages/NodeTypeResolver/src/StaticTypeMapper.php b/packages/NodeTypeResolver/src/StaticTypeMapper.php index 4e659aaac79d..4235291d5f73 100644 --- a/packages/NodeTypeResolver/src/StaticTypeMapper.php +++ b/packages/NodeTypeResolver/src/StaticTypeMapper.php @@ -91,7 +91,7 @@ public function __construct( $this->objectTypeSpecifier = $objectTypeSpecifier; } - public function mapPHPStanTypeToPHPStanPhpDocTypeNode(Type $phpStanType): ?TypeNode + public function mapPHPStanTypeToPHPStanPhpDocTypeNode(Type $phpStanType): TypeNode { if ($phpStanType instanceof UnionType) { $unionTypesNodes = []; @@ -104,10 +104,6 @@ public function mapPHPStanTypeToPHPStanPhpDocTypeNode(Type $phpStanType): ?TypeN if ($phpStanType instanceof ArrayType) { $itemTypeNode = $this->mapPHPStanTypeToPHPStanPhpDocTypeNode($phpStanType->getItemType()); - if ($itemTypeNode === null) { - throw new ShouldNotHappenException(); - } - return new ArrayTypeNode($itemTypeNode); } diff --git a/packages/TypeDeclaration/tests/Rector/Property/CompleteVarDocTypePropertyRector/CompleteVarDocTypePropertyRectorTest.php b/packages/TypeDeclaration/tests/Rector/Property/CompleteVarDocTypePropertyRector/CompleteVarDocTypePropertyRectorTest.php index 1dfa134f7262..2701a80bd39c 100644 --- a/packages/TypeDeclaration/tests/Rector/Property/CompleteVarDocTypePropertyRector/CompleteVarDocTypePropertyRectorTest.php +++ b/packages/TypeDeclaration/tests/Rector/Property/CompleteVarDocTypePropertyRector/CompleteVarDocTypePropertyRectorTest.php @@ -20,6 +20,7 @@ public function test(string $file): void public function provideDataForTest(): Iterator { + yield [__DIR__ . '/Fixture/keep_comment.php.inc']; yield [__DIR__ . '/Fixture/property_assign.php.inc']; yield [__DIR__ . '/Fixture/default_value.php.inc']; yield [__DIR__ . '/Fixture/assign_conflict.php.inc']; diff --git a/packages/TypeDeclaration/tests/Rector/Property/CompleteVarDocTypePropertyRector/Fixture/keep_comment.php.inc b/packages/TypeDeclaration/tests/Rector/Property/CompleteVarDocTypePropertyRector/Fixture/keep_comment.php.inc new file mode 100644 index 000000000000..81ea7e6aaa17 --- /dev/null +++ b/packages/TypeDeclaration/tests/Rector/Property/CompleteVarDocTypePropertyRector/Fixture/keep_comment.php.inc @@ -0,0 +1,43 @@ +ids[] = 'hello'; + if (random_int(1, 100)) { + $this->ids = 'hey'; + } + } +} + +?> +----- +ids[] = 'hello'; + if (random_int(1, 100)) { + $this->ids = 'hey'; + } + } +} + +?>