Updated Rector to commit c732f61317

c732f61317 [DowngradePhp72] Handle DowngradeParameterTypeWideningRector on anonymous class implements interface (#811)
This commit is contained in:
Tomas Votruba 2021-09-02 06:26:12 +00:00
parent 35aeca4151
commit 2f48356b1f
8 changed files with 64 additions and 57 deletions

View File

@ -7,6 +7,7 @@ use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\Php\PhpMethodReflection;
use PHPStan\Reflection\ReflectionProvider;
use Rector\Core\NodeAnalyzer\ClassAnalyzer;
@ -32,29 +33,47 @@ final class OverrideFromAnonymousClassMethodAnalyzer
$this->nodeNameResolver = $nodeNameResolver;
$this->reflectionProvider = $reflectionProvider;
}
public function isOverrideParentMethod(\PhpParser\Node\Stmt\ClassLike $classLike, \PhpParser\Node\Stmt\ClassMethod $classMethod) : bool
public function matchAncestorClassReflectionOverrideable(\PhpParser\Node\Stmt\ClassLike $classLike, \PhpParser\Node\Stmt\ClassMethod $classMethod) : ?\PHPStan\Reflection\ClassReflection
{
if (!$this->classAnalyzer->isAnonymousClass($classLike)) {
return \false;
return null;
}
/** @var Class_ $classLike */
$interfaces = $classLike->implements;
foreach ($interfaces as $interface) {
if (!$interface instanceof \PhpParser\Node\Name\FullyQualified) {
continue;
}
$resolve = $this->resolveClassReflectionWithNotPrivateMethod($interface, $classMethod);
if ($resolve instanceof \PHPStan\Reflection\ClassReflection) {
return $resolve;
}
}
/** @var Class_ $classLike */
if (!$classLike->extends instanceof \PhpParser\Node\Name\FullyQualified) {
return \false;
return null;
}
$extendsClass = $classLike->extends->toString();
if (!$this->reflectionProvider->hasClass($extendsClass)) {
return \false;
return $this->resolveClassReflectionWithNotPrivateMethod($classLike->extends, $classMethod);
}
private function resolveClassReflectionWithNotPrivateMethod(\PhpParser\Node\Name\FullyQualified $fullyQualified, \PhpParser\Node\Stmt\ClassMethod $classMethod) : ?\PHPStan\Reflection\ClassReflection
{
$ancestorClassLike = $fullyQualified->toString();
if (!$this->reflectionProvider->hasClass($ancestorClassLike)) {
return null;
}
$classReflection = $this->reflectionProvider->getClass($extendsClass);
$classReflection = $this->reflectionProvider->getClass($ancestorClassLike);
$methodName = $this->nodeNameResolver->getName($classMethod);
if (!$classReflection->hasMethod($methodName)) {
return \false;
return null;
}
$scope = $classMethod->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::SCOPE);
$method = $classReflection->getMethod($methodName, $scope);
if (!$method instanceof \PHPStan\Reflection\Php\PhpMethodReflection) {
return \false;
return null;
}
return !$method->isPrivate();
if ($method->isPrivate()) {
return null;
}
return $classReflection;
}
}

View File

@ -9,7 +9,6 @@ use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ReflectionProvider;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\Rector\AbstractRector;
use Rector\DowngradePhp72\NodeAnalyzer\BuiltInMethodAnalyzer;
use Rector\DowngradePhp72\NodeAnalyzer\OverrideFromAnonymousClassMethodAnalyzer;
@ -64,22 +63,17 @@ final class DowngradeParameterTypeWideningRector extends \Rector\Core\Rector\Abs
* @var \Rector\DowngradePhp72\NodeAnalyzer\OverrideFromAnonymousClassMethodAnalyzer
*/
private $overrideFromAnonymousClassMethodAnalyzer;
/**
* @var \Rector\Core\PhpParser\AstResolver
*/
private $astResolver;
/**
* @var \Rector\DowngradePhp72\NodeAnalyzer\SealedClassAnalyzer
*/
private $sealedClassAnalyzer;
public function __construct(\Rector\DowngradePhp72\PhpDoc\NativeParamToPhpDocDecorator $nativeParamToPhpDocDecorator, \PHPStan\Reflection\ReflectionProvider $reflectionProvider, \Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer, \Rector\DowngradePhp72\NodeAnalyzer\BuiltInMethodAnalyzer $builtInMethodAnalyzer, \Rector\DowngradePhp72\NodeAnalyzer\OverrideFromAnonymousClassMethodAnalyzer $overrideFromAnonymousClassMethodAnalyzer, \Rector\Core\PhpParser\AstResolver $astResolver, \Rector\DowngradePhp72\NodeAnalyzer\SealedClassAnalyzer $sealedClassAnalyzer)
public function __construct(\Rector\DowngradePhp72\PhpDoc\NativeParamToPhpDocDecorator $nativeParamToPhpDocDecorator, \PHPStan\Reflection\ReflectionProvider $reflectionProvider, \Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer, \Rector\DowngradePhp72\NodeAnalyzer\BuiltInMethodAnalyzer $builtInMethodAnalyzer, \Rector\DowngradePhp72\NodeAnalyzer\OverrideFromAnonymousClassMethodAnalyzer $overrideFromAnonymousClassMethodAnalyzer, \Rector\DowngradePhp72\NodeAnalyzer\SealedClassAnalyzer $sealedClassAnalyzer)
{
$this->nativeParamToPhpDocDecorator = $nativeParamToPhpDocDecorator;
$this->reflectionProvider = $reflectionProvider;
$this->autowiredClassMethodOrPropertyAnalyzer = $autowiredClassMethodOrPropertyAnalyzer;
$this->builtInMethodAnalyzer = $builtInMethodAnalyzer;
$this->overrideFromAnonymousClassMethodAnalyzer = $overrideFromAnonymousClassMethodAnalyzer;
$this->astResolver = $astResolver;
$this->sealedClassAnalyzer = $sealedClassAnalyzer;
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
@ -131,15 +125,9 @@ CODE_SAMPLE
if ($classLike === null) {
return null;
}
if ($this->overrideFromAnonymousClassMethodAnalyzer->isOverrideParentMethod($classLike, $node)) {
$classReflection = $this->reflectionProvider->getClass($classLike->extends->toString());
$methodName = $this->nodeNameResolver->getName($node);
/** @var ClassMethod $classMethod */
$classMethod = $this->astResolver->resolveClassMethod($classReflection->getName(), $methodName);
if ($this->shouldSkip($classReflection, $classMethod)) {
return null;
}
return $this->processRemoveParamTypeFromMethod($node);
$ancestorOverridableAnonymousClass = $this->overrideFromAnonymousClassMethodAnalyzer->matchAncestorClassReflectionOverrideable($classLike, $node);
if ($ancestorOverridableAnonymousClass instanceof \PHPStan\Reflection\ClassReflection) {
return $this->processRemoveParamTypeFromMethod($ancestorOverridableAnonymousClass, $node);
}
$className = $this->nodeNameResolver->getName($classLike);
if ($className === null) {
@ -149,13 +137,7 @@ CODE_SAMPLE
return null;
}
$classReflection = $this->reflectionProvider->getClass($className);
if ($this->shouldSkip($classReflection, $node)) {
return null;
}
if ($this->builtInMethodAnalyzer->isImplementsBuiltInInterface($classReflection, $node)) {
return null;
}
return $this->processRemoveParamTypeFromMethod($node);
return $this->processRemoveParamTypeFromMethod($classReflection, $node);
}
/**
* @param array<string, mixed> $configuration
@ -186,8 +168,14 @@ CODE_SAMPLE
}
return $this->shouldSkipClassMethod($classMethod);
}
private function processRemoveParamTypeFromMethod(\PhpParser\Node\Stmt\ClassMethod $classMethod) : \PhpParser\Node\Stmt\ClassMethod
private function processRemoveParamTypeFromMethod(\PHPStan\Reflection\ClassReflection $classReflection, \PhpParser\Node\Stmt\ClassMethod $classMethod) : ?\PhpParser\Node\Stmt\ClassMethod
{
if ($this->shouldSkip($classReflection, $classMethod)) {
return null;
}
if ($this->builtInMethodAnalyzer->isImplementsBuiltInInterface($classReflection, $classMethod)) {
return null;
}
// Downgrade every scalar parameter, just to be sure
foreach (\array_keys($classMethod->params) as $paramPosition) {
$this->removeParamTypeFromMethod($classMethod, $paramPosition);

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = '54c2151111e0d9628d1bc12bc48d7cc40391a3b8';
public const PACKAGE_VERSION = 'c732f61317d64898b7b31ab171d7f1e52caca9f9';
/**
* @var string
*/
public const RELEASE_DATE = '2021-09-02 08:11:09';
public const RELEASE_DATE = '2021-09-02 08:14:16';
public static function resolvePackageVersion() : string
{
$process = new \RectorPrefix20210902\Symfony\Component\Process\Process(['git', 'log', '--pretty="%H"', '-n1', 'HEAD'], __DIR__);

View File

@ -126,6 +126,10 @@ abstract class AbstractRector extends \PhpParser\NodeVisitorAbstract implements
* @var \Rector\Core\ValueObject\Application\File
*/
protected $file;
/**
* @var \Rector\PostRector\Collector\NodesToAddCollector
*/
protected $nodesToAddCollector;
/**
* @var \Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser
*/
@ -154,10 +158,6 @@ abstract class AbstractRector extends \PhpParser\NodeVisitorAbstract implements
* @var string|null
*/
private $previousAppliedClass;
/**
* @var \Rector\PostRector\Collector\NodesToAddCollector
*/
protected $nodesToAddCollector;
/**
* @var \Rector\Core\Provider\CurrentFileProvider
*/

2
vendor/autoload.php vendored
View File

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

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4
class ComposerAutoloaderInitc170ee17c921c1ac077ac893c8954528
{
private static $loader;
@ -22,15 +22,15 @@ class ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitc170ee17c921c1ac077ac893c8954528', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
spl_autoload_unregister(array('ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitc170ee17c921c1ac077ac893c8954528', '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\ComposerStaticInitcf4b923886068926400bbd5ef052f7d4::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitc170ee17c921c1ac077ac893c8954528::getInitializer($loader));
} else {
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
@ -42,19 +42,19 @@ class ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInitcf4b923886068926400bbd5ef052f7d4::$files;
$includeFiles = Composer\Autoload\ComposerStaticInitc170ee17c921c1ac077ac893c8954528::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequirecf4b923886068926400bbd5ef052f7d4($fileIdentifier, $file);
composerRequirec170ee17c921c1ac077ac893c8954528($fileIdentifier, $file);
}
return $loader;
}
}
function composerRequirecf4b923886068926400bbd5ef052f7d4($fileIdentifier, $file)
function composerRequirec170ee17c921c1ac077ac893c8954528($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;

View File

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

View File

@ -9,8 +9,8 @@ $loader = require_once __DIR__.'/autoload.php';
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20210902\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4', false) && !interface_exists('ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4', false) && !trait_exists('ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4', false)) {
spl_autoload_call('RectorPrefix20210902\ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4');
if (!class_exists('ComposerAutoloaderInitc170ee17c921c1ac077ac893c8954528', false) && !interface_exists('ComposerAutoloaderInitc170ee17c921c1ac077ac893c8954528', false) && !trait_exists('ComposerAutoloaderInitc170ee17c921c1ac077ac893c8954528', false)) {
spl_autoload_call('RectorPrefix20210902\ComposerAutoloaderInitc170ee17c921c1ac077ac893c8954528');
}
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('RectorPrefix20210902\Helmich\TypoScriptParser\Parser\AST\Statement');
@ -3311,9 +3311,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20210902\print_node(...func_get_args());
}
}
if (!function_exists('composerRequirecf4b923886068926400bbd5ef052f7d4')) {
function composerRequirecf4b923886068926400bbd5ef052f7d4() {
return \RectorPrefix20210902\composerRequirecf4b923886068926400bbd5ef052f7d4(...func_get_args());
if (!function_exists('composerRequirec170ee17c921c1ac077ac893c8954528')) {
function composerRequirec170ee17c921c1ac077ac893c8954528() {
return \RectorPrefix20210902\composerRequirec170ee17c921c1ac077ac893c8954528(...func_get_args());
}
}
if (!function_exists('parseArgs')) {