Skip to content

Commit 016d7f2

Browse files
[dx] Add getClassReflection() to AbstractRector, use it in Class_ node rules (#8827)
Co-authored-by: GitHub Action <actions@github.com>
1 parent 87cb92a commit 016d7f2

13 files changed

Lines changed: 56 additions & 77 deletions

File tree

‎rules-tests/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector/Fixture/keep_create_component.php.inc‎

Lines changed: 0 additions & 10 deletions
This file was deleted.

‎rules/CodeQuality/Rector/Class_/ConvertStaticToSelfRector.php‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,17 @@ public function refactor(Node $node): ?Class_
7777
{
7878
$hasChanged = false;
7979
$isFinal = $node->isFinal() || FeatureFlags::treatClassesAsFinal($node);
80+
8081
$scope = null;
81-
$classReflection = null;
82+
83+
$classReflection = $this->getClassReflection($node);
84+
if (! $classReflection instanceof ClassReflection) {
85+
return null;
86+
}
8287

8388
$this->traverseNodesWithCallable($node->stmts, function (Node $subNode) use (
8489
&$hasChanged,
85-
&$classReflection,
90+
$classReflection,
8691
$isFinal,
8792
&$scope,
8893
$node,
@@ -108,11 +113,6 @@ public function refactor(Node $node): ?Class_
108113
}
109114

110115
$scope ??= ScopeFetcher::fetch($node);
111-
$classReflection ??= $scope->getClassReflection();
112-
113-
if (! $classReflection instanceof ClassReflection) {
114-
return null;
115-
}
116116

117117
if ($this->shouldSkip($subNode, $classReflection, $isFinal, $scope)) {
118118
return null;

‎rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use PhpParser\Node\Stmt\Enum_;
1111
use PHPStan\Reflection\ClassReflection;
1212
use Rector\NodeManipulator\ClassConstManipulator;
13-
use Rector\PHPStan\ScopeFetcher;
1413
use Rector\Rector\AbstractRector;
1514
use Rector\Reflection\ReflectionResolver;
1615
use Rector\RuleDoc\CodeSample\CodeSample;
@@ -78,7 +77,7 @@ public function refactor(Node $node): ?Node
7877
continue;
7978
}
8079

81-
if ($this->shouldSkipClassConst($stmt)) {
80+
if ($this->shouldSkipClassConst($classReflection, $stmt)) {
8281
continue;
8382
}
8483

@@ -101,7 +100,7 @@ public function refactor(Node $node): ?Node
101100
return $node;
102101
}
103102

104-
private function shouldSkipClassConst(ClassConst $classConst): bool
103+
private function shouldSkipClassConst(ClassReflection $classReflection, ClassConst $classConst): bool
105104
{
106105
if (! $classConst->isPrivate()) {
107106
return true;
@@ -111,13 +110,6 @@ private function shouldSkipClassConst(ClassConst $classConst): bool
111110
return true;
112111
}
113112

114-
$scope = ScopeFetcher::fetch($classConst);
115-
116-
$classReflection = $scope->getClassReflection();
117-
if (! $classReflection instanceof ClassReflection) {
118-
return false;
119-
}
120-
121113
return $this->hasParentClassOfEnumSuffix($classReflection);
122114
}
123115

‎rules/DeadCode/Rector/Class_/RemoveRefactorDuplicatedNodeInstanceCheckRector.php‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use PHPStan\Type\ObjectType;
1717
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
1818
use Rector\PhpParser\Node\Value\ValueResolver;
19-
use Rector\PHPStan\ScopeFetcher;
2019
use Rector\Rector\AbstractRector;
2120
use Rector\RuleDoc\CodeSample\CodeSample;
2221
use Rector\RuleDoc\RuleDefinition;
@@ -91,9 +90,7 @@ public function getNodeTypes(): array
9190
*/
9291
public function refactor(Node $node): ?Node
9392
{
94-
$scope = ScopeFetcher::fetch($node);
95-
$classReflection = $scope->getClassReflection();
96-
93+
$classReflection = $this->getClassReflection($node);
9794
if (! $classReflection instanceof ClassReflection) {
9895
return null;
9996
}

‎rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public function refactor(Node $node): Class_|null
9292
return null;
9393
}
9494

95-
$classReflection = $scope->getClassReflection();
95+
$classReflection = $this->getClassReflection($node);
9696
if (! $classReflection instanceof ClassReflection) {
9797
return null;
9898
}

‎rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use PHPStan\Reflection\Php\PhpMethodReflection;
1717
use Rector\Enum\ObjectReference;
1818
use Rector\NodeCollector\StaticAnalyzer;
19-
use Rector\PHPStan\ScopeFetcher;
2019
use Rector\Rector\AbstractRector;
2120
use Rector\Reflection\ReflectionResolver;
2221
use Rector\RuleDoc\CodeSample\CodeSample;
@@ -93,13 +92,11 @@ public function getNodeTypes(): array
9392
*/
9493
public function refactor(Node $node): ?Node
9594
{
96-
$scope = ScopeFetcher::fetch($node);
97-
if (! $scope->isInClass()) {
95+
$classReflection = $this->getClassReflection($node);
96+
if (! $classReflection instanceof ClassReflection) {
9897
return null;
9998
}
10099

101-
$classReflection = $scope->getClassReflection();
102-
103100
// skip PHPUnit calls, as they accept both self:: and $this-> formats
104101
if ($classReflection->is('PHPUnit\Framework\TestCase')) {
105102
return null;

‎rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
use Rector\NodeTypeResolver\Node\AttributeKey;
2727
use Rector\PhpParser\Node\BetterNodeFinder;
2828
use Rector\PhpParser\Printer\BetterStandardPrinter;
29-
use Rector\PHPStan\ScopeFetcher;
3029
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
3130
use Rector\Rector\AbstractRector;
3231
use Rector\RuleDoc\CodeSample\CodeSample;
@@ -113,6 +112,11 @@ public function refactor(Node $node): ?Node
113112

114113
$hasChanged = false;
115114

115+
$classReflection = $this->getClassReflection($node);
116+
if (! $classReflection instanceof ClassReflection) {
117+
return null;
118+
}
119+
116120
foreach ($node->getMethods() as $classMethod) {
117121
if ($this->isName($classMethod, MethodName::CONSTRUCT)) {
118122
continue;
@@ -127,14 +131,11 @@ public function refactor(Node $node): ?Node
127131
continue;
128132
}
129133

130-
$scope = ScopeFetcher::fetch($node);
131-
$currentClassReflection = $scope->getClassReflection();
132-
133134
// It relies on phpstorm stubs that define 2 kind of query method for both php 7.4 and php 8.0
134135
// @see https://github.com/JetBrains/phpstorm-stubs/blob/e2e898a29929d2f520fe95bdb2109d8fa895ba4a/PDO/PDO.php#L1096-L1126
135136
if ($parentMethodReflection->getName() === 'query'
136-
&& $currentClassReflection instanceof ClassReflection
137-
&& $currentClassReflection->is('PDO')) {
137+
// && $classReflection instanceof ClassReflection
138+
&& $classReflection->is('PDO')) {
138139
continue;
139140
}
140141

‎rules/Privatization/Rector/ClassConst/PrivatizeFinalClassConstantRector.php‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use PhpParser\Node\Stmt\Class_;
99
use PhpParser\Node\Stmt\ClassConst;
1010
use PHPStan\Reflection\ClassReflection;
11-
use Rector\PHPStan\ScopeFetcher;
1211
use Rector\Privatization\Guard\OverrideByParentClassGuard;
1312
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
1413
use Rector\Rector\AbstractRector;
@@ -68,8 +67,7 @@ public function refactor(Node $node): ?Node
6867
return null;
6968
}
7069

71-
$scope = ScopeFetcher::fetch($node);
72-
$classReflection = $scope->getClassReflection();
70+
$classReflection = $this->getClassReflection($node);
7371
if (! $classReflection instanceof ClassReflection) {
7472
return null;
7573
}

‎rules/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector.php‎

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use PhpParser\Node\Stmt\ClassMethod;
1111
use PHPStan\Reflection\ClassReflection;
1212
use Rector\PhpParser\Node\BetterNodeFinder;
13-
use Rector\PHPStan\ScopeFetcher;
1413
use Rector\Privatization\Guard\LaravelModelGuard;
1514
use Rector\Privatization\Guard\OverrideByParentClassGuard;
1615
use Rector\Privatization\Guard\ParentClassMagicCallGuard;
@@ -80,14 +79,12 @@ public function refactor(Node $node): ?Node
8079
return null;
8180
}
8281

83-
if (! $this->overrideByParentClassGuard->isLegal($node)) {
82+
$classReflection = $this->getClassReflection($node);
83+
if (! $classReflection instanceof ClassReflection) {
8484
return null;
8585
}
8686

87-
$scope = ScopeFetcher::fetch($node);
88-
89-
$classReflection = $scope->getClassReflection();
90-
if (! $classReflection instanceof ClassReflection) {
87+
if (! $this->overrideByParentClassGuard->isLegal($node)) {
9188
return null;
9289
}
9390

@@ -133,13 +130,6 @@ public function refactor(Node $node): ?Node
133130

134131
private function shouldSkipClassMethod(ClassMethod $classMethod): bool
135132
{
136-
// edge case in nette framework
137-
/** @var string $methodName */
138-
$methodName = $this->getName($classMethod->name);
139-
if (str_starts_with($methodName, 'createComponent')) {
140-
return true;
141-
}
142-
143133
if (! $classMethod->isProtected()) {
144134
return true;
145135
}
@@ -149,7 +139,7 @@ private function shouldSkipClassMethod(ClassMethod $classMethod): bool
149139
}
150140

151141
// if has parent call, its probably overriding parent one → skip it
152-
$hasParentCall = (bool) $this->betterNodeFinder->findFirst(
142+
return (bool) $this->betterNodeFinder->findFirst(
153143
(array) $classMethod->stmts,
154144
function (Node $node): bool {
155145
if (! $node instanceof StaticCall) {
@@ -159,7 +149,5 @@ function (Node $node): bool {
159149
return $this->isName($node->class, 'parent');
160150
}
161151
);
162-
163-
return $hasParentCall;
164152
}
165153
}

‎rules/TypeDeclaration/Rector/Class_/ObjectTypedPropertyFromJMSSerializerAttributeTypeRector.php‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
use PhpParser\Node\Stmt\Property;
1313
use PHPStan\Reflection\ClassReflection;
1414
use Rector\Php74\Guard\MakePropertyTypedGuard;
15-
use Rector\PHPStan\ScopeFetcher;
1615
use Rector\Rector\AbstractRector;
1716
use Rector\RuleDoc\CodeSample\CodeSample;
1817
use Rector\RuleDoc\RuleDefinition;
@@ -83,9 +82,7 @@ public function refactor(Node $node): ?Node
8382
return null;
8483
}
8584

86-
$scope = ScopeFetcher::fetch($node);
87-
88-
$classReflection = $scope->getClassReflection();
85+
$classReflection = $this->getClassReflection($node);
8986
if (! $classReflection instanceof ClassReflection) {
9087
return null;
9188
}

0 commit comments

Comments
 (0)