Skip to content

Commit 1424f50

Browse files
authored
[CodeQuality] Only allow from final class or constant is marked final on VariableConstFetchToClassConstFetchRector (#7904)
1 parent ebf9eb2 commit 1424f50

File tree

4 files changed

+64
-9
lines changed

4 files changed

+64
-9
lines changed

rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/some_class.php.inc renamed to rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/allow_final_class_constant.php.inc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ declare(strict_types=1);
44

55
namespace Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Fixture;
66

7-
use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithConstants;
7+
use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithFinalConstant;
88

9-
final class SomeClass
9+
final class AllowFinalClassConstant
1010
{
11-
public function run(ClassWithConstants $classWithConstants)
11+
public function run(ClassWithFinalConstant $classWithFinalConstant)
1212
{
13-
return $classWithConstants::NAME;
13+
return $classWithFinalConstant::NAME;
1414
}
1515
}
1616

@@ -22,13 +22,13 @@ declare(strict_types=1);
2222

2323
namespace Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Fixture;
2424

25-
use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithConstants;
25+
use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithFinalConstant;
2626

27-
final class SomeClass
27+
final class AllowFinalClassConstant
2828
{
29-
public function run(ClassWithConstants $classWithConstants)
29+
public function run(ClassWithFinalConstant $classWithFinalConstant)
3030
{
31-
return \Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithConstants::NAME;
31+
return \Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithFinalConstant::NAME;
3232
}
3333
}
3434

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Fixture;
6+
7+
use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithConstants;
8+
9+
final class SkipClassConstantFromNonFinalClass
10+
{
11+
public function run(ClassWithConstants $classWithConstants)
12+
{
13+
return $classWithConstants::NAME;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source;
6+
7+
class ClassWithFinalConstant
8+
{
9+
public final const NAME = 'SomeName';
10+
}

rules/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PhpParser\Node\Expr\Variable;
1010
use PhpParser\Node\Identifier;
1111
use PhpParser\Node\Name\FullyQualified;
12+
use PHPStan\Reflection\ReflectionProvider;
1213
use PHPStan\Type\ObjectType;
1314
use Rector\Rector\AbstractRector;
1415
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@@ -19,13 +20,22 @@
1920
*/
2021
final class VariableConstFetchToClassConstFetchRector extends AbstractRector
2122
{
23+
public function __construct(
24+
private readonly ReflectionProvider $reflectionProvider
25+
) {
26+
}
27+
2228
public function getRuleDefinition(): RuleDefinition
2329
{
2430
return new RuleDefinition(
25-
'Change variable class constant fetch to direct class constant fetch',
31+
'Change variable class constant fetch to direct class constant fetch when class or constant target is final',
2632
[
2733
new CodeSample(
2834
<<<'CODE_SAMPLE'
35+
final class AnotherClass
36+
{
37+
}
38+
2939
class SomeClass
3040
{
3141
public function run(AnotherClass $anotherClass)
@@ -36,6 +46,10 @@ public function run(AnotherClass $anotherClass)
3646
CODE_SAMPLE
3747
,
3848
<<<'CODE_SAMPLE'
49+
final class AnotherClass
50+
{
51+
}
52+
3953
class SomeClass
4054
{
4155
public function run(AnotherClass $anotherClass)
@@ -84,6 +98,22 @@ public function refactor(Node $node): ?ClassConstFetch
8498
return null;
8599
}
86100

101+
if (! $this->reflectionProvider->hasClass($classObjectType->getClassName())) {
102+
return null;
103+
}
104+
105+
$classReflection = $this->reflectionProvider->getClass($classObjectType->getClassName());
106+
if (! $classReflection->isFinalByKeyword()) {
107+
if (! $classReflection->hasConstant($constantName)) {
108+
return null;
109+
}
110+
111+
$constant = $classReflection->getConstant($constantName);
112+
if (! $constant->isFinal()) {
113+
return null;
114+
}
115+
}
116+
87117
$node->class = new FullyQualified($classObjectType->getClassName());
88118

89119
return $node;

0 commit comments

Comments
 (0)