Updated Rector to commit 646d1888a42854bfa2af3b7537b0e1efbeccaf0a

646d1888a4 [Transform] Remove CallableInMethodCallToVariableRector as very narrow use case and sensitive to wrong change (#2625)
This commit is contained in:
Tomas Votruba 2022-07-03 20:35:15 +00:00
parent 3d95b4f79c
commit b682e0bcdf
9 changed files with 17 additions and 280 deletions

View File

@ -1,4 +1,4 @@
# 412 Rules Overview
# 411 Rules Overview
<br>
@ -20,7 +20,7 @@
- [DogFood](#dogfood) (1)
- [EarlyReturn](#earlyreturn) (12)
- [EarlyReturn](#earlyreturn) (11)
- [MysqlToMysqli](#mysqltomysqli) (4)
@ -68,7 +68,7 @@
- [Strict](#strict) (5)
- [Transform](#transform) (36)
- [Transform](#transform) (35)
- [TypeDeclaration](#typedeclaration) (29)
@ -4105,35 +4105,6 @@ Split if statement, when if condition always break execution flow
<br>
### ReturnAfterToEarlyOnBreakRector
Change return after foreach to early return in foreach on break
- class: [`Rector\EarlyReturn\Rector\Foreach_\ReturnAfterToEarlyOnBreakRector`](../rules/EarlyReturn/Rector/Foreach_/ReturnAfterToEarlyOnBreakRector.php)
```diff
class SomeClass
{
public function run(array $pathConstants, string $allowedPath)
{
- $pathOK = false;
-
foreach ($pathConstants as $allowedPath) {
if ($dirPath == $allowedPath) {
- $pathOK = true;
- break;
+ return true;
}
}
- return $pathOK;
+ return false;
}
}
```
<br>
### ReturnBinaryAndToEarlyReturnRector
Changes Single return of && to early returns
@ -7947,46 +7918,6 @@ return static function (RectorConfig $rectorConfig): void {
<br>
### CallableInMethodCallToVariableRector
Change a callable in method call to standalone variable assign
:wrench: **configure it!**
- class: [`Rector\Transform\Rector\MethodCall\CallableInMethodCallToVariableRector`](../rules/Transform/Rector/MethodCall/CallableInMethodCallToVariableRector.php)
```php
use Rector\Config\RectorConfig;
use Rector\Transform\Rector\MethodCall\CallableInMethodCallToVariableRector;
use Rector\Transform\ValueObject\CallableInMethodCallToVariable;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->ruleWithConfiguration(
CallableInMethodCallToVariableRector::class,
[new CallableInMethodCallToVariable('Nette\Caching\Cache', 'save', 1)]
);
};
```
```diff
final class SomeClass
{
public function run()
{
/** @var \Nette\Caching\Cache $cache */
- $cache->save($key, function () use ($container) {
- return 100;
- });
+ $result = 100;
+ $cache->save($key, $result);
}
}
```
<br>
### ChangeSingletonToServiceRector
Change singleton class to normal class that can be registered as a service

View File

@ -1,34 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Transform\NodeFactory;
use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Return_;
use Rector\Core\Exception\ShouldNotHappenException;
final class UnwrapClosureFactory
{
/**
* @return Node[]
*/
public function createAssign(Variable $resultVariable, Arg $arg) : array
{
$argValue = $arg->value;
if ($argValue instanceof Closure) {
$unwrappedNodes = $argValue->getStmts();
\end($argValue->stmts);
$lastStmtKey = \key($argValue->stmts);
$lastStmt = $argValue->stmts[$lastStmtKey];
if ($lastStmt instanceof Return_ && $lastStmt->expr !== null) {
unset($unwrappedNodes[$lastStmtKey]);
$unwrappedNodes[] = new Assign($resultVariable, $lastStmt->expr);
}
return $unwrappedNodes;
}
throw new ShouldNotHappenException();
}
}

View File

@ -1,112 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Transform\Rector\MethodCall;
use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\Variable;
use PHPStan\Type\ClosureType;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
use Rector\Core\Rector\AbstractRector;
use Rector\Transform\NodeFactory\UnwrapClosureFactory;
use Rector\Transform\ValueObject\CallableInMethodCallToVariable;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
use RectorPrefix202207\Webmozart\Assert\Assert;
/**
* @changelog https://github.com/nette/caching/commit/5ffe263752af5ccf3866a28305e7b2669ab4da82
*
* @see \Rector\Tests\Transform\Rector\MethodCall\CallableInMethodCallToVariableRector\CallableInMethodCallToVariableRectorTest
*/
final class CallableInMethodCallToVariableRector extends AbstractRector implements ConfigurableRectorInterface
{
/**
* @var CallableInMethodCallToVariable[]
*/
private $callableInMethodCallToVariable = [];
/**
* @readonly
* @var \Rector\Transform\NodeFactory\UnwrapClosureFactory
*/
private $unwrapClosureFactory;
public function __construct(UnwrapClosureFactory $unwrapClosureFactory)
{
$this->unwrapClosureFactory = $unwrapClosureFactory;
}
public function getRuleDefinition() : RuleDefinition
{
return new RuleDefinition('Change a callable in method call to standalone variable assign', [new ConfiguredCodeSample(<<<'CODE_SAMPLE'
final class SomeClass
{
public function run()
{
/** @var \Nette\Caching\Cache $cache */
$cache->save($key, function () use ($container) {
return 100;
});
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
final class SomeClass
{
public function run()
{
/** @var \Nette\Caching\Cache $cache */
$result = 100;
$cache->save($key, $result);
}
}
CODE_SAMPLE
, [new CallableInMethodCallToVariable('Nette\\Caching\\Cache', 'save', 1)])]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [MethodCall::class];
}
/**
* @param MethodCall $node
*/
public function refactor(Node $node) : ?MethodCall
{
foreach ($this->callableInMethodCallToVariable as $singleCallableInMethodCallToVariable) {
if (!$this->isObjectType($node->var, $singleCallableInMethodCallToVariable->getObjectType())) {
continue;
}
if (!$this->nodeNameResolver->isName($node->name, $singleCallableInMethodCallToVariable->getMethodName())) {
continue;
}
$position = $singleCallableInMethodCallToVariable->getArgumentPosition();
if (!isset($node->args[$position])) {
continue;
}
if (!$node->args[$position] instanceof Arg) {
continue;
}
$arg = $node->args[$position];
$argValueType = $this->getType($arg->value);
if (!$argValueType instanceof ClosureType) {
continue;
}
$resultVariable = new Variable('result');
$unwrappedNodes = $this->unwrapClosureFactory->createAssign($resultVariable, $arg);
$arg->value = $resultVariable;
$this->nodesToAddCollector->addNodesBeforeNode($unwrappedNodes, $node);
return $node;
}
return null;
}
/**
* @param mixed[] $configuration
*/
public function configure(array $configuration) : void
{
Assert::allIsAOf($configuration, CallableInMethodCallToVariable::class);
$this->callableInMethodCallToVariable = $configuration;
}
}

View File

@ -1,42 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Transform\ValueObject;
use PHPStan\Type\ObjectType;
final class CallableInMethodCallToVariable
{
/**
* @readonly
* @var string
*/
private $classType;
/**
* @readonly
* @var string
*/
private $methodName;
/**
* @readonly
* @var int
*/
private $argumentPosition;
public function __construct(string $classType, string $methodName, int $argumentPosition)
{
$this->classType = $classType;
$this->methodName = $methodName;
$this->argumentPosition = $argumentPosition;
}
public function getObjectType() : ObjectType
{
return new ObjectType($this->classType);
}
public function getMethodName() : string
{
return $this->methodName;
}
public function getArgumentPosition() : int
{
return $this->argumentPosition;
}
}

View File

@ -17,12 +17,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = 'f78af109208cfe6c217a89ecd80fb7a5a5c518e9';
public const PACKAGE_VERSION = '646d1888a42854bfa2af3b7537b0e1efbeccaf0a';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2022-07-03 22:23:22';
public const RELEASE_DATE = '2022-07-03 22:30:07';
/**
* @var int
*/

2
vendor/autoload.php vendored
View File

@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit522b44807a3f3ba3c95e93316c058088::getLoader();
return ComposerAutoloaderInit4bb373ad1f6850d6aeb06d893643ee00::getLoader();

View File

@ -2910,7 +2910,6 @@ return array(
'Rector\\Transform\\NodeAnalyzer\\FuncCallStaticCallToMethodCallAnalyzer' => $baseDir . '/rules/Transform/NodeAnalyzer/FuncCallStaticCallToMethodCallAnalyzer.php',
'Rector\\Transform\\NodeAnalyzer\\SingletonClassMethodAnalyzer' => $baseDir . '/rules/Transform/NodeAnalyzer/SingletonClassMethodAnalyzer.php',
'Rector\\Transform\\NodeFactory\\PropertyFetchFactory' => $baseDir . '/rules/Transform/NodeFactory/PropertyFetchFactory.php',
'Rector\\Transform\\NodeFactory\\UnwrapClosureFactory' => $baseDir . '/rules/Transform/NodeFactory/UnwrapClosureFactory.php',
'Rector\\Transform\\NodeTypeAnalyzer\\TypeProvidingExprFromClassResolver' => $baseDir . '/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php',
'Rector\\Transform\\Rector\\Assign\\DimFetchAssignToMethodCallRector' => $baseDir . '/rules/Transform/Rector/Assign/DimFetchAssignToMethodCallRector.php',
'Rector\\Transform\\Rector\\Assign\\GetAndSetToMethodCallRector' => $baseDir . '/rules/Transform/Rector/Assign/GetAndSetToMethodCallRector.php',
@ -2932,7 +2931,6 @@ return array(
'Rector\\Transform\\Rector\\FuncCall\\FuncCallToStaticCallRector' => $baseDir . '/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php',
'Rector\\Transform\\Rector\\FunctionLike\\FileGetContentsAndJsonDecodeToStaticCallRector' => $baseDir . '/rules/Transform/Rector/FunctionLike/FileGetContentsAndJsonDecodeToStaticCallRector.php',
'Rector\\Transform\\Rector\\Isset_\\UnsetAndIssetToMethodCallRector' => $baseDir . '/rules/Transform/Rector/Isset_/UnsetAndIssetToMethodCallRector.php',
'Rector\\Transform\\Rector\\MethodCall\\CallableInMethodCallToVariableRector' => $baseDir . '/rules/Transform/Rector/MethodCall/CallableInMethodCallToVariableRector.php',
'Rector\\Transform\\Rector\\MethodCall\\MethodCallToAnotherMethodCallWithArgumentsRector' => $baseDir . '/rules/Transform/Rector/MethodCall/MethodCallToAnotherMethodCallWithArgumentsRector.php',
'Rector\\Transform\\Rector\\MethodCall\\MethodCallToMethodCallRector' => $baseDir . '/rules/Transform/Rector/MethodCall/MethodCallToMethodCallRector.php',
'Rector\\Transform\\Rector\\MethodCall\\MethodCallToPropertyFetchRector' => $baseDir . '/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php',
@ -2951,7 +2949,6 @@ return array(
'Rector\\Transform\\ValueObject\\ArgumentFuncCallToMethodCall' => $baseDir . '/rules/Transform/ValueObject/ArgumentFuncCallToMethodCall.php',
'Rector\\Transform\\ValueObject\\ArrayFuncCallToMethodCall' => $baseDir . '/rules/Transform/ValueObject/ArrayFuncCallToMethodCall.php',
'Rector\\Transform\\ValueObject\\AttributeKeyToClassConstFetch' => $baseDir . '/rules/Transform/ValueObject/AttributeKeyToClassConstFetch.php',
'Rector\\Transform\\ValueObject\\CallableInMethodCallToVariable' => $baseDir . '/rules/Transform/ValueObject/CallableInMethodCallToVariable.php',
'Rector\\Transform\\ValueObject\\DimFetchAssignToMethodCall' => $baseDir . '/rules/Transform/ValueObject/DimFetchAssignToMethodCall.php',
'Rector\\Transform\\ValueObject\\FuncCallToMethodCall' => $baseDir . '/rules/Transform/ValueObject/FuncCallToMethodCall.php',
'Rector\\Transform\\ValueObject\\FuncCallToStaticCall' => $baseDir . '/rules/Transform/ValueObject/FuncCallToStaticCall.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit522b44807a3f3ba3c95e93316c058088
class ComposerAutoloaderInit4bb373ad1f6850d6aeb06d893643ee00
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInit522b44807a3f3ba3c95e93316c058088
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit522b44807a3f3ba3c95e93316c058088', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit4bb373ad1f6850d6aeb06d893643ee00', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit522b44807a3f3ba3c95e93316c058088', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit4bb373ad1f6850d6aeb06d893643ee00', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit522b44807a3f3ba3c95e93316c058088::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit4bb373ad1f6850d6aeb06d893643ee00::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInit522b44807a3f3ba3c95e93316c058088::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInit4bb373ad1f6850d6aeb06d893643ee00::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire522b44807a3f3ba3c95e93316c058088($fileIdentifier, $file);
composerRequire4bb373ad1f6850d6aeb06d893643ee00($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInit522b44807a3f3ba3c95e93316c058088
* @param string $file
* @return void
*/
function composerRequire522b44807a3f3ba3c95e93316c058088($fileIdentifier, $file)
function composerRequire4bb373ad1f6850d6aeb06d893643ee00($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit522b44807a3f3ba3c95e93316c058088
class ComposerStaticInit4bb373ad1f6850d6aeb06d893643ee00
{
public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@ -3217,7 +3217,6 @@ class ComposerStaticInit522b44807a3f3ba3c95e93316c058088
'Rector\\Transform\\NodeAnalyzer\\FuncCallStaticCallToMethodCallAnalyzer' => __DIR__ . '/../..' . '/rules/Transform/NodeAnalyzer/FuncCallStaticCallToMethodCallAnalyzer.php',
'Rector\\Transform\\NodeAnalyzer\\SingletonClassMethodAnalyzer' => __DIR__ . '/../..' . '/rules/Transform/NodeAnalyzer/SingletonClassMethodAnalyzer.php',
'Rector\\Transform\\NodeFactory\\PropertyFetchFactory' => __DIR__ . '/../..' . '/rules/Transform/NodeFactory/PropertyFetchFactory.php',
'Rector\\Transform\\NodeFactory\\UnwrapClosureFactory' => __DIR__ . '/../..' . '/rules/Transform/NodeFactory/UnwrapClosureFactory.php',
'Rector\\Transform\\NodeTypeAnalyzer\\TypeProvidingExprFromClassResolver' => __DIR__ . '/../..' . '/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php',
'Rector\\Transform\\Rector\\Assign\\DimFetchAssignToMethodCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/Assign/DimFetchAssignToMethodCallRector.php',
'Rector\\Transform\\Rector\\Assign\\GetAndSetToMethodCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/Assign/GetAndSetToMethodCallRector.php',
@ -3239,7 +3238,6 @@ class ComposerStaticInit522b44807a3f3ba3c95e93316c058088
'Rector\\Transform\\Rector\\FuncCall\\FuncCallToStaticCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php',
'Rector\\Transform\\Rector\\FunctionLike\\FileGetContentsAndJsonDecodeToStaticCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/FunctionLike/FileGetContentsAndJsonDecodeToStaticCallRector.php',
'Rector\\Transform\\Rector\\Isset_\\UnsetAndIssetToMethodCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/Isset_/UnsetAndIssetToMethodCallRector.php',
'Rector\\Transform\\Rector\\MethodCall\\CallableInMethodCallToVariableRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/CallableInMethodCallToVariableRector.php',
'Rector\\Transform\\Rector\\MethodCall\\MethodCallToAnotherMethodCallWithArgumentsRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/MethodCallToAnotherMethodCallWithArgumentsRector.php',
'Rector\\Transform\\Rector\\MethodCall\\MethodCallToMethodCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/MethodCallToMethodCallRector.php',
'Rector\\Transform\\Rector\\MethodCall\\MethodCallToPropertyFetchRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php',
@ -3258,7 +3256,6 @@ class ComposerStaticInit522b44807a3f3ba3c95e93316c058088
'Rector\\Transform\\ValueObject\\ArgumentFuncCallToMethodCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/ArgumentFuncCallToMethodCall.php',
'Rector\\Transform\\ValueObject\\ArrayFuncCallToMethodCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/ArrayFuncCallToMethodCall.php',
'Rector\\Transform\\ValueObject\\AttributeKeyToClassConstFetch' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/AttributeKeyToClassConstFetch.php',
'Rector\\Transform\\ValueObject\\CallableInMethodCallToVariable' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/CallableInMethodCallToVariable.php',
'Rector\\Transform\\ValueObject\\DimFetchAssignToMethodCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/DimFetchAssignToMethodCall.php',
'Rector\\Transform\\ValueObject\\FuncCallToMethodCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/FuncCallToMethodCall.php',
'Rector\\Transform\\ValueObject\\FuncCallToStaticCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/FuncCallToStaticCall.php',
@ -3415,9 +3412,9 @@ class ComposerStaticInit522b44807a3f3ba3c95e93316c058088
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit522b44807a3f3ba3c95e93316c058088::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit522b44807a3f3ba3c95e93316c058088::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit522b44807a3f3ba3c95e93316c058088::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit4bb373ad1f6850d6aeb06d893643ee00::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit4bb373ad1f6850d6aeb06d893643ee00::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit4bb373ad1f6850d6aeb06d893643ee00::$classMap;
}, null, ClassLoader::class);
}