Updated Rector to commit b201787edc

b201787edc add FQN support resolver to DoctrineAnnotationClassToAttributeRector (#1261)
This commit is contained in:
Tomas Votruba 2021-11-17 21:39:26 +00:00
parent dc03241b5b
commit 80f6e79b45
6 changed files with 59 additions and 30 deletions

View File

@ -3,10 +3,12 @@
declare (strict_types=1);
namespace Rector\BetterPhpDocParser\PhpDocParser;
use RectorPrefix20211117\Nette\Utils\Strings;
use PhpParser\Node;
use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode;
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
use PHPStan\PhpDocParser\Lexer\Lexer;
use Rector\BetterPhpDocParser\Attributes\AttributeMirrorer;
@ -25,6 +27,11 @@ final class DoctrineAnnotationDecorator
* @var string[]
*/
private const ALLOWED_SHORT_ANNOTATIONS = ['Target'];
/**
* @see https://regex101.com/r/95kIw4/1
* @var string
*/
private const LONG_ANNOTATION_REGEX = '#@\\\\(?<class_name>.*?)(?<annotation_content>\\(.*?\\))#';
/**
* @var \Rector\Core\Configuration\CurrentNodeProvider
*/
@ -125,6 +132,20 @@ final class DoctrineAnnotationDecorator
private function transformGenericTagValueNodesToDoctrineAnnotationTagValueNodes(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PhpParser\Node $currentPhpNode) : void
{
foreach ($phpDocNode->children as $key => $phpDocChildNode) {
// the @\FQN use case
if ($phpDocChildNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode) {
$match = \RectorPrefix20211117\Nette\Utils\Strings::match($phpDocChildNode->text, self::LONG_ANNOTATION_REGEX);
$fullyQualifiedAnnotationClass = $match['class_name'] ?? null;
if ($fullyQualifiedAnnotationClass === null) {
continue;
}
$annotationContent = $match['annotation_content'] ?? null;
$tagName = '@\\' . $fullyQualifiedAnnotationClass;
$formerStartEnd = $phpDocChildNode->getAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::START_AND_END);
$spacelessPhpDocTagNode = $this->createDoctrineSpacelessPhpDocTagNode($annotationContent, $tagName, $fullyQualifiedAnnotationClass, $formerStartEnd);
$phpDocNode->children[$key] = $spacelessPhpDocTagNode;
continue;
}
if (!$phpDocChildNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode) {
continue;
}
@ -137,17 +158,7 @@ final class DoctrineAnnotationDecorator
if (\strpos($fullyQualifiedAnnotationClass, '\\') === \false && !\in_array($fullyQualifiedAnnotationClass, self::ALLOWED_SHORT_ANNOTATIONS, \true)) {
continue;
}
$genericTagValueNode = $phpDocChildNode->value;
$nestedTokenIterator = $this->tokenIteratorFactory->create($genericTagValueNode->value);
// mimics doctrine behavior just in phpdoc-parser syntax :)
// https://github.com/doctrine/annotations/blob/c66f06b7c83e9a2a7523351a9d5a4b55f885e574/lib/Doctrine/Common/Annotations/DocParser.php#L742
$values = $this->staticDoctrineAnnotationParser->resolveAnnotationMethodCall($nestedTokenIterator);
$formerStartEnd = $genericTagValueNode->getAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::START_AND_END);
$identifierTypeNode = new \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode($phpDocChildNode->name);
$identifierTypeNode->setAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::RESOLVED_CLASS, $fullyQualifiedAnnotationClass);
$doctrineAnnotationTagValueNode = new \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode($identifierTypeNode, $genericTagValueNode->value, $values, \Rector\BetterPhpDocParser\ValueObject\DoctrineAnnotation\SilentKeyMap::CLASS_NAMES_TO_SILENT_KEYS[$fullyQualifiedAnnotationClass] ?? null);
$doctrineAnnotationTagValueNode->setAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::START_AND_END, $formerStartEnd);
$spacelessPhpDocTagNode = new \Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode($phpDocChildNode->name, $doctrineAnnotationTagValueNode);
$spacelessPhpDocTagNode = $this->createSpacelessPhpDocTagNode($phpDocChildNode->name, $phpDocChildNode->value, $fullyQualifiedAnnotationClass);
$this->attributeMirrorer->mirror($phpDocChildNode, $spacelessPhpDocTagNode);
$phpDocNode->children[$key] = $spacelessPhpDocTagNode;
}
@ -176,4 +187,22 @@ final class DoctrineAnnotationDecorator
} while ($composedTokenIterator->currentPosition() < $tokenCount - 1);
return $openBracketCount === $closeBracketCount;
}
private function createSpacelessPhpDocTagNode(string $tagName, \PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode $genericTagValueNode, string $fullyQualifiedAnnotationClass) : \Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode
{
$annotationContent = $genericTagValueNode->value;
$formerStartEnd = $genericTagValueNode->getAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::START_AND_END);
return $this->createDoctrineSpacelessPhpDocTagNode($annotationContent, $tagName, $fullyQualifiedAnnotationClass, $formerStartEnd);
}
private function createDoctrineSpacelessPhpDocTagNode(string $annotationContent, string $tagName, string $fullyQualifiedAnnotationClass, \Rector\BetterPhpDocParser\ValueObject\StartAndEnd $startAndEnd) : \Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode
{
$nestedTokenIterator = $this->tokenIteratorFactory->create($annotationContent);
// mimics doctrine behavior just in phpdoc-parser syntax :)
// https://github.com/doctrine/annotations/blob/c66f06b7c83e9a2a7523351a9d5a4b55f885e574/lib/Doctrine/Common/Annotations/DocParser.php#L742
$values = $this->staticDoctrineAnnotationParser->resolveAnnotationMethodCall($nestedTokenIterator);
$identifierTypeNode = new \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode($tagName);
$identifierTypeNode->setAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::RESOLVED_CLASS, $fullyQualifiedAnnotationClass);
$doctrineAnnotationTagValueNode = new \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode($identifierTypeNode, $annotationContent, $values, \Rector\BetterPhpDocParser\ValueObject\DoctrineAnnotation\SilentKeyMap::CLASS_NAMES_TO_SILENT_KEYS[$fullyQualifiedAnnotationClass] ?? null);
$doctrineAnnotationTagValueNode->setAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::START_AND_END, $startAndEnd);
return new \Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode($tagName, $doctrineAnnotationTagValueNode);
}
}

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = 'd2f7c2ee24d41ed6570598ae66d49a81aafc3e9d';
public const PACKAGE_VERSION = 'b201787edc0cc033d0108505c600c7b2ecc889a3';
/**
* @var string
*/
public const RELEASE_DATE = '2021-11-17 17:30:06';
public const RELEASE_DATE = '2021-11-17 21:22:49';
public static function resolvePackageVersion() : string
{
$process = new \RectorPrefix20211117\Symfony\Component\Process\Process(['git', 'log', '--pretty="%H"', '-n1', 'HEAD'], __DIR__);

2
vendor/autoload.php vendored
View File

@ -4,4 +4,4 @@
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5::getLoader();
return ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8::getLoader();

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5
class ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8
{
private static $loader;
@ -22,15 +22,15 @@ class ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
spl_autoload_unregister(array('ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInite188f0420dcb75cdb5dc38f0090863f5::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitf2ca7e7db57f62e3b83a35517e094ee8::getInitializer($loader));
} else {
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
@ -42,19 +42,19 @@ class ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInite188f0420dcb75cdb5dc38f0090863f5::$files;
$includeFiles = Composer\Autoload\ComposerStaticInitf2ca7e7db57f62e3b83a35517e094ee8::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequiree188f0420dcb75cdb5dc38f0090863f5($fileIdentifier, $file);
composerRequiref2ca7e7db57f62e3b83a35517e094ee8($fileIdentifier, $file);
}
return $loader;
}
}
function composerRequiree188f0420dcb75cdb5dc38f0090863f5($fileIdentifier, $file)
function composerRequiref2ca7e7db57f62e3b83a35517e094ee8($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInite188f0420dcb75cdb5dc38f0090863f5
class ComposerStaticInitf2ca7e7db57f62e3b83a35517e094ee8
{
public static $files = array (
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
@ -3553,9 +3553,9 @@ class ComposerStaticInite188f0420dcb75cdb5dc38f0090863f5
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInite188f0420dcb75cdb5dc38f0090863f5::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInite188f0420dcb75cdb5dc38f0090863f5::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInite188f0420dcb75cdb5dc38f0090863f5::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitf2ca7e7db57f62e3b83a35517e094ee8::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitf2ca7e7db57f62e3b83a35517e094ee8::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitf2ca7e7db57f62e3b83a35517e094ee8::$classMap;
}, null, ClassLoader::class);
}

View File

@ -12,8 +12,8 @@ if (!class_exists('GenerateChangelogCommand', false) && !interface_exists('Gener
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20211117\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5', false) && !interface_exists('ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5', false) && !trait_exists('ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5', false)) {
spl_autoload_call('RectorPrefix20211117\ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5');
if (!class_exists('ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8', false) && !interface_exists('ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8', false) && !trait_exists('ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8', false)) {
spl_autoload_call('RectorPrefix20211117\ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8');
}
if (!class_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !interface_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !trait_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false)) {
spl_autoload_call('RectorPrefix20211117\Helmich\TypoScriptParser\Parser\AST\Statement');
@ -81,9 +81,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20211117\print_node(...func_get_args());
}
}
if (!function_exists('composerRequiree188f0420dcb75cdb5dc38f0090863f5')) {
function composerRequiree188f0420dcb75cdb5dc38f0090863f5() {
return \RectorPrefix20211117\composerRequiree188f0420dcb75cdb5dc38f0090863f5(...func_get_args());
if (!function_exists('composerRequiref2ca7e7db57f62e3b83a35517e094ee8')) {
function composerRequiref2ca7e7db57f62e3b83a35517e094ee8() {
return \RectorPrefix20211117\composerRequiref2ca7e7db57f62e3b83a35517e094ee8(...func_get_args());
}
}
if (!function_exists('parseArgs')) {