rector/src/PhpDoc/PhpDocClassRenamer.php

82 lines
2.8 KiB
PHP
Raw Normal View History

2019-10-13 05:59:52 +00:00
<?php
declare(strict_types=1);
2019-08-30 18:21:21 +00:00
namespace Rector\Core\PhpDoc;
2019-08-30 18:21:21 +00:00
2019-09-26 14:26:44 +00:00
use Rector\BetterPhpDocParser\Contract\Doctrine\DoctrineRelationTagValueNodeInterface;
2019-08-30 19:41:21 +00:00
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\ValueObject\PhpDocNode\JMS\SerializerTypeTagValueNode;
use Rector\BetterPhpDocParser\ValueObject\PhpDocNode\Symfony\Validator\Constraints\AssertChoiceTagValueNode;
2019-08-30 18:21:21 +00:00
final class PhpDocClassRenamer
{
/**
* Covers annotations like @ORM, @Serializer, @Assert etc
* See https://github.com/rectorphp/rector/issues/1872
*
* @param string[] $oldToNewClasses
*/
public function changeTypeInAnnotationTypes(PhpDocInfo $phpDocInfo, array $oldToNewClasses): void
2019-08-30 18:21:21 +00:00
{
$this->processAssertChoiceTagValueNode($oldToNewClasses, $phpDocInfo);
$this->processDoctrineRelationTagValueNode($oldToNewClasses, $phpDocInfo);
2019-08-30 19:41:21 +00:00
$this->processSerializerTypeTagValueNode($oldToNewClasses, $phpDocInfo);
}
2019-08-30 18:21:21 +00:00
2019-08-30 19:41:21 +00:00
/**
* @param string[] $oldToNewClasses
*/
private function processAssertChoiceTagValueNode(array $oldToNewClasses, PhpDocInfo $phpDocInfo): void
2019-08-30 19:41:21 +00:00
{
2020-07-19 18:58:54 +00:00
$assertChoiceTagValueNode = $phpDocInfo->getByType(AssertChoiceTagValueNode::class);
if (! $assertChoiceTagValueNode instanceof AssertChoiceTagValueNode) {
2019-08-30 18:21:21 +00:00
return;
}
2019-08-30 19:41:21 +00:00
foreach ($oldToNewClasses as $oldClass => $newClass) {
2020-07-19 18:58:54 +00:00
if (! $assertChoiceTagValueNode->isCallbackClass($oldClass)) {
2019-08-30 19:41:21 +00:00
continue;
}
2020-07-19 18:58:54 +00:00
$assertChoiceTagValueNode->changeCallbackClass($newClass);
2019-08-30 19:41:21 +00:00
break;
2019-08-30 18:21:21 +00:00
}
2019-08-30 19:41:21 +00:00
}
2019-08-30 18:21:21 +00:00
2019-08-30 19:41:21 +00:00
/**
* @param string[] $oldToNewClasses
*/
private function processDoctrineRelationTagValueNode(array $oldToNewClasses, PhpDocInfo $phpDocInfo): void
2019-08-30 19:41:21 +00:00
{
$doctrineRelationTagValueNode = $phpDocInfo->getByType(DoctrineRelationTagValueNodeInterface::class);
if (! $doctrineRelationTagValueNode instanceof DoctrineRelationTagValueNodeInterface) {
2019-08-30 19:41:21 +00:00
return;
}
foreach ($oldToNewClasses as $oldClass => $newClass) {
if ($doctrineRelationTagValueNode->getFullyQualifiedTargetEntity() !== $oldClass) {
2019-08-30 19:41:21 +00:00
continue;
}
$doctrineRelationTagValueNode->changeTargetEntity($newClass);
2019-08-30 19:41:21 +00:00
break;
}
}
/**
* @param string[] $oldToNewClasses
*/
private function processSerializerTypeTagValueNode(array $oldToNewClasses, PhpDocInfo $phpDocInfo): void
{
$serializerTypeTagValueNode = $phpDocInfo->getByType(SerializerTypeTagValueNode::class);
if (! $serializerTypeTagValueNode instanceof SerializerTypeTagValueNode) {
return;
}
foreach ($oldToNewClasses as $oldClass => $newClass) {
2020-01-30 21:11:29 +00:00
$serializerTypeTagValueNode->replaceName($oldClass, $newClass);
2019-08-30 19:41:21 +00:00
}
2019-08-30 18:21:21 +00:00
}
}