rector/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.php

56 lines
2.6 KiB
PHP

<?php
declare (strict_types=1);
namespace Rector\BetterPhpDocParser\PhpDocManipulator;
use PHPStan\PhpDocParser\Ast\Node;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use RectorPrefix20210808\Symplify\SimplePhpDocParser\PhpDocNodeTraverser;
final class PhpDocTagRemover
{
public function removeByName(\Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo $phpDocInfo, string $name) : void
{
$phpDocNode = $phpDocInfo->getPhpDocNode();
foreach ($phpDocNode->children as $key => $phpDocChildNode) {
if (!$phpDocChildNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode) {
continue;
}
if ($this->areAnnotationNamesEqual($name, $phpDocChildNode->name)) {
unset($phpDocNode->children[$key]);
$phpDocInfo->markAsChanged();
}
if ($phpDocChildNode->value instanceof \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode) {
$doctrineAnnotationTagValueNode = $phpDocChildNode->value;
if ($doctrineAnnotationTagValueNode->hasClassName($name)) {
unset($phpDocNode->children[$key]);
$phpDocInfo->markAsChanged();
}
}
}
}
public function removeTagValueFromNode(\Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo $phpDocInfo, \PHPStan\PhpDocParser\Ast\Node $desiredNode) : void
{
$phpDocNode = $phpDocInfo->getPhpDocNode();
$phpDocNodeTraverser = new \RectorPrefix20210808\Symplify\SimplePhpDocParser\PhpDocNodeTraverser();
$phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function ($node) use($desiredNode, $phpDocInfo) : ?int {
if ($node instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode && $node->value === $desiredNode) {
$phpDocInfo->markAsChanged();
return \RectorPrefix20210808\Symplify\SimplePhpDocParser\PhpDocNodeTraverser::NODE_REMOVE;
}
if ($node !== $desiredNode) {
return null;
}
$phpDocInfo->markAsChanged();
return \RectorPrefix20210808\Symplify\SimplePhpDocParser\PhpDocNodeTraverser::NODE_REMOVE;
});
}
private function areAnnotationNamesEqual(string $firstAnnotationName, string $secondAnnotationName) : bool
{
$firstAnnotationName = \trim($firstAnnotationName, '@');
$secondAnnotationName = \trim($secondAnnotationName, '@');
return $firstAnnotationName === $secondAnnotationName;
}
}