mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-09 20:52:23 +00:00
Updated Rector to commit c732f61317
c732f61317
[DowngradePhp72] Handle DowngradeParameterTypeWideningRector on anonymous class implements interface (#811)
This commit is contained in:
parent
35aeca4151
commit
2f48356b1f
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__);
|
||||
|
|
|
@ -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
2
vendor/autoload.php
vendored
|
@ -4,4 +4,4 @@
|
|||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInitcf4b923886068926400bbd5ef052f7d4::getLoader();
|
||||
return ComposerAutoloaderInitc170ee17c921c1ac077ac893c8954528::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 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;
|
||||
|
|
8
vendor/composer/autoload_static.php
vendored
8
vendor/composer/autoload_static.php
vendored
|
@ -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);
|
||||
}
|
||||
|
|
10
vendor/scoper-autoload.php
vendored
10
vendor/scoper-autoload.php
vendored
|
@ -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')) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user