mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-27 13:13:31 +00:00
Updated Rector to commit b201787edc
b201787edc
add FQN support resolver to DoctrineAnnotationClassToAttributeRector (#1261)
This commit is contained in:
parent
dc03241b5b
commit
80f6e79b45
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
2
vendor/autoload.php
vendored
|
@ -4,4 +4,4 @@
|
|||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInite188f0420dcb75cdb5dc38f0090863f5::getLoader();
|
||||
return ComposerAutoloaderInitf2ca7e7db57f62e3b83a35517e094ee8::getLoader();
|
||||
|
|
14
vendor/composer/autoload_real.php
vendored
14
vendor/composer/autoload_real.php
vendored
|
@ -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;
|
||||
|
|
8
vendor/composer/autoload_static.php
vendored
8
vendor/composer/autoload_static.php
vendored
|
@ -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);
|
||||
}
|
||||
|
|
10
vendor/scoper-autoload.php
vendored
10
vendor/scoper-autoload.php
vendored
|
@ -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')) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user