rector/packages/PhpAttribute/Printer/DoctrineAnnotationFactory.php
Tomas Votruba 36facd801f Updated Rector to commit cfc7c5b2ec917f6cb7f610b147faaef83a6a3483
cfc7c5b2ec [Downgrade PHP 8.0] Add DowngradeAttributeToAnnotationRector (#93)
2021-05-23 12:45:00 +00:00

50 lines
1.8 KiB
PHP

<?php
declare (strict_types=1);
namespace Rector\PhpAttribute\Printer;
use PhpParser\Node\Arg;
use PhpParser\Node\Attribute;
use PhpParser\Node\Scalar\String_;
use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode;
use Rector\Core\PhpParser\Printer\BetterStandardPrinter;
use Rector\NodeTypeResolver\Node\AttributeKey;
final class DoctrineAnnotationFactory
{
/**
* @var \Rector\Core\PhpParser\Printer\BetterStandardPrinter
*/
private $betterStandardPrinter;
public function __construct(\Rector\Core\PhpParser\Printer\BetterStandardPrinter $betterStandardPrinter)
{
$this->betterStandardPrinter = $betterStandardPrinter;
}
public function createFromAttribute(\PhpParser\Node\Attribute $attribute, string $className) : \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode
{
$items = $this->createItemsFromArgs($attribute->args);
return new \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode($className, null, $items);
}
/**
* @param Arg[] $args
* @return mixed[]
*/
private function createItemsFromArgs(array $args) : array
{
$items = [];
foreach ($args as $arg) {
if ($arg->value instanceof \PhpParser\Node\Scalar\String_) {
// standardize double quotes for annotations
$arg->value->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::KIND, \PhpParser\Node\Scalar\String_::KIND_DOUBLE_QUOTED);
}
$itemValue = $this->betterStandardPrinter->print($arg->value);
if ($arg->name !== null) {
$name = $this->betterStandardPrinter->print($arg->name);
$items[$name] = $itemValue;
} else {
$items[] = $itemValue;
}
}
return $items;
}
}