Updated Rector to commit be3abfb729

be3abfb729 [PHP 8.0] Skip switch with default (#171)
This commit is contained in:
Tomas Votruba 2021-06-07 21:47:57 +00:00
parent d770a21650
commit 06a9abecab
10 changed files with 155 additions and 82 deletions

View File

@ -0,0 +1,73 @@
<?php
declare (strict_types=1);
namespace Rector\Php80\NodeAnalyzer;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Stmt\Switch_;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\Php80\ValueObject\CondAndExpr;
final class MatchSwitchAnalyzer
{
/**
* @var \Rector\Php80\NodeAnalyzer\SwitchAnalyzer
*/
private $switchAnalyzer;
/**
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(\Rector\Php80\NodeAnalyzer\SwitchAnalyzer $switchAnalyzer, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver)
{
$this->switchAnalyzer = $switchAnalyzer;
$this->nodeNameResolver = $nodeNameResolver;
}
public function shouldSkipSwitch(\PhpParser\Node\Stmt\Switch_ $switch) : bool
{
if (!$this->switchAnalyzer->hasEachCaseBreak($switch)) {
return \true;
}
if (!$this->switchAnalyzer->hasEachCaseSingleStmt($switch)) {
return \false;
}
return !$this->switchAnalyzer->hasDefault($switch);
}
/**
* @param CondAndExpr[] $condAndExprs
*/
public function haveCondAndExprsMatchPotential(array $condAndExprs) : bool
{
$uniqueCondAndExprKinds = $this->resolveUniqueKinds($condAndExprs);
if (\count($uniqueCondAndExprKinds) > 1) {
return \false;
}
$assignVariableNames = [];
foreach ($condAndExprs as $condAndExpr) {
$expr = $condAndExpr->getExpr();
if (!$expr instanceof \PhpParser\Node\Expr\Assign) {
continue;
}
if ($expr->var instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
$arrayDimFethName = $this->nodeNameResolver->getName($expr->var->var);
$assignVariableNames[] = \get_class($expr->var) . $arrayDimFethName . '[]';
} else {
$assignVariableNames[] = \get_class($expr->var) . $this->nodeNameResolver->getName($expr->var);
}
}
$assignVariableNames = \array_unique($assignVariableNames);
return \count($assignVariableNames) <= 1;
}
/**
* @param CondAndExpr[] $condAndExprs
* @return string[]
*/
private function resolveUniqueKinds(array $condAndExprs) : array
{
$condAndExprKinds = [];
foreach ($condAndExprs as $condAndExpr) {
$condAndExprKinds[] = $condAndExpr->getKind();
}
return \array_unique($condAndExprKinds);
}
}

View File

@ -39,4 +39,13 @@ final class SwitchAnalyzer
}
return \true;
}
public function hasDefault(\PhpParser\Node\Stmt\Switch_ $switch) : bool
{
foreach ($switch->cases as $case) {
if ($case->cond === null) {
return \true;
}
}
return \false;
}
}

View File

@ -0,0 +1,31 @@
<?php
declare (strict_types=1);
namespace Rector\Php80\NodeFactory;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\MatchArm;
use Rector\Php80\ValueObject\CondAndExpr;
final class MatchArmsFactory
{
/**
* @param CondAndExpr[] $condAndExprs
* @return MatchArm[]
*/
public function createFromCondAndExprs(array $condAndExprs) : array
{
$matchArms = [];
foreach ($condAndExprs as $condAndExpr) {
$expr = $condAndExpr->getExpr();
if ($expr instanceof \PhpParser\Node\Expr\Assign) {
// $this->assignExpr = $expr->var;
$expr = $expr->expr;
}
$condExpr = $condAndExpr->getCondExpr();
$condList = $condExpr instanceof \PhpParser\Node\Expr ? [$condExpr] : null;
$matchArms[] = new \PhpParser\Node\MatchArm($condList, $expr);
}
return $matchArms;
}
}

View File

@ -13,7 +13,8 @@ use PhpParser\Node\Stmt\Return_;
use PhpParser\Node\Stmt\Switch_;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Php80\NodeAnalyzer\SwitchAnalyzer;
use Rector\Php80\NodeAnalyzer\MatchSwitchAnalyzer;
use Rector\Php80\NodeFactory\MatchArmsFactory;
use Rector\Php80\NodeResolver\SwitchExprsResolver;
use Rector\Php80\ValueObject\CondAndExpr;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@ -26,22 +27,23 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
*/
final class ChangeSwitchToMatchRector extends \Rector\Core\Rector\AbstractRector
{
/**
* @var \PhpParser\Node\Expr|null
*/
private $assignExpr;
/**
* @var \Rector\Php80\NodeResolver\SwitchExprsResolver
*/
private $switchExprsResolver;
/**
* @var \Rector\Php80\NodeAnalyzer\SwitchAnalyzer
* @var \Rector\Php80\NodeAnalyzer\MatchSwitchAnalyzer
*/
private $switchAnalyzer;
public function __construct(\Rector\Php80\NodeResolver\SwitchExprsResolver $switchExprsResolver, \Rector\Php80\NodeAnalyzer\SwitchAnalyzer $switchAnalyzer)
private $matchSwitchAnalyzer;
/**
* @var \Rector\Php80\NodeFactory\MatchArmsFactory
*/
private $matchArmsFactory;
public function __construct(\Rector\Php80\NodeResolver\SwitchExprsResolver $switchExprsResolver, \Rector\Php80\NodeAnalyzer\MatchSwitchAnalyzer $matchSwitchAnalyzer, \Rector\Php80\NodeFactory\MatchArmsFactory $matchArmsFactory)
{
$this->switchExprsResolver = $switchExprsResolver;
$this->switchAnalyzer = $switchAnalyzer;
$this->matchSwitchAnalyzer = $matchSwitchAnalyzer;
$this->matchArmsFactory = $matchArmsFactory;
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
@ -93,17 +95,16 @@ CODE_SAMPLE
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
if ($this->shouldSkipSwitch($node)) {
if ($this->matchSwitchAnalyzer->shouldSkipSwitch($node)) {
return null;
}
$condAndExprs = $this->switchExprsResolver->resolve($node);
if ($condAndExprs === []) {
return null;
}
if (!$this->haveCondAndExprsMatchPotential($condAndExprs)) {
if (!$this->matchSwitchAnalyzer->haveCondAndExprsMatchPotential($condAndExprs)) {
return null;
}
$this->assignExpr = null;
$isReturn = \false;
foreach ($condAndExprs as $condAndExpr) {
if ($condAndExpr->getKind() === \Rector\Php80\ValueObject\CondAndExpr::TYPE_RETURN) {
@ -115,14 +116,13 @@ CODE_SAMPLE
return null;
}
}
$matchArms = $this->createMatchArmsFromCases($condAndExprs);
$matchArms = $this->matchArmsFactory->createFromCondAndExprs($condAndExprs);
$match = new \PhpParser\Node\Expr\Match_($node->cond, $matchArms);
if ($isReturn) {
return new \PhpParser\Node\Stmt\Return_($match);
}
if ($this->assignExpr) {
/** @var Expr $assignExpr */
$assignExpr = $this->assignExpr;
$assignExpr = $this->resolveAssignExpr($condAndExprs);
if ($assignExpr instanceof \PhpParser\Node\Expr) {
return $this->changeToAssign($node, $match, $assignExpr);
}
return $match;
@ -144,62 +144,18 @@ CODE_SAMPLE
}
return $assign;
}
private function shouldSkipSwitch(\PhpParser\Node\Stmt\Switch_ $switch) : bool
{
if (!$this->switchAnalyzer->hasEachCaseBreak($switch)) {
return \true;
}
return !$this->switchAnalyzer->hasEachCaseSingleStmt($switch);
}
/**
* @param CondAndExpr[] $condAndExprs
*/
private function haveCondAndExprsMatchPotential(array $condAndExprs) : bool
private function resolveAssignExpr(array $condAndExprs) : ?\PhpParser\Node\Expr
{
$uniqueCondAndExprKinds = $this->resolveUniqueKinds($condAndExprs);
if (\count($uniqueCondAndExprKinds) > 1) {
return \false;
}
$assignVariableNames = [];
foreach ($condAndExprs as $condAndExpr) {
$expr = $condAndExpr->getExpr();
if (!$expr instanceof \PhpParser\Node\Expr\Assign) {
continue;
}
$assignVariableNames[] = $this->getName($expr->var);
return $expr->var;
}
$assignVariableNames = \array_unique($assignVariableNames);
return \count($assignVariableNames) <= 1;
}
/**
* @param CondAndExpr[] $condAndExprs
* @return MatchArm[]
*/
private function createMatchArmsFromCases(array $condAndExprs) : array
{
$matchArms = [];
foreach ($condAndExprs as $condAndExpr) {
$expr = $condAndExpr->getExpr();
if ($expr instanceof \PhpParser\Node\Expr\Assign) {
$this->assignExpr = $expr->var;
$expr = $expr->expr;
}
$condExpr = $condAndExpr->getCondExpr();
$condList = $condExpr instanceof \PhpParser\Node\Expr ? [$condExpr] : null;
$matchArms[] = new \PhpParser\Node\MatchArm($condList, $expr);
}
return $matchArms;
}
/**
* @param CondAndExpr[] $condAndExprs
* @return string[]
*/
private function resolveUniqueKinds(array $condAndExprs) : array
{
$condAndExprKinds = [];
foreach ($condAndExprs as $condAndExpr) {
$condAndExprKinds[] = $condAndExpr->getKind();
}
return \array_unique($condAndExprKinds);
return null;
}
}

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = 'c398e7c010d9baddbc97a1acdca7a0fa34a7484e';
public const PACKAGE_VERSION = 'be3abfb729ede49d5d59dd2a739e3f10bd127852';
/**
* @var string
*/
public const RELEASE_DATE = '2021-06-07 16:32:39';
public const RELEASE_DATE = '2021-06-07 21:36:06';
public static function resolvePackageVersion() : string
{
$process = new \RectorPrefix20210607\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 ComposerAutoloaderInit9442b424d317ba441a4197b0916079ce::getLoader();
return ComposerAutoloaderInitea19b3b4bfbc5f13cbcdfd361508f36c::getLoader();

View File

@ -2755,9 +2755,11 @@ return array(
'Rector\\Php80\\MatchAndRefactor\\StrStartsWithMatchAndRefactor\\StrncmpMatchAndRefactor' => $baseDir . '/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrncmpMatchAndRefactor.php',
'Rector\\Php80\\MatchAndRefactor\\StrStartsWithMatchAndRefactor\\StrposMatchAndRefactor' => $baseDir . '/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrposMatchAndRefactor.php',
'Rector\\Php80\\MatchAndRefactor\\StrStartsWithMatchAndRefactor\\SubstrMatchAndRefactor' => $baseDir . '/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.php',
'Rector\\Php80\\NodeAnalyzer\\MatchSwitchAnalyzer' => $baseDir . '/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.php',
'Rector\\Php80\\NodeAnalyzer\\PromotedPropertyResolver' => $baseDir . '/rules/Php80/NodeAnalyzer/PromotedPropertyResolver.php',
'Rector\\Php80\\NodeAnalyzer\\SwitchAnalyzer' => $baseDir . '/rules/Php80/NodeAnalyzer/SwitchAnalyzer.php',
'Rector\\Php80\\NodeFactory\\AttributeFlagFactory' => $baseDir . '/rules/Php80/NodeFactory/AttributeFlagFactory.php',
'Rector\\Php80\\NodeFactory\\MatchArmsFactory' => $baseDir . '/rules/Php80/NodeFactory/MatchArmsFactory.php',
'Rector\\Php80\\NodeFactory\\StrStartsWithFuncCallFactory' => $baseDir . '/rules/Php80/NodeFactory/StrStartsWithFuncCallFactory.php',
'Rector\\Php80\\NodeManipulator\\TokenManipulator' => $baseDir . '/rules/Php80/NodeManipulator/TokenManipulator.php',
'Rector\\Php80\\NodeResolver\\ArgumentSorter' => $baseDir . '/rules/Php80/NodeResolver/ArgumentSorter.php',

View File

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

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit9442b424d317ba441a4197b0916079ce
class ComposerStaticInitea19b3b4bfbc5f13cbcdfd361508f36c
{
public static $files = array (
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
@ -3110,9 +3110,11 @@ class ComposerStaticInit9442b424d317ba441a4197b0916079ce
'Rector\\Php80\\MatchAndRefactor\\StrStartsWithMatchAndRefactor\\StrncmpMatchAndRefactor' => __DIR__ . '/../..' . '/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrncmpMatchAndRefactor.php',
'Rector\\Php80\\MatchAndRefactor\\StrStartsWithMatchAndRefactor\\StrposMatchAndRefactor' => __DIR__ . '/../..' . '/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrposMatchAndRefactor.php',
'Rector\\Php80\\MatchAndRefactor\\StrStartsWithMatchAndRefactor\\SubstrMatchAndRefactor' => __DIR__ . '/../..' . '/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.php',
'Rector\\Php80\\NodeAnalyzer\\MatchSwitchAnalyzer' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.php',
'Rector\\Php80\\NodeAnalyzer\\PromotedPropertyResolver' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/PromotedPropertyResolver.php',
'Rector\\Php80\\NodeAnalyzer\\SwitchAnalyzer' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/SwitchAnalyzer.php',
'Rector\\Php80\\NodeFactory\\AttributeFlagFactory' => __DIR__ . '/../..' . '/rules/Php80/NodeFactory/AttributeFlagFactory.php',
'Rector\\Php80\\NodeFactory\\MatchArmsFactory' => __DIR__ . '/../..' . '/rules/Php80/NodeFactory/MatchArmsFactory.php',
'Rector\\Php80\\NodeFactory\\StrStartsWithFuncCallFactory' => __DIR__ . '/../..' . '/rules/Php80/NodeFactory/StrStartsWithFuncCallFactory.php',
'Rector\\Php80\\NodeManipulator\\TokenManipulator' => __DIR__ . '/../..' . '/rules/Php80/NodeManipulator/TokenManipulator.php',
'Rector\\Php80\\NodeResolver\\ArgumentSorter' => __DIR__ . '/../..' . '/rules/Php80/NodeResolver/ArgumentSorter.php',
@ -3872,9 +3874,9 @@ class ComposerStaticInit9442b424d317ba441a4197b0916079ce
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit9442b424d317ba441a4197b0916079ce::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit9442b424d317ba441a4197b0916079ce::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit9442b424d317ba441a4197b0916079ce::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitea19b3b4bfbc5f13cbcdfd361508f36c::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitea19b3b4bfbc5f13cbcdfd361508f36c::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitea19b3b4bfbc5f13cbcdfd361508f36c::$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('RectorPrefix20210607\CheckoutEntityFactory');
}
if (!class_exists('ComposerAutoloaderInit9442b424d317ba441a4197b0916079ce', false) && !interface_exists('ComposerAutoloaderInit9442b424d317ba441a4197b0916079ce', false) && !trait_exists('ComposerAutoloaderInit9442b424d317ba441a4197b0916079ce', false)) {
spl_autoload_call('RectorPrefix20210607\ComposerAutoloaderInit9442b424d317ba441a4197b0916079ce');
if (!class_exists('ComposerAutoloaderInitea19b3b4bfbc5f13cbcdfd361508f36c', false) && !interface_exists('ComposerAutoloaderInitea19b3b4bfbc5f13cbcdfd361508f36c', false) && !trait_exists('ComposerAutoloaderInitea19b3b4bfbc5f13cbcdfd361508f36c', false)) {
spl_autoload_call('RectorPrefix20210607\ComposerAutoloaderInitea19b3b4bfbc5f13cbcdfd361508f36c');
}
if (!class_exists('Doctrine\Inflector\Inflector', false) && !interface_exists('Doctrine\Inflector\Inflector', false) && !trait_exists('Doctrine\Inflector\Inflector', false)) {
spl_autoload_call('RectorPrefix20210607\Doctrine\Inflector\Inflector');
@ -3323,9 +3323,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20210607\print_node(...func_get_args());
}
}
if (!function_exists('composerRequire9442b424d317ba441a4197b0916079ce')) {
function composerRequire9442b424d317ba441a4197b0916079ce() {
return \RectorPrefix20210607\composerRequire9442b424d317ba441a4197b0916079ce(...func_get_args());
if (!function_exists('composerRequireea19b3b4bfbc5f13cbcdfd361508f36c')) {
function composerRequireea19b3b4bfbc5f13cbcdfd361508f36c() {
return \RectorPrefix20210607\composerRequireea19b3b4bfbc5f13cbcdfd361508f36c(...func_get_args());
}
}
if (!function_exists('parseArgs')) {