Updated Rector to commit 4c4049217a

4c4049217a skip class const fetch in object type (#341)
This commit is contained in:
Tomas Votruba 2021-06-30 15:42:45 +00:00
parent 491439eed7
commit ecda10a711
12 changed files with 122 additions and 82 deletions

View File

@ -126,7 +126,7 @@ final class NodeTypeResolver
public function isObjectType(\PhpParser\Node $node, \PHPStan\Type\ObjectType $requiredObjectType) : bool
{
if ($node instanceof \PhpParser\Node\Expr\ClassConstFetch) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
return \false;
}
$resolvedType = $this->resolve($node);
if ($resolvedType instanceof \PHPStan\Type\MixedType) {

View File

@ -22,9 +22,6 @@ final class ClosureTypeMapper implements \Rector\PHPStanStaticTypeMapper\Contrac
* @var \Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper
*/
private $phpStanStaticTypeMapper;
public function __construct()
{
}
/**
* @return class-string<Type>
*/

View File

@ -147,9 +147,6 @@ CODE_SAMPLE
return \true;
}
$type = $param->type instanceof \PhpParser\Node\NullableType ? $param->type->type : $param->type;
if ($type instanceof \PhpParser\Node\Identifier && $this->isName($type, 'callable')) {
return \true;
}
return \false;
return $type instanceof \PhpParser\Node\Identifier && $this->isName($type, 'callable');
}
}

View File

@ -92,13 +92,13 @@ CODE_SAMPLE
if (!$this->nodeComparator->areNodesEqual($needle, $comparedNeedleExpr)) {
return null;
}
$endsWithNode = $this->nodeFactory->createFuncCall('str_ends_with', [$haystack, $needle]);
if ($binaryOp instanceof \PhpParser\Node\Expr\BinaryOp\NotIdentical) {
return new \PhpParser\Node\Expr\BooleanNot($endsWithNode);
}
return $endsWithNode;
$isPositive = $binaryOp instanceof \PhpParser\Node\Expr\BinaryOp\Identical;
return $this->buildReturnNode($haystack, $needle, $isPositive);
}
private function refactorSubstrCompare(\PhpParser\Node\Expr\BinaryOp $binaryOp) : ?\PhpParser\Node\Expr\FuncCall
/**
* @return \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\BooleanNot|null
*/
private function refactorSubstrCompare(\PhpParser\Node\Expr\BinaryOp $binaryOp)
{
$funcCallAndExpr = $this->binaryOpAnalyzer->matchFuncCallAndOtherExpr($binaryOp, 'substr_compare');
if (!$funcCallAndExpr instanceof \Rector\Nette\ValueObject\FuncCallAndExpr) {
@ -115,7 +115,8 @@ CODE_SAMPLE
if (!$this->nodeComparator->areNodesEqual($needle, $comparedNeedleExpr)) {
return null;
}
return $this->nodeFactory->createFuncCall('str_ends_with', [$haystack, $needle]);
$isPositive = $binaryOp instanceof \PhpParser\Node\Expr\BinaryOp\Identical;
return $this->buildReturnNode($haystack, $needle, $isPositive);
}
private function matchUnaryMinusStrlenFuncCallArgValue(\PhpParser\Node $node) : ?\PhpParser\Node\Expr
{
@ -132,4 +133,15 @@ CODE_SAMPLE
$funcCall = $node->expr;
return $funcCall->args[0]->value;
}
/**
* @return \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\BooleanNot
*/
private function buildReturnNode(?\PhpParser\Node\Expr $haystack, ?\PhpParser\Node\Expr $needle, bool $isPositive)
{
$funcCall = $this->nodeFactory->createFuncCall('str_ends_with', [$haystack, $needle]);
if (!$isPositive) {
return new \PhpParser\Node\Expr\BooleanNot($funcCall);
}
return $funcCall;
}
}

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = '53697af64d37628704946ae3ebd134231b2e5a08';
public const PACKAGE_VERSION = '4c4049217a62b4e2b7e0cce84598401776f4e90d';
/**
* @var string
*/
public const RELEASE_DATE = '2021-06-30 16:03:40';
public const RELEASE_DATE = '2021-06-30 15:30:03';
public static function resolvePackageVersion() : string
{
$process = new \RectorPrefix20210630\Symfony\Component\Process\Process(['git', 'log', '--pretty="%H"', '-n1', 'HEAD'], __DIR__);

View File

@ -0,0 +1,60 @@
<?php
declare (strict_types=1);
namespace Rector\Core\NodeManipulator;
use PhpParser\Node;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\List_;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\NodeNameResolver\NodeNameResolver;
use RectorPrefix20210630\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser;
final class ArrayDestructVariableFilter
{
/**
* @var \Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser
*/
private $simpleCallableNodeTraverser;
/**
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(\RectorPrefix20210630\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser $simpleCallableNodeTraverser, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver)
{
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
$this->nodeNameResolver = $nodeNameResolver;
}
/**
* @param Assign[] $variableAssigns
* @return Assign[]
*/
public function filterOut(array $variableAssigns, \PhpParser\Node\Stmt\ClassMethod $classMethod) : array
{
$arrayDestructionCreatedVariables = [];
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod, function (\PhpParser\Node $node) use(&$arrayDestructionCreatedVariables) {
if (!$node instanceof \PhpParser\Node\Expr\Assign) {
return null;
}
if (!$node->var instanceof \PhpParser\Node\Expr\Array_ && !$node->var instanceof \PhpParser\Node\Expr\List_) {
return null;
}
foreach ($node->var->items as $arrayItem) {
// empty item
if ($arrayItem === null) {
continue;
}
if (!$arrayItem->value instanceof \PhpParser\Node\Expr\Variable) {
continue;
}
/** @var string $variableName */
$variableName = $this->nodeNameResolver->getName($arrayItem->value);
$arrayDestructionCreatedVariables[] = $variableName;
}
});
return \array_filter($variableAssigns, function (\PhpParser\Node\Expr\Assign $assign) use($arrayDestructionCreatedVariables) : bool {
return !$this->nodeNameResolver->isNames($assign->var, $arrayDestructionCreatedVariables);
});
}
}

View File

@ -5,11 +5,9 @@ namespace Rector\Core\NodeManipulator;
use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\ClosureUse;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\List_;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Expr\Variable;
@ -20,7 +18,6 @@ use PhpParser\Node\Stmt\Expression;
use PhpParser\Node\Stmt\Foreach_;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Type;
use Rector\Core\PhpParser\Comparing\NodeComparator;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
@ -63,7 +60,11 @@ final class ClassMethodAssignManipulator
* @var \Rector\Core\Reflection\ReflectionResolver
*/
private $reflectionResolver;
public function __construct(\Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \RectorPrefix20210630\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser $simpleCallableNodeTraverser, \Rector\Core\PhpParser\Node\NodeFactory $nodeFactory, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\Core\NodeManipulator\VariableManipulator $variableManipulator, \Rector\Core\PhpParser\Comparing\NodeComparator $nodeComparator, \Rector\Core\Reflection\ReflectionResolver $reflectionResolver)
/**
* @var \Rector\Core\NodeManipulator\ArrayDestructVariableFilter
*/
private $arrayDestructVariableFilter;
public function __construct(\Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \RectorPrefix20210630\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser $simpleCallableNodeTraverser, \Rector\Core\PhpParser\Node\NodeFactory $nodeFactory, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\Core\NodeManipulator\VariableManipulator $variableManipulator, \Rector\Core\PhpParser\Comparing\NodeComparator $nodeComparator, \Rector\Core\Reflection\ReflectionResolver $reflectionResolver, \Rector\Core\NodeManipulator\ArrayDestructVariableFilter $arrayDestructVariableFilter)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
@ -72,6 +73,7 @@ final class ClassMethodAssignManipulator
$this->variableManipulator = $variableManipulator;
$this->nodeComparator = $nodeComparator;
$this->reflectionResolver = $reflectionResolver;
$this->arrayDestructVariableFilter = $arrayDestructVariableFilter;
}
/**
* @return Assign[]
@ -80,7 +82,7 @@ final class ClassMethodAssignManipulator
{
$assignsOfScalarOrArrayToVariable = $this->variableManipulator->collectScalarOrArrayAssignsOfVariable($classMethod);
// filter out [$value] = $array, array destructing
$readOnlyVariableAssigns = $this->filterOutArrayDestructedVariables($assignsOfScalarOrArrayToVariable, $classMethod);
$readOnlyVariableAssigns = $this->arrayDestructVariableFilter->filterOut($assignsOfScalarOrArrayToVariable, $classMethod);
$readOnlyVariableAssigns = $this->filterOutReferencedVariables($readOnlyVariableAssigns, $classMethod);
$readOnlyVariableAssigns = $this->filterOutMultiAssigns($readOnlyVariableAssigns);
$readOnlyVariableAssigns = $this->filterOutForeachVariables($readOnlyVariableAssigns);
@ -96,37 +98,6 @@ final class ClassMethodAssignManipulator
$classMethodHash = \spl_object_hash($classMethod);
$this->alreadyAddedClassMethodNames[$classMethodHash][] = $name;
}
/**
* @param Assign[] $variableAssigns
* @return Assign[]
*/
private function filterOutArrayDestructedVariables(array $variableAssigns, \PhpParser\Node\Stmt\ClassMethod $classMethod) : array
{
$arrayDestructionCreatedVariables = [];
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod, function (\PhpParser\Node $node) use(&$arrayDestructionCreatedVariables) {
if (!$node instanceof \PhpParser\Node\Expr\Assign) {
return null;
}
if (!$node->var instanceof \PhpParser\Node\Expr\Array_ && !$node->var instanceof \PhpParser\Node\Expr\List_) {
return null;
}
foreach ($node->var->items as $arrayItem) {
// empty item
if ($arrayItem === null) {
continue;
}
if (!$arrayItem->value instanceof \PhpParser\Node\Expr\Variable) {
continue;
}
/** @var string $variableName */
$variableName = $this->nodeNameResolver->getName($arrayItem->value);
$arrayDestructionCreatedVariables[] = $variableName;
}
});
return \array_filter($variableAssigns, function (\PhpParser\Node\Expr\Assign $assign) use($arrayDestructionCreatedVariables) : bool {
return !$this->nodeNameResolver->isNames($assign->var, $arrayDestructionCreatedVariables);
});
}
/**
* @param Assign[] $variableAssigns
* @return Assign[]
@ -263,13 +234,13 @@ final class ClassMethodAssignManipulator
return \false;
}
$variableName = $this->nodeNameResolver->getName($variable);
$parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodReflection->getVariants());
/** @var ParameterReflection $parameterReflection */
foreach ($parametersAcceptor->getParameters() as $parameterReflection) {
if ($parameterReflection->getName() !== $variableName) {
continue;
foreach ($methodReflection->getVariants() as $parametersAcceptor) {
foreach ($parametersAcceptor->getParameters() as $parameterReflection) {
if ($parameterReflection->getName() !== $variableName) {
continue;
}
return $parameterReflection->passedByReference()->yes();
}
return $parameterReflection->passedByReference()->yes();
}
return \false;
}
@ -302,13 +273,14 @@ final class ClassMethodAssignManipulator
if (!$methodReflection instanceof \PHPStan\Reflection\MethodReflection) {
return \false;
}
$parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodReflection->getVariants());
/** @var ParameterReflection $parameterReflection */
foreach ($parametersAcceptor->getParameters() as $parameterPosition => $parameterReflection) {
if ($parameterPosition !== $argumentPosition) {
continue;
foreach ($methodReflection->getVariants() as $parametersAcceptor) {
/** @var ParameterReflection $parameterReflection */
foreach ($parametersAcceptor->getParameters() as $parameterPosition => $parameterReflection) {
if ($parameterPosition !== $argumentPosition) {
continue;
}
return $parameterReflection->passedByReference()->yes();
}
return $parameterReflection->passedByReference()->yes();
}
return \false;
}

2
vendor/autoload.php vendored
View File

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

View File

@ -1840,6 +1840,7 @@ return array(
'Rector\\Core\\NodeAnalyzer\\PropertyFetchAnalyzer' => $baseDir . '/src/NodeAnalyzer/PropertyFetchAnalyzer.php',
'Rector\\Core\\NodeAnalyzer\\PropertyPresenceChecker' => $baseDir . '/src/NodeAnalyzer/PropertyPresenceChecker.php',
'Rector\\Core\\NodeAnalyzer\\VariadicAnalyzer' => $baseDir . '/src/NodeAnalyzer/VariadicAnalyzer.php',
'Rector\\Core\\NodeManipulator\\ArrayDestructVariableFilter' => $baseDir . '/src/NodeManipulator/ArrayDestructVariableFilter.php',
'Rector\\Core\\NodeManipulator\\ArrayManipulator' => $baseDir . '/src/NodeManipulator/ArrayManipulator.php',
'Rector\\Core\\NodeManipulator\\AssignManipulator' => $baseDir . '/src/NodeManipulator/AssignManipulator.php',
'Rector\\Core\\NodeManipulator\\BinaryOpManipulator' => $baseDir . '/src/NodeManipulator/BinaryOpManipulator.php',

View File

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

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInite667713bb6a06196e400b3bbe0953575
class ComposerStaticInit2242cd94271102cf5d272e8e421e6e4b
{
public static $files = array (
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
@ -2195,6 +2195,7 @@ class ComposerStaticInite667713bb6a06196e400b3bbe0953575
'Rector\\Core\\NodeAnalyzer\\PropertyFetchAnalyzer' => __DIR__ . '/../..' . '/src/NodeAnalyzer/PropertyFetchAnalyzer.php',
'Rector\\Core\\NodeAnalyzer\\PropertyPresenceChecker' => __DIR__ . '/../..' . '/src/NodeAnalyzer/PropertyPresenceChecker.php',
'Rector\\Core\\NodeAnalyzer\\VariadicAnalyzer' => __DIR__ . '/../..' . '/src/NodeAnalyzer/VariadicAnalyzer.php',
'Rector\\Core\\NodeManipulator\\ArrayDestructVariableFilter' => __DIR__ . '/../..' . '/src/NodeManipulator/ArrayDestructVariableFilter.php',
'Rector\\Core\\NodeManipulator\\ArrayManipulator' => __DIR__ . '/../..' . '/src/NodeManipulator/ArrayManipulator.php',
'Rector\\Core\\NodeManipulator\\AssignManipulator' => __DIR__ . '/../..' . '/src/NodeManipulator/AssignManipulator.php',
'Rector\\Core\\NodeManipulator\\BinaryOpManipulator' => __DIR__ . '/../..' . '/src/NodeManipulator/BinaryOpManipulator.php',
@ -3840,9 +3841,9 @@ class ComposerStaticInite667713bb6a06196e400b3bbe0953575
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInite667713bb6a06196e400b3bbe0953575::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInite667713bb6a06196e400b3bbe0953575::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInite667713bb6a06196e400b3bbe0953575::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit2242cd94271102cf5d272e8e421e6e4b::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit2242cd94271102cf5d272e8e421e6e4b::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit2242cd94271102cf5d272e8e421e6e4b::$classMap;
}, null, ClassLoader::class);
}

View File

@ -21,8 +21,8 @@ if (!class_exists('SomeTestCase', false) && !interface_exists('SomeTestCase', fa
if (!class_exists('CheckoutEntityFactory', false) && !interface_exists('CheckoutEntityFactory', false) && !trait_exists('CheckoutEntityFactory', false)) {
spl_autoload_call('RectorPrefix20210630\CheckoutEntityFactory');
}
if (!class_exists('ComposerAutoloaderInite667713bb6a06196e400b3bbe0953575', false) && !interface_exists('ComposerAutoloaderInite667713bb6a06196e400b3bbe0953575', false) && !trait_exists('ComposerAutoloaderInite667713bb6a06196e400b3bbe0953575', false)) {
spl_autoload_call('RectorPrefix20210630\ComposerAutoloaderInite667713bb6a06196e400b3bbe0953575');
if (!class_exists('ComposerAutoloaderInit2242cd94271102cf5d272e8e421e6e4b', false) && !interface_exists('ComposerAutoloaderInit2242cd94271102cf5d272e8e421e6e4b', false) && !trait_exists('ComposerAutoloaderInit2242cd94271102cf5d272e8e421e6e4b', false)) {
spl_autoload_call('RectorPrefix20210630\ComposerAutoloaderInit2242cd94271102cf5d272e8e421e6e4b');
}
if (!class_exists('Doctrine\Inflector\Inflector', false) && !interface_exists('Doctrine\Inflector\Inflector', false) && !trait_exists('Doctrine\Inflector\Inflector', false)) {
spl_autoload_call('RectorPrefix20210630\Doctrine\Inflector\Inflector');
@ -3320,9 +3320,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20210630\print_node(...func_get_args());
}
}
if (!function_exists('composerRequiree667713bb6a06196e400b3bbe0953575')) {
function composerRequiree667713bb6a06196e400b3bbe0953575() {
return \RectorPrefix20210630\composerRequiree667713bb6a06196e400b3bbe0953575(...func_get_args());
if (!function_exists('composerRequire2242cd94271102cf5d272e8e421e6e4b')) {
function composerRequire2242cd94271102cf5d272e8e421e6e4b() {
return \RectorPrefix20210630\composerRequire2242cd94271102cf5d272e8e421e6e4b(...func_get_args());
}
}
if (!function_exists('parseArgs')) {