Skip to content

Commit 848d154

Browse files
committed
Updated Rector to commit 07451c9670374512c1692c8b51c7a4b0af0905be
rectorphp/rector-src@07451c9 fix RemoveRefactorDuplicatedNodeInstanceCheckRector location to dead-code, so its publicly available (#8066)
1 parent cff3821 commit 848d154

5 files changed

Lines changed: 146 additions & 3 deletions

File tree

config/set/rector-preset.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
use Rector\CodingStyle\Rector\PostInc\PostIncDecToPreIncDecRector;
77
use Rector\Config\RectorConfig;
8+
use Rector\DeadCode\Rector\Class_\RemoveRefactorDuplicatedNodeInstanceCheckRector;
89
use Rector\PHPUnit\CodeQuality\Rector\Class_\AddSeeTestAnnotationRector;
910
use Rector\Privatization\Rector\Class_\FinalizeTestCaseClassRector;
1011
use Rector\TypeDeclaration\Rector\StmtsAwareInterface\DeclareStrictTypesRector;
1112
use Rector\TypeDeclarationDocblocks\Rector\Class_\AddParamTypeToRefactorMethodRector;
12-
use Rector\Utils\Rector\RemoveRefactorDuplicatedNodeInstanceCheckRector;
1313
return static function (RectorConfig $rectorConfig): void {
1414
$rectorConfig->rules([DeclareStrictTypesRector::class, PostIncDecToPreIncDecRector::class, FinalizeTestCaseClassRector::class, AddParamTypeToRefactorMethodRector::class, RemoveRefactorDuplicatedNodeInstanceCheckRector::class, AddSeeTestAnnotationRector::class]);
1515
};
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
<?php
2+
3+
declare (strict_types=1);
4+
namespace Rector\DeadCode\Rector\Class_;
5+
6+
use PhpParser\Node;
7+
use PhpParser\Node\Expr;
8+
use PhpParser\Node\Expr\BooleanNot;
9+
use PhpParser\Node\Expr\Instanceof_;
10+
use PhpParser\Node\Stmt\Class_;
11+
use PhpParser\Node\Stmt\ClassMethod;
12+
use PhpParser\Node\Stmt\If_;
13+
use PhpParser\Node\Stmt\Return_;
14+
use PHPStan\Reflection\ClassReflection;
15+
use PHPStan\Type\ObjectType;
16+
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
17+
use Rector\PhpParser\Node\Value\ValueResolver;
18+
use Rector\PHPStan\ScopeFetcher;
19+
use Rector\Rector\AbstractRector;
20+
use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType;
21+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
22+
use RectorPrefix202606\Webmozart\Assert\Assert;
23+
/**
24+
* @see \Rector\Tests\DeadCode\Rector\Class_\RemoveRefactorDuplicatedNodeInstanceCheckRector\RemoveRefactorDuplicatedNodeInstanceCheckRectorTest
25+
*/
26+
final class RemoveRefactorDuplicatedNodeInstanceCheckRector extends AbstractRector
27+
{
28+
/**
29+
* @readonly
30+
*/
31+
private PhpDocInfoFactory $phpDocInfoFactory;
32+
/**
33+
* @readonly
34+
*/
35+
private ValueResolver $valueResolver;
36+
public function __construct(PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver)
37+
{
38+
$this->phpDocInfoFactory = $phpDocInfoFactory;
39+
$this->valueResolver = $valueResolver;
40+
}
41+
public function getRuleDefinition(): RuleDefinition
42+
{
43+
return new RuleDefinition('Remove refactor() method of Rector rule double check of $classMethod instance, if already defined in @param type', []);
44+
}
45+
public function getNodeTypes(): array
46+
{
47+
return [Class_::class];
48+
}
49+
/**
50+
* @param Class_ $node
51+
*/
52+
public function refactor(Node $node): ?Node
53+
{
54+
$scope = ScopeFetcher::fetch($node);
55+
$classReflection = $scope->getClassReflection();
56+
if (!$classReflection instanceof ClassReflection) {
57+
return null;
58+
}
59+
if (!$classReflection->is('Rector\Rector\AbstractRector')) {
60+
return null;
61+
}
62+
$refactorClassMethod = $node->getMethod('refactor');
63+
if (!$refactorClassMethod instanceof ClassMethod) {
64+
return null;
65+
}
66+
$firstStmt = $refactorClassMethod->stmts[0] ?? null;
67+
if (!$firstStmt instanceof If_) {
68+
return null;
69+
}
70+
$instanceofNodeClass = $this->matchBooleanNotInstanceOfNodeClass($firstStmt->cond);
71+
if (!is_string($instanceofNodeClass)) {
72+
return null;
73+
}
74+
$nodeParamTypeClass = $this->matchNodeParamType($refactorClassMethod);
75+
$getNodeTypesClassMethod = $node->getMethod('getNodeTypes');
76+
if (!$getNodeTypesClassMethod instanceof ClassMethod) {
77+
return null;
78+
}
79+
$soleReturn = $getNodeTypesClassMethod->stmts[0] ?? null;
80+
$nodeTypeClass = null;
81+
if ($soleReturn instanceof Return_) {
82+
Assert::isInstanceOf($soleReturn->expr, Expr::class);
83+
$nodeTypes = $this->valueResolver->getValue($soleReturn->expr);
84+
if (count($nodeTypes) === 1) {
85+
$nodeTypeClass = $nodeTypes[0];
86+
}
87+
}
88+
if ($nodeParamTypeClass !== null) {
89+
if ($nodeParamTypeClass !== $instanceofNodeClass) {
90+
return null;
91+
}
92+
} elseif ($nodeTypeClass !== null) {
93+
if ($nodeTypeClass !== $instanceofNodeClass) {
94+
return null;
95+
}
96+
} else {
97+
return null;
98+
}
99+
unset($refactorClassMethod->stmts[0]);
100+
return $node;
101+
}
102+
private function matchBooleanNotInstanceOfNodeClass(Expr $expr): ?string
103+
{
104+
if (!$expr instanceof BooleanNot) {
105+
return null;
106+
}
107+
$booleanNot = $expr;
108+
if (!$booleanNot->expr instanceof Instanceof_) {
109+
return null;
110+
}
111+
return $this->getInstanceofNodeClass($booleanNot->expr);
112+
}
113+
/**
114+
* @return class-string<Node>|null
115+
*/
116+
private function getInstanceofNodeClass(Instanceof_ $instanceof): ?string
117+
{
118+
$checkedClassType = $this->getType($instanceof->class);
119+
if (!$checkedClassType instanceof ObjectType) {
120+
return null;
121+
}
122+
/** @var ClassReflection $classReflection */
123+
$classReflection = $checkedClassType->getClassReflection();
124+
if (!$classReflection->is(Node::class)) {
125+
return null;
126+
}
127+
return $classReflection->getName();
128+
}
129+
private function matchNodeParamType(ClassMethod $classMethod): ?string
130+
{
131+
$classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod);
132+
$paramType = $classMethodPhpDocInfo->getParamType('$node');
133+
if (!$paramType instanceof ObjectType) {
134+
return null;
135+
}
136+
if ($paramType instanceof ShortenedObjectType) {
137+
return $paramType->getFullyQualifiedName();
138+
}
139+
return $paramType->getClassName();
140+
}
141+
}

src/Application/VersionResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ final class VersionResolver
1919
* @api
2020
* @var string
2121
*/
22-
public const PACKAGE_VERSION = '53a840f9604668b7b97a3ac7dbc8b482925e6c22';
22+
public const PACKAGE_VERSION = '07451c9670374512c1692c8b51c7a4b0af0905be';
2323
/**
2424
* @api
2525
* @var string
2626
*/
27-
public const RELEASE_DATE = '2026-06-20 16:09:06';
27+
public const RELEASE_DATE = '2026-06-20 14:52:44';
2828
/**
2929
* @var int
3030
*/

vendor/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,6 +1440,7 @@
14401440
'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnExprInConstructRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php',
14411441
'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnTagRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php',
14421442
'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveVoidDocblockFromMagicMethodRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector.php',
1443+
'Rector\\DeadCode\\Rector\\Class_\\RemoveRefactorDuplicatedNodeInstanceCheckRector' => $baseDir . '/rules/DeadCode/Rector/Class_/RemoveRefactorDuplicatedNodeInstanceCheckRector.php',
14431444
'Rector\\DeadCode\\Rector\\Closure\\RemoveUnusedClosureVariableUseRector' => $baseDir . '/rules/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector.php',
14441445
'Rector\\DeadCode\\Rector\\Concat\\RemoveConcatAutocastRector' => $baseDir . '/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php',
14451446
'Rector\\DeadCode\\Rector\\ConstFetch\\RemovePhpVersionIdCheckRector' => $baseDir . '/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php',

vendor/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,6 +1705,7 @@ class ComposerStaticInit311c1aff9403b33c90f3edae71d2b69d
17051705
'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnExprInConstructRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php',
17061706
'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnTagRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php',
17071707
'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveVoidDocblockFromMagicMethodRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector.php',
1708+
'Rector\\DeadCode\\Rector\\Class_\\RemoveRefactorDuplicatedNodeInstanceCheckRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Class_/RemoveRefactorDuplicatedNodeInstanceCheckRector.php',
17081709
'Rector\\DeadCode\\Rector\\Closure\\RemoveUnusedClosureVariableUseRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector.php',
17091710
'Rector\\DeadCode\\Rector\\Concat\\RemoveConcatAutocastRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php',
17101711
'Rector\\DeadCode\\Rector\\ConstFetch\\RemovePhpVersionIdCheckRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php',

0 commit comments

Comments
 (0)