Skip to content

Commit 2869153

Browse files
committed
[utils] Add RemoveRefactorDuplicatedNodeInstanceCheckRector
1 parent 6a73bb5 commit 2869153

3 files changed

Lines changed: 45 additions & 27 deletions

File tree

rector.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Rector\Config\RectorConfig;
77
use Rector\DeadCode\Rector\ConstFetch\RemovePhpVersionIdCheckRector;
88
use Rector\Php55\Rector\String_\StringClassNameToClassConstantRector;
9+
use Rector\Utils\Rector\RemoveRefactorDuplicatedNodeInstanceCheckRector;
910

1011
return RectorConfig::configure()
1112
->withPreparedSets(
@@ -18,7 +19,6 @@
1819
naming: true,
1920
instanceOf: true,
2021
earlyReturn: true,
21-
strictBooleans: true,
2222
rectorPreset: true,
2323
phpunitCodeQuality: true
2424
)
@@ -37,6 +37,7 @@
3737
])
3838
->withRootFiles()
3939
->withImportNames(removeUnusedImports: true)
40+
->withRules([RemoveRefactorDuplicatedNodeInstanceCheckRector::class])
4041
->withSkip([
4142
StringClassNameToClassConstantRector::class,
4243
// tests

rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
use Rector\NodeAnalyzer\MagicClassMethodAnalyzer;
1414
use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer;
1515
use Rector\Rector\AbstractRector;
16-
use Rector\Symfony\Enum\SymfonyClass;
1716
use Rector\ValueObject\MethodName;
1817
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
1918
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;

utils/Rector/RemoveRefactorDuplicatedNodeInstanceCheckRector.php

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,36 @@
55
namespace Rector\Utils\Rector;
66

77
use PhpParser\Node;
8-
use PhpParser\Node\Expr\PropertyFetch;
9-
use PhpParser\Node\Stmt\Class_;
8+
use PhpParser\Node\Stmt\ClassMethod;
109
use PhpParser\Node\Stmt\If_;
11-
use PhpParser\Node\Stmt\Property;
1210
use PHPStan\Type\ObjectType;
1311
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
14-
use Rector\NodeManipulator\ClassDependencyManipulator;
15-
use Rector\PhpParser\Node\BetterNodeFinder;
16-
use Rector\PhpParser\Node\Value\ValueResolver;
17-
use Rector\PostRector\ValueObject\PropertyMetadata;
1812
use Rector\Rector\AbstractRector;
19-
use Rector\StaticTypeMapper\StaticTypeMapper;
13+
use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType;
2014
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
2115

2216
final class RemoveRefactorDuplicatedNodeInstanceCheckRector extends AbstractRector
2317
{
18+
public function __construct(
19+
private readonly PhpDocInfoFactory $phpDocInfoFactory
20+
) {
21+
}
22+
2423
public function getRuleDefinition(): RuleDefinition
2524
{
26-
return new RuleDefinition('Remove refactor() method of Rector rule double check of $node instance, if already defined in @param type', []);
25+
return new RuleDefinition(
26+
'Remove refactor() method of Rector rule double check of $node instance, if already defined in @param type',
27+
[]
28+
);
2729
}
2830

2931
public function getNodeTypes(): array
3032
{
31-
return [Node\Stmt\ClassMethod::class];
33+
return [ClassMethod::class];
3234
}
3335

3436
/**
35-
* @param Node\Stmt\ClassMethod $node
37+
* @param ClassMethod $node
3638
*/
3739
public function refactor(Node $node): ?Node
3840
{
@@ -49,32 +51,48 @@ public function refactor(Node $node): ?Node
4951
return null;
5052
}
5153

52-
// remove already added properties
54+
if (! $firstStmt->cond instanceof Node\Expr\BooleanNot) {
55+
return null;
56+
}
57+
58+
$booleanNot = $firstStmt->cond;
5359

54-
if ($typesToAdd === []) {
60+
if (! $booleanNot->expr instanceof Node\Expr\Instanceof_) {
5561
return null;
5662
}
5763

58-
$hasChanged = false;
64+
$instanceIf = $booleanNot->expr;
65+
$checkedClassType = $this->getType($instanceIf->class);
5966

60-
foreach ($typesToAdd as $propertyNameToAdd => $propertyTypeToAdd) {
61-
// skip if property already exists
62-
if ($node->getProperty($propertyNameToAdd) instanceof Property) {
63-
continue;
64-
}
67+
if (! $checkedClassType instanceof ObjectType) {
68+
return null;
69+
}
6570

66-
$this->classDependencyManipulator->addConstructorDependency(
67-
$node,
68-
new PropertyMetadata($propertyNameToAdd, new ObjectType($propertyTypeToAdd))
69-
);
71+
$classReflection = $checkedClassType->getClassReflection();
7072

71-
$hasChanged = true;
73+
if (! $classReflection->is(Node::class)) {
74+
return null;
7275
}
7376

74-
if (! $hasChanged) {
77+
$classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
78+
79+
$paramType = $classMethodPhpDocInfo->getParamType('$node');
80+
if (! $paramType instanceof ObjectType) {
7581
return null;
7682
}
7783

84+
if ($paramType instanceof ShortenedObjectType) {
85+
$className = $paramType->getFullyQualifiedName();
86+
} else {
87+
$className = $paramType->getClassName();
88+
}
89+
90+
if ($className !== $checkedClassType->getClassName()) {
91+
return null;
92+
}
93+
94+
unset($node->stmts[0]);
95+
7896
return $node;
7997
}
8098
}

0 commit comments

Comments
 (0)