Updated Rector to commit 7427f6df2a

7427f6df2a [DowngradePhp80] Allow FuncCall on DowngradeNamedArgumentRector (#466)
This commit is contained in:
Tomas Votruba 2021-07-20 20:57:20 +00:00
parent 85c097bb56
commit 8e2ec60a86
9 changed files with 145 additions and 93 deletions

View File

@ -0,0 +1,93 @@
<?php
declare (strict_types=1);
namespace Rector\DowngradePhp80\NodeAnalyzer;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\Php\PhpParameterReflection;
use Rector\DowngradePhp80\Reflection\DefaultParameterValueResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use ReflectionFunction;
final class NamedToUnnamedArgs
{
/**
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @var \Rector\DowngradePhp80\Reflection\DefaultParameterValueResolver
*/
private $defaultParameterValueResolver;
public function __construct(\Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\DowngradePhp80\Reflection\DefaultParameterValueResolver $defaultParameterValueResolver)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->defaultParameterValueResolver = $defaultParameterValueResolver;
}
/**
* @param ParameterReflection[]|PhpParameterReflection[] $parameters
* @param Arg[] $currentArgs
* @param string[] $toFillArgs
* @param Arg[] $unnamedArgs
* @return Arg[]
*/
public function fillFromNamedArgs(array $parameters, array $currentArgs, array $toFillArgs, array $unnamedArgs) : array
{
foreach ($parameters as $paramPosition => $parameterReflection) {
$parameterReflectionName = $parameterReflection->getName();
if (!\in_array($parameterReflectionName, $toFillArgs, \true)) {
continue;
}
foreach ($currentArgs as $currentArg) {
if (!$currentArg->name instanceof \PhpParser\Node\Identifier) {
continue;
}
if (!$this->nodeNameResolver->isName($currentArg->name, $parameterReflectionName)) {
continue;
}
$unnamedArgs[$paramPosition] = new \PhpParser\Node\Arg($currentArg->value, $currentArg->byRef, $currentArg->unpack, $currentArg->getAttributes(), null);
}
}
return $unnamedArgs;
}
/**
* @param Arg[] $unnamedArgs
* @param ParameterReflection[]|PhpParameterReflection[] $parameters
* @return Arg[]
* @param \PHPStan\Reflection\FunctionReflection|\PHPStan\Reflection\MethodReflection|\ReflectionFunction $functionLikeReflection
*/
public function fillFromJumpedNamedArgs($functionLikeReflection, array $unnamedArgs, bool $isNativeFunctionReflection, array $parameters) : array
{
$keys = \array_keys($unnamedArgs);
if ($keys === []) {
return $unnamedArgs;
}
$highestParameterPosition = \max($keys);
$parametersCount = \count($parameters);
for ($i = 0; $i < $parametersCount; ++$i) {
if (\in_array($i, $keys, \true)) {
continue;
}
if ($i > $highestParameterPosition) {
continue;
}
/** @var ParameterReflection|PhpParameterReflection $parameterReflection */
if ($isNativeFunctionReflection) {
/** @var ReflectionFunction $functionLikeReflection */
$parameterReflection = new \PHPStan\Reflection\Php\PhpParameterReflection($functionLikeReflection->getParameters()[$i], null, null);
} else {
$parameterReflection = $parameters[$i];
}
$defaulValue = $this->defaultParameterValueResolver->resolveFromParameterReflection($parameterReflection);
if (!$defaulValue instanceof \PhpParser\Node\Expr) {
continue;
}
$unnamedArgs[$i] = new \PhpParser\Node\Arg($defaulValue, $parameterReflection->passedByReference()->yes(), $parameterReflection->isVariadic(), [], null);
}
return $unnamedArgs;
}
}

View File

@ -4,15 +4,12 @@ declare (strict_types=1);
namespace Rector\DowngradePhp80\NodeAnalyzer;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\ParametersAcceptor;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Node\Value\ValueResolver;
use Rector\DowngradePhp80\Reflection\DefaultParameterValueResolver;
use PHPStan\Reflection\Native\NativeFunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use Rector\NodeNameResolver\NodeNameResolver;
use ReflectionFunction;
final class UnnamedArgumentResolver
{
/**
@ -20,18 +17,13 @@ final class UnnamedArgumentResolver
*/
private $nodeNameResolver;
/**
* @var \Rector\Core\PhpParser\Node\Value\ValueResolver
* @var \Rector\DowngradePhp80\NodeAnalyzer\NamedToUnnamedArgs
*/
private $valueResolver;
/**
* @var \Rector\DowngradePhp80\Reflection\DefaultParameterValueResolver
*/
private $defaultParameterValueResolver;
public function __construct(\Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\Core\PhpParser\Node\Value\ValueResolver $valueResolver, \Rector\DowngradePhp80\Reflection\DefaultParameterValueResolver $defaultParameterValueResolver)
private $namedToUnnamedArgs;
public function __construct(\Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\DowngradePhp80\NodeAnalyzer\NamedToUnnamedArgs $namedToUnnamedArgs)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->valueResolver = $valueResolver;
$this->defaultParameterValueResolver = $defaultParameterValueResolver;
$this->namedToUnnamedArgs = $namedToUnnamedArgs;
}
/**
* @param Arg[] $currentArgs
@ -40,64 +32,28 @@ final class UnnamedArgumentResolver
*/
public function resolveFromReflection($functionLikeReflection, array $currentArgs) : array
{
$parametersAcceptor = $functionLikeReflection->getVariants()[0] ?? null;
if (!$parametersAcceptor instanceof \PHPStan\Reflection\ParametersAcceptor) {
return [];
}
$parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionLikeReflection->getVariants());
$unnamedArgs = [];
foreach ($parametersAcceptor->getParameters() as $paramPosition => $parameterReflection) {
foreach ($currentArgs as $currentArg) {
if ($this->shouldSkipParam($currentArg, $parameterReflection)) {
continue;
}
$unnamedArgs[$paramPosition] = new \PhpParser\Node\Arg($currentArg->value, $currentArg->byRef, $currentArg->unpack, $currentArg->getAttributes(), null);
$parameters = $parametersAcceptor->getParameters();
$isNativeFunctionReflection = $functionLikeReflection instanceof \PHPStan\Reflection\Native\NativeFunctionReflection;
if ($isNativeFunctionReflection) {
$functionLikeReflection = new \ReflectionFunction($functionLikeReflection->getName());
}
/** @var Arg[] $unnamedArgs */
$unnamedArgs = [];
$toFillArgs = [];
foreach ($currentArgs as $key => $arg) {
if ($arg->name === null) {
$unnamedArgs[$key] = new \PhpParser\Node\Arg($arg->value, $arg->byRef, $arg->unpack, $arg->getAttributes(), null);
continue;
}
/** @var string $argName */
$argName = $this->nodeNameResolver->getName($arg->name);
$toFillArgs[] = $argName;
}
$setArgumentPositoins = \array_keys($unnamedArgs);
$highestParameterPosition = \max($setArgumentPositoins);
if (!\is_int($highestParameterPosition)) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$unnamedArgs = $this->fillArgValues($highestParameterPosition, $unnamedArgs, $functionLikeReflection);
$unnamedArgs = $this->namedToUnnamedArgs->fillFromNamedArgs($parameters, $currentArgs, $toFillArgs, $unnamedArgs);
$unnamedArgs = $this->namedToUnnamedArgs->fillFromJumpedNamedArgs($functionLikeReflection, $unnamedArgs, $isNativeFunctionReflection, $parameters);
\ksort($unnamedArgs);
return $unnamedArgs;
}
private function shouldSkipParam(\PhpParser\Node\Arg $arg, \PHPStan\Reflection\ParameterReflection $parameterReflection) : bool
{
if (!$this->nodeNameResolver->isName($arg, $parameterReflection->getName())) {
return \true;
}
return $this->areArgValueAndParameterDefaultValueEqual($parameterReflection, $arg);
}
private function areArgValueAndParameterDefaultValueEqual(\PHPStan\Reflection\ParameterReflection $parameterReflection, \PhpParser\Node\Arg $arg) : bool
{
// arg value vs parameter default value
if ($parameterReflection->getDefaultValue() === null) {
return \false;
}
$defaultValue = $this->defaultParameterValueResolver->resolveFromParameterReflection($parameterReflection);
// default value is set already, let's skip it
return $this->valueResolver->isValue($arg->value, $defaultValue);
}
/**
* @param Arg[] $unnamedArgs
* @return Arg[]
* @param \PHPStan\Reflection\MethodReflection|\PHPStan\Reflection\FunctionReflection $functionLikeReflection
*/
private function fillArgValues(int $highestParameterPosition, array $unnamedArgs, $functionLikeReflection) : array
{
// fill parameter default values
for ($i = 0; $i < $highestParameterPosition; ++$i) {
// the argument is already set, no need to override it
if (isset($unnamedArgs[$i])) {
continue;
}
$defaultExpr = $this->defaultParameterValueResolver->resolveFromFunctionLikeAndPosition($functionLikeReflection, $i);
if (!$defaultExpr instanceof \PhpParser\Node\Expr) {
continue;
}
$unnamedArgs[$i] = new \PhpParser\Node\Arg($defaultExpr);
}
return $unnamedArgs;
}
}

View File

@ -5,6 +5,7 @@ namespace Rector\DowngradePhp80\Rector\MethodCall;
use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Expr\StaticCall;
@ -15,6 +16,7 @@ use Rector\Core\Reflection\ReflectionResolver;
use Rector\DowngradePhp80\NodeAnalyzer\UnnamedArgumentResolver;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
use PHPStan\Reflection\FunctionReflection;
/**
* @see \Rector\Tests\DowngradePhp80\Rector\MethodCall\DowngradeNamedArgumentRector\DowngradeNamedArgumentRectorTest
*/
@ -38,7 +40,7 @@ final class DowngradeNamedArgumentRector extends \Rector\Core\Rector\AbstractRec
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Expr\MethodCall::class, \PhpParser\Node\Expr\StaticCall::class, \PhpParser\Node\Expr\New_::class];
return [\PhpParser\Node\Expr\MethodCall::class, \PhpParser\Node\Expr\StaticCall::class, \PhpParser\Node\Expr\New_::class, \PhpParser\Node\Expr\FuncCall::class];
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
@ -71,7 +73,7 @@ CODE_SAMPLE
)]);
}
/**
* @param MethodCall|StaticCall $node
* @param MethodCall|StaticCall|New_|FuncCall $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
@ -84,7 +86,7 @@ CODE_SAMPLE
}
/**
* @param Arg[] $args
* @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\New_ $node
* @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\New_|\PhpParser\Node\Expr\FuncCall $node
*/
private function removeNamedArguments($node, array $args) : ?\PhpParser\Node
{
@ -93,10 +95,9 @@ CODE_SAMPLE
} else {
$functionLikeReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($node);
}
if (!$functionLikeReflection instanceof \PHPStan\Reflection\MethodReflection) {
if (!$functionLikeReflection instanceof \PHPStan\Reflection\MethodReflection && !$functionLikeReflection instanceof \PHPStan\Reflection\FunctionReflection) {
return null;
}
//
$unnamedArgs = $this->unnamedArgumentResolver->resolveFromReflection($functionLikeReflection, $args);
$node->args = $unnamedArgs;
return $node;

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = '0fe1656da65f6f53ae2b0cacf42b3b21317ae662';
public const PACKAGE_VERSION = '7427f6df2aa3ea658a82491d8ded778fd91b694d';
/**
* @var string
*/
public const RELEASE_DATE = '2021-07-20 20:45:59';
public const RELEASE_DATE = '2021-07-20 22:48:41';
public static function resolvePackageVersion() : string
{
$process = new \RectorPrefix20210720\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 ComposerAutoloaderInitc8fbf5c139a46bb1bd3722da5a6d418e::getLoader();
return ComposerAutoloaderInita521445f643f196f88a6f4bb92866ca8::getLoader();

View File

@ -2157,6 +2157,7 @@ return array(
'Rector\\DowngradePhp74\\Rector\\Identical\\DowngradeFreadFwriteFalsyToNegationRector' => $baseDir . '/rules/DowngradePhp74/Rector/Identical/DowngradeFreadFwriteFalsyToNegationRector.php',
'Rector\\DowngradePhp74\\Rector\\LNumber\\DowngradeNumericLiteralSeparatorRector' => $baseDir . '/rules/DowngradePhp74/Rector/LNumber/DowngradeNumericLiteralSeparatorRector.php',
'Rector\\DowngradePhp74\\Rector\\Property\\DowngradeTypedPropertyRector' => $baseDir . '/rules/DowngradePhp74/Rector/Property/DowngradeTypedPropertyRector.php',
'Rector\\DowngradePhp80\\NodeAnalyzer\\NamedToUnnamedArgs' => $baseDir . '/rules/DowngradePhp80/NodeAnalyzer/NamedToUnnamedArgs.php',
'Rector\\DowngradePhp80\\NodeAnalyzer\\UnnamedArgumentResolver' => $baseDir . '/rules/DowngradePhp80/NodeAnalyzer/UnnamedArgumentResolver.php',
'Rector\\DowngradePhp80\\Rector\\Catch_\\DowngradeNonCapturingCatchesRector' => $baseDir . '/rules/DowngradePhp80/Rector/Catch_/DowngradeNonCapturingCatchesRector.php',
'Rector\\DowngradePhp80\\Rector\\ClassConstFetch\\DowngradeClassOnObjectToGetClassRector' => $baseDir . '/rules/DowngradePhp80/Rector/ClassConstFetch/DowngradeClassOnObjectToGetClassRector.php',

View File

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

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInitc8fbf5c139a46bb1bd3722da5a6d418e
class ComposerStaticInita521445f643f196f88a6f4bb92866ca8
{
public static $files = array (
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
@ -2512,6 +2512,7 @@ class ComposerStaticInitc8fbf5c139a46bb1bd3722da5a6d418e
'Rector\\DowngradePhp74\\Rector\\Identical\\DowngradeFreadFwriteFalsyToNegationRector' => __DIR__ . '/../..' . '/rules/DowngradePhp74/Rector/Identical/DowngradeFreadFwriteFalsyToNegationRector.php',
'Rector\\DowngradePhp74\\Rector\\LNumber\\DowngradeNumericLiteralSeparatorRector' => __DIR__ . '/../..' . '/rules/DowngradePhp74/Rector/LNumber/DowngradeNumericLiteralSeparatorRector.php',
'Rector\\DowngradePhp74\\Rector\\Property\\DowngradeTypedPropertyRector' => __DIR__ . '/../..' . '/rules/DowngradePhp74/Rector/Property/DowngradeTypedPropertyRector.php',
'Rector\\DowngradePhp80\\NodeAnalyzer\\NamedToUnnamedArgs' => __DIR__ . '/../..' . '/rules/DowngradePhp80/NodeAnalyzer/NamedToUnnamedArgs.php',
'Rector\\DowngradePhp80\\NodeAnalyzer\\UnnamedArgumentResolver' => __DIR__ . '/../..' . '/rules/DowngradePhp80/NodeAnalyzer/UnnamedArgumentResolver.php',
'Rector\\DowngradePhp80\\Rector\\Catch_\\DowngradeNonCapturingCatchesRector' => __DIR__ . '/../..' . '/rules/DowngradePhp80/Rector/Catch_/DowngradeNonCapturingCatchesRector.php',
'Rector\\DowngradePhp80\\Rector\\ClassConstFetch\\DowngradeClassOnObjectToGetClassRector' => __DIR__ . '/../..' . '/rules/DowngradePhp80/Rector/ClassConstFetch/DowngradeClassOnObjectToGetClassRector.php',
@ -3840,9 +3841,9 @@ class ComposerStaticInitc8fbf5c139a46bb1bd3722da5a6d418e
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitc8fbf5c139a46bb1bd3722da5a6d418e::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitc8fbf5c139a46bb1bd3722da5a6d418e::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitc8fbf5c139a46bb1bd3722da5a6d418e::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInita521445f643f196f88a6f4bb92866ca8::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInita521445f643f196f88a6f4bb92866ca8::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInita521445f643f196f88a6f4bb92866ca8::$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('RectorPrefix20210720\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInitc8fbf5c139a46bb1bd3722da5a6d418e', false) && !interface_exists('ComposerAutoloaderInitc8fbf5c139a46bb1bd3722da5a6d418e', false) && !trait_exists('ComposerAutoloaderInitc8fbf5c139a46bb1bd3722da5a6d418e', false)) {
spl_autoload_call('RectorPrefix20210720\ComposerAutoloaderInitc8fbf5c139a46bb1bd3722da5a6d418e');
if (!class_exists('ComposerAutoloaderInita521445f643f196f88a6f4bb92866ca8', false) && !interface_exists('ComposerAutoloaderInita521445f643f196f88a6f4bb92866ca8', false) && !trait_exists('ComposerAutoloaderInita521445f643f196f88a6f4bb92866ca8', false)) {
spl_autoload_call('RectorPrefix20210720\ComposerAutoloaderInita521445f643f196f88a6f4bb92866ca8');
}
if (!class_exists('Doctrine\Inflector\Inflector', false) && !interface_exists('Doctrine\Inflector\Inflector', false) && !trait_exists('Doctrine\Inflector\Inflector', false)) {
spl_autoload_call('RectorPrefix20210720\Doctrine\Inflector\Inflector');
@ -3308,9 +3308,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20210720\print_node(...func_get_args());
}
}
if (!function_exists('composerRequirec8fbf5c139a46bb1bd3722da5a6d418e')) {
function composerRequirec8fbf5c139a46bb1bd3722da5a6d418e() {
return \RectorPrefix20210720\composerRequirec8fbf5c139a46bb1bd3722da5a6d418e(...func_get_args());
if (!function_exists('composerRequirea521445f643f196f88a6f4bb92866ca8')) {
function composerRequirea521445f643f196f88a6f4bb92866ca8() {
return \RectorPrefix20210720\composerRequirea521445f643f196f88a6f4bb92866ca8(...func_get_args());
}
}
if (!function_exists('parseArgs')) {