mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-26 12:52:36 +00:00
Various improvements (#4717)
This commit is contained in:
parent
377c734975
commit
499d452f99
|
@ -9,25 +9,25 @@ final class DowngradeSetList
|
|||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const DOWNGRADE_PHP71 = __DIR__ . '/../../../../config/set/downgrade-php71.php';
|
||||
public const PHP_71 = __DIR__ . '/../../../../config/set/downgrade-php71.php';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const DOWNGRADE_PHP72 = __DIR__ . '/../../../../config/set/downgrade-php72.php';
|
||||
public const PHP_72 = __DIR__ . '/../../../../config/set/downgrade-php72.php';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const DOWNGRADE_PHP73 = __DIR__ . '/../../../../config/set/downgrade-php73.php';
|
||||
public const PHP_73 = __DIR__ . '/../../../../config/set/downgrade-php73.php';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const DOWNGRADE_PHP74 = __DIR__ . '/../../../../config/set/downgrade-php74.php';
|
||||
public const PHP_74 = __DIR__ . '/../../../../config/set/downgrade-php74.php';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const DOWNGRADE_PHP80 = __DIR__ . '/../../../../config/set/downgrade-php80.php';
|
||||
public const PHP_80 = __DIR__ . '/../../../../config/set/downgrade-php80.php';
|
||||
}
|
||||
|
|
19
phpstan.neon
19
phpstan.neon
|
@ -21,6 +21,14 @@ includes:
|
|||
- vendor/symplify/phpstan-rules/config/symplify-rules/string-to-constant-rules.neon
|
||||
|
||||
services:
|
||||
-
|
||||
class: Symplify\PHPStanRules\Rules\RequireClassTypeInClassMethodByTypeRule
|
||||
tags: [phpstan.rules.rule]
|
||||
arguments:
|
||||
requiredTypeInMethodByClass:
|
||||
Rector\Core\Contract\Rector\PhpRectorInterface:
|
||||
getNodeTypes: 'PhpParser\Node'
|
||||
|
||||
-
|
||||
class: Symplify\PHPStanRules\CognitiveComplexity\Rules\FunctionLikeCognitiveComplexityRule
|
||||
tags: [phpstan.rules.rule]
|
||||
|
@ -32,6 +40,10 @@ services:
|
|||
tags: [phpstan.rules.rule]
|
||||
arguments:
|
||||
maxClassCognitiveComplexity: 50
|
||||
limitsByTypes:
|
||||
Rector\Core\Rector\AbstractRector: 40
|
||||
Symfony\Component\Console\Command\Command: 40
|
||||
PHPStan\Rule\Rule: 30
|
||||
|
||||
# require constant in argument position
|
||||
-
|
||||
|
@ -707,11 +719,16 @@ parameters:
|
|||
- '#Parameter \#1 \$expr of class PhpParser\\Node\\Stmt\\Expression constructor expects PhpParser\\Node\\Expr, PhpParser\\Node\\Expr\|PhpParser\\Node\\Stmt given#'
|
||||
|
||||
-
|
||||
message: '#Class cognitive complexity is \d+, keep it under 50#'
|
||||
message: '#Class cognitive complexity is \d+, keep it under \d+#'
|
||||
paths:
|
||||
- rules/php70/src/EregToPcreTransformer.php
|
||||
- packages/node-collector/src/NodeCollector/NodeRepository.php
|
||||
- packages/node-type-resolver/src/NodeTypeResolver.php
|
||||
- rules/solid/src/Rector/Variable/MoveVariableDeclarationNearReferenceRector.php
|
||||
- src/Rector/AbstractRector.php
|
||||
- rules/php80/src/Rector/If_/NullsafeOperatorRector.php
|
||||
- rules/code-quality/src/Rector/For_/ForToForeachRector.php
|
||||
- rules/coding-style/src/Rector/Use_/RemoveUnusedAliasRector.php
|
||||
|
||||
# symplify 9
|
||||
- '#Use decoupled factory service to create "(.*?)" object#'
|
||||
|
|
163
rules/coding-style/src/Naming/NameRenamer.php
Normal file
163
rules/coding-style/src/Naming/NameRenamer.php
Normal file
|
@ -0,0 +1,163 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\CodingStyle\Naming;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Expr\New_;
|
||||
use PhpParser\Node\Expr\StaticCall;
|
||||
use PhpParser\Node\Identifier;
|
||||
use PhpParser\Node\Name;
|
||||
use PhpParser\Node\Param;
|
||||
use PhpParser\Node\Stmt\Class_;
|
||||
use PhpParser\Node\Stmt\ClassMethod;
|
||||
use PhpParser\Node\Stmt\Interface_;
|
||||
use PhpParser\Node\Stmt\TraitUse;
|
||||
use Rector\CodingStyle\ValueObject\NameAndParent;
|
||||
use Rector\NodeNameResolver\NodeNameResolver;
|
||||
|
||||
final class NameRenamer
|
||||
{
|
||||
/**
|
||||
* @var NodeNameResolver
|
||||
*/
|
||||
private $nodeNameResolver;
|
||||
|
||||
public function __construct(NodeNameResolver $nodeNameResolver)
|
||||
{
|
||||
$this->nodeNameResolver = $nodeNameResolver;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param NameAndParent[] $usedNameNodes
|
||||
*/
|
||||
public function renameNameNode(array $usedNameNodes, string $lastName): void
|
||||
{
|
||||
foreach ($usedNameNodes as $nameAndParent) {
|
||||
$parentNode = $nameAndParent->getParentNode();
|
||||
$usedName = $nameAndParent->getNameNode();
|
||||
|
||||
if ($parentNode instanceof TraitUse) {
|
||||
$this->renameTraitUse($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof Class_) {
|
||||
$this->renameClass($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof Param) {
|
||||
$this->renameParam($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof New_) {
|
||||
$this->renameNew($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof ClassMethod) {
|
||||
$this->renameClassMethod($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof Interface_) {
|
||||
$this->renameInterface($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof StaticCall) {
|
||||
$this->renameStaticCall($lastName, $parentNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameTraitUse(string $lastName, TraitUse $traitUse, Node $usedNameNode): void
|
||||
{
|
||||
foreach ($traitUse->traits as $key => $traitName) {
|
||||
if (! $this->nodeNameResolver->areNamesEqual($traitName, $usedNameNode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$traitUse->traits[$key] = new Name($lastName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameClass(string $lastName, Class_ $class, Node $usedNameNode): void
|
||||
{
|
||||
if ($class->name !== null && $this->nodeNameResolver->areNamesEqual($class->name, $usedNameNode)) {
|
||||
$class->name = new Identifier($lastName);
|
||||
}
|
||||
|
||||
if ($class->extends !== null && $this->nodeNameResolver->areNamesEqual($class->extends, $usedNameNode)) {
|
||||
$class->extends = new Name($lastName);
|
||||
}
|
||||
|
||||
foreach ($class->implements as $key => $implementNode) {
|
||||
if ($this->nodeNameResolver->areNamesEqual($implementNode, $usedNameNode)) {
|
||||
$class->implements[$key] = new Name($lastName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameParam(string $lastName, Node $parentNode, Node $usedNameNode): void
|
||||
{
|
||||
if ($parentNode->type === null) {
|
||||
return;
|
||||
}
|
||||
if (! $this->nodeNameResolver->areNamesEqual($parentNode->type, $usedNameNode)) {
|
||||
return;
|
||||
}
|
||||
$parentNode->type = new Name($lastName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameNew(string $lastName, Node $parentNode, Node $usedNameNode): void
|
||||
{
|
||||
if ($this->nodeNameResolver->areNamesEqual($parentNode->class, $usedNameNode)) {
|
||||
$parentNode->class = new Name($lastName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameClassMethod(string $lastName, ClassMethod $classMethod, Node $usedNameNode): void
|
||||
{
|
||||
if ($classMethod->returnType === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (! $this->nodeNameResolver->areNamesEqual($classMethod->returnType, $usedNameNode)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$classMethod->returnType = new Name($lastName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameInterface(string $lastName, Interface_ $interface, Node $usedNameNode): void
|
||||
{
|
||||
foreach ($interface->extends as $key => $extendInterfaceName) {
|
||||
if (! $this->nodeNameResolver->areNamesEqual($extendInterfaceName, $usedNameNode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$interface->extends[$key] = new Name($lastName);
|
||||
}
|
||||
}
|
||||
|
||||
private function renameStaticCall(string $lastName, StaticCall $staticCall): void
|
||||
{
|
||||
$staticCall->class = new Name($lastName);
|
||||
}
|
||||
}
|
|
@ -5,17 +5,11 @@ declare(strict_types=1);
|
|||
namespace Rector\CodingStyle\Rector\Use_;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Expr\New_;
|
||||
use PhpParser\Node\Expr\StaticCall;
|
||||
use PhpParser\Node\Identifier;
|
||||
use PhpParser\Node\Name;
|
||||
use PhpParser\Node\Param;
|
||||
use PhpParser\Node\Stmt\Class_;
|
||||
use PhpParser\Node\Stmt\ClassMethod;
|
||||
use PhpParser\Node\Stmt\Interface_;
|
||||
use PhpParser\Node\Stmt\TraitUse;
|
||||
use PhpParser\Node\Stmt\Use_;
|
||||
use PhpParser\Node\Stmt\UseUse;
|
||||
use Rector\CodingStyle\Naming\NameRenamer;
|
||||
use Rector\CodingStyle\Node\DocAliasResolver;
|
||||
use Rector\CodingStyle\Node\UseManipulator;
|
||||
use Rector\CodingStyle\Node\UseNameAliasToNameResolver;
|
||||
|
@ -60,14 +54,21 @@ final class RemoveUnusedAliasRector extends AbstractRector
|
|||
*/
|
||||
private $useManipulator;
|
||||
|
||||
/**
|
||||
* @var NameRenamer
|
||||
*/
|
||||
private $nameRenamer;
|
||||
|
||||
public function __construct(
|
||||
DocAliasResolver $docAliasResolver,
|
||||
UseManipulator $useManipulator,
|
||||
UseNameAliasToNameResolver $useNameAliasToNameResolver
|
||||
UseNameAliasToNameResolver $useNameAliasToNameResolver,
|
||||
NameRenamer $nameRenamer
|
||||
) {
|
||||
$this->docAliasResolver = $docAliasResolver;
|
||||
$this->useNameAliasToNameResolver = $useNameAliasToNameResolver;
|
||||
$this->useManipulator = $useManipulator;
|
||||
$this->nameRenamer = $nameRenamer;
|
||||
}
|
||||
|
||||
public function getRuleDefinition(): RuleDefinition
|
||||
|
@ -217,7 +218,7 @@ CODE_SAMPLE
|
|||
return;
|
||||
}
|
||||
|
||||
$this->renameNameNode($this->resolvedNodeNames[$lowerAliasName], $lastName);
|
||||
$this->nameRenamer->renameNameNode($this->resolvedNodeNames[$lowerAliasName], $lastName);
|
||||
$useUse->alias = null;
|
||||
}
|
||||
|
||||
|
@ -231,136 +232,4 @@ CODE_SAMPLE
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param NameAndParent[] $usedNameNodes
|
||||
*/
|
||||
private function renameNameNode(array $usedNameNodes, string $lastName): void
|
||||
{
|
||||
foreach ($usedNameNodes as $nameAndParent) {
|
||||
$parentNode = $nameAndParent->getParentNode();
|
||||
$usedName = $nameAndParent->getNameNode();
|
||||
|
||||
if ($parentNode instanceof TraitUse) {
|
||||
$this->renameTraitUse($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof Class_) {
|
||||
$this->renameClass($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof Param) {
|
||||
$this->renameParam($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof New_) {
|
||||
$this->renameNew($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof ClassMethod) {
|
||||
$this->renameClassMethod($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof Interface_) {
|
||||
$this->renameInterface($lastName, $parentNode, $usedName);
|
||||
}
|
||||
|
||||
if ($parentNode instanceof StaticCall) {
|
||||
$this->renameStaticCall($lastName, $parentNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameTraitUse(string $lastName, TraitUse $traitUse, Node $usedNameNode): void
|
||||
{
|
||||
foreach ($traitUse->traits as $key => $traitName) {
|
||||
if (! $this->areNamesEqual($traitName, $usedNameNode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$traitUse->traits[$key] = new Name($lastName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameClass(string $lastName, Class_ $class, Node $usedNameNode): void
|
||||
{
|
||||
if ($class->name !== null && $this->areNamesEqual($class->name, $usedNameNode)) {
|
||||
$class->name = new Identifier($lastName);
|
||||
}
|
||||
|
||||
if ($class->extends !== null && $this->areNamesEqual($class->extends, $usedNameNode)) {
|
||||
$class->extends = new Name($lastName);
|
||||
}
|
||||
|
||||
foreach ($class->implements as $key => $implementNode) {
|
||||
if ($this->areNamesEqual($implementNode, $usedNameNode)) {
|
||||
$class->implements[$key] = new Name($lastName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameParam(string $lastName, Node $parentNode, Node $usedNameNode): void
|
||||
{
|
||||
if ($parentNode->type === null) {
|
||||
return;
|
||||
}
|
||||
if (! $this->areNamesEqual($parentNode->type, $usedNameNode)) {
|
||||
return;
|
||||
}
|
||||
$parentNode->type = new Name($lastName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameNew(string $lastName, Node $parentNode, Node $usedNameNode): void
|
||||
{
|
||||
if ($this->areNamesEqual($parentNode->class, $usedNameNode)) {
|
||||
$parentNode->class = new Name($lastName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameClassMethod(string $lastName, ClassMethod $classMethod, Node $usedNameNode): void
|
||||
{
|
||||
if ($classMethod->returnType === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (! $this->areNamesEqual($classMethod->returnType, $usedNameNode)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$classMethod->returnType = new Name($lastName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Name|Identifier $usedNameNode
|
||||
*/
|
||||
private function renameInterface(string $lastName, Interface_ $interface, Node $usedNameNode): void
|
||||
{
|
||||
foreach ($interface->extends as $key => $extendInterfaceName) {
|
||||
if (! $this->areNamesEqual($extendInterfaceName, $usedNameNode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$interface->extends[$key] = new Name($lastName);
|
||||
}
|
||||
}
|
||||
|
||||
private function renameStaticCall(string $lastName, StaticCall $staticCall): void
|
||||
{
|
||||
$staticCall->class = new Name($lastName);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,14 +57,14 @@ final class NullsafeOperatorRector extends AbstractRector
|
|||
<<<'CODE_SAMPLE'
|
||||
class SomeClass
|
||||
{
|
||||
public function f($o)
|
||||
public function run($someObject)
|
||||
{
|
||||
$o2 = $o->mayFail1();
|
||||
if ($o2 === null) {
|
||||
$someObject2 = $someObject->mayFail1();
|
||||
if ($someObject2 === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $o2->mayFail2();
|
||||
return $someObject2->mayFail2();
|
||||
}
|
||||
}
|
||||
CODE_SAMPLE
|
||||
|
@ -72,9 +72,9 @@ CODE_SAMPLE
|
|||
<<<'CODE_SAMPLE'
|
||||
class SomeClass
|
||||
{
|
||||
public function f($o)
|
||||
public function run($someObject)
|
||||
{
|
||||
return $o->mayFail1()?->mayFail2();
|
||||
return $someObject->mayFail1()?->mayFail2();
|
||||
}
|
||||
}
|
||||
CODE_SAMPLE
|
||||
|
|
|
@ -115,7 +115,7 @@ CODE_SAMPLE
|
|||
$lastElseStmtKey = array_key_last($node->else->stmts);
|
||||
|
||||
$elseStmts = $node->else->stmts;
|
||||
|
||||
|
||||
$return = new Return_($assign->expr);
|
||||
$this->copyCommentIfExists($assign, $return);
|
||||
$elseStmts[$lastElseStmtKey] = $return;
|
||||
|
|
Loading…
Reference in New Issue
Block a user