From 7e217a5d21395354a2de353ed1a98b18fc7fa14d Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 17 Aug 2023 09:03:10 +0000 Subject: [PATCH] Updated Rector to commit 2604a47c32dd8606349a1724122977c8b2fa6bf9 https://github.com/rectorphp/rector-src/commit/2604a47c32dd8606349a1724122977c8b2fa6bf9 Faster AddReturnTypeDeclarationBasedOnParentClassMethodRector (#4804) --- .../ParentClassMethodTypeOverrideGuard.php | 33 ++++++++++----- ...larationBasedOnParentClassMethodRector.php | 40 +++++++++---------- src/Application/VersionResolver.php | 4 +- vendor/autoload.php | 2 +- vendor/composer/autoload_real.php | 10 ++--- vendor/composer/autoload_static.php | 8 ++-- 6 files changed, 55 insertions(+), 42 deletions(-) diff --git a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php index b7b49a4cd79..dfbe331ce67 100644 --- a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -12,6 +12,7 @@ use Rector\Core\Reflection\ReflectionResolver; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; use Rector\StaticTypeMapper\StaticTypeMapper; +use Rector\Tests\Naming\Rector\Foreach_\RenameForeachValueVariableToMatchMethodCallReturnTypeRector\Source\Method; use Rector\VendorLocker\Exception\UnresolvableClassException; final class ParentClassMethodTypeOverrideGuard { @@ -48,7 +49,10 @@ final class ParentClassMethodTypeOverrideGuard $this->staticTypeMapper = $staticTypeMapper; $this->classReflectionAnalyzer = $classReflectionAnalyzer; } - public function hasParentClassMethod(ClassMethod $classMethod) : bool + /** + * @param \PhpParser\Node\Stmt\ClassMethod|\PHPStan\Reflection\MethodReflection $classMethod + */ + public function hasParentClassMethod($classMethod) : bool { try { $parentClassMethod = $this->resolveParentClassMethod($classMethod); @@ -59,7 +63,10 @@ final class ParentClassMethodTypeOverrideGuard return \true; } } - public function getParentClassMethod(ClassMethod $classMethod) : ?MethodReflection + /** + * @param \PhpParser\Node\Stmt\ClassMethod|\PHPStan\Reflection\MethodReflection $classMethod + */ + public function getParentClassMethod($classMethod) : ?MethodReflection { try { return $this->resolveParentClassMethod($classMethod); @@ -78,15 +85,23 @@ final class ParentClassMethodTypeOverrideGuard } return $this->typeComparator->areTypesEqual($currentReturnType, $parentType); } - private function resolveParentClassMethod(ClassMethod $classMethod) : ?MethodReflection + /** + * @param \PhpParser\Node\Stmt\ClassMethod|\PHPStan\Reflection\MethodReflection $classMethod + */ + private function resolveParentClassMethod($classMethod) : ?MethodReflection { - $classReflection = $this->reflectionResolver->resolveClassReflection($classMethod); - if (!$classReflection instanceof ClassReflection) { - // we can't resolve the class, so we don't know. - throw new UnresolvableClassException(); + if ($classMethod instanceof ClassMethod) { + $classReflection = $this->reflectionResolver->resolveClassReflection($classMethod); + if (!$classReflection instanceof ClassReflection) { + // we can't resolve the class, so we don't know. + throw new UnresolvableClassException(); + } + /** @var string $methodName */ + $methodName = $this->nodeNameResolver->getName($classMethod); + } else { + $classReflection = $classMethod->getDeclaringClass(); + $methodName = $classMethod->getName(); } - /** @var string $methodName */ - $methodName = $this->nodeNameResolver->getName($classMethod); $currentClassReflection = $classReflection; while ($this->hasClassParent($currentClassReflection)) { $parentClassReflection = $currentClassReflection->getParentClass(); diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php index 97937d1083f..196b3e7dfe3 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php @@ -7,6 +7,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\MethodReflection; +use PHPStan\Reflection\ParametersAcceptorSelector; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; @@ -31,20 +32,14 @@ final class AddReturnTypeDeclarationBasedOnParentClassMethodRector extends Abstr * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ private $parentClassMethodTypeOverrideGuard; - /** - * @readonly - * @var \Rector\Core\PhpParser\AstResolver - */ - private $astResolver; /** * @readonly * @var \Rector\Core\Php\PhpVersionProvider */ private $phpVersionProvider; - public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, AstResolver $astResolver, PhpVersionProvider $phpVersionProvider) + public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, PhpVersionProvider $phpVersionProvider) { $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; - $this->astResolver = $astResolver; $this->phpVersionProvider = $phpVersionProvider; } public function provideMinPhpVersion() : int @@ -118,21 +113,24 @@ CODE_SAMPLE private function getReturnTypeRecursive(ClassMethod $classMethod) : ?Type { $returnType = $classMethod->getReturnType(); - if ($returnType === null) { - $parentMethodReflection = $this->parentClassMethodTypeOverrideGuard->getParentClassMethod($classMethod); - if (!$parentMethodReflection instanceof MethodReflection) { - return null; - } - $parentClassMethod = $this->astResolver->resolveClassMethodFromMethodReflection($parentMethodReflection); - if (!$parentClassMethod instanceof ClassMethod) { - return null; - } - if ($parentClassMethod->isPrivate()) { - return null; - } - return $this->getReturnTypeRecursive($parentClassMethod); + if ($returnType !== null) { + return $this->staticTypeMapper->mapPhpParserNodePHPStanType($returnType); } - return $this->staticTypeMapper->mapPhpParserNodePHPStanType($returnType); + $parentMethodReflection = $this->parentClassMethodTypeOverrideGuard->getParentClassMethod($classMethod); + while ($parentMethodReflection instanceof MethodReflection) { + if ($parentMethodReflection->isPrivate()) { + return null; + } + $parentReturnType = ParametersAcceptorSelector::selectSingle($parentMethodReflection->getVariants())->getReturnType(); + if (!$parentReturnType instanceof MixedType) { + return $parentReturnType; + } + if ($parentReturnType->isExplicitMixed()) { + return $parentReturnType; + } + $parentMethodReflection = $this->parentClassMethodTypeOverrideGuard->getParentClassMethod($parentMethodReflection); + } + return null; } private function processClassMethodReturnType(Class_ $class, ClassMethod $classMethod, Type $parentType) : ?ClassMethod { diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 66fc3dd6531..12cd1fe3496 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = '81caf1ea0dd2a204e8e209f3f1adab13448b2f9d'; + public const PACKAGE_VERSION = '2604a47c32dd8606349a1724122977c8b2fa6bf9'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-08-17 06:38:05'; + public const RELEASE_DATE = '2023-08-17 16:00:02'; /** * @var int */ diff --git a/vendor/autoload.php b/vendor/autoload.php index 37328b1019b..5e6343242b3 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit94b3ce07c8a7d6fe3f8bb56be57668e5::getLoader(); +return ComposerAutoloaderInit114602c24adaa04bde1454b34b25e313::getLoader(); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 514244f3862..582f7b046d5 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit94b3ce07c8a7d6fe3f8bb56be57668e5 +class ComposerAutoloaderInit114602c24adaa04bde1454b34b25e313 { private static $loader; @@ -22,17 +22,17 @@ class ComposerAutoloaderInit94b3ce07c8a7d6fe3f8bb56be57668e5 return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit94b3ce07c8a7d6fe3f8bb56be57668e5', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit114602c24adaa04bde1454b34b25e313', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit94b3ce07c8a7d6fe3f8bb56be57668e5', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit114602c24adaa04bde1454b34b25e313', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit94b3ce07c8a7d6fe3f8bb56be57668e5::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit114602c24adaa04bde1454b34b25e313::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit94b3ce07c8a7d6fe3f8bb56be57668e5::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInit114602c24adaa04bde1454b34b25e313::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index cb7d606d40d..18a00f71217 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit94b3ce07c8a7d6fe3f8bb56be57668e5 +class ComposerStaticInit114602c24adaa04bde1454b34b25e313 { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -2637,9 +2637,9 @@ class ComposerStaticInit94b3ce07c8a7d6fe3f8bb56be57668e5 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit94b3ce07c8a7d6fe3f8bb56be57668e5::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit94b3ce07c8a7d6fe3f8bb56be57668e5::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit94b3ce07c8a7d6fe3f8bb56be57668e5::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit114602c24adaa04bde1454b34b25e313::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit114602c24adaa04bde1454b34b25e313::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit114602c24adaa04bde1454b34b25e313::$classMap; }, null, ClassLoader::class); }