-
-
Notifications
You must be signed in to change notification settings - Fork 687
/
ConvertStaticPrivateConstantToSelfRector.php
110 lines (106 loc) · 3.09 KB
/
ConvertStaticPrivateConstantToSelfRector.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
declare (strict_types=1);
namespace Rector\CodeQuality\Rector\ClassConstFetch;
use PhpParser\Node;
use PhpParser\Node\Expr\ClassConstFetch;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\Class_;
use Rector\Rector\AbstractRector;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Tests\CodeQuality\Rector\ClassConstFetch\ConvertStaticPrivateConstantToSelfRector\ConvertStaticPrivateConstantToSelfRectorTest
*
* @see https://3v4l.org/8Y0ba
* @see https://phpstan.org/r/11d4c850-1a40-4fae-b665-291f96104d11
*/
final class ConvertStaticPrivateConstantToSelfRector extends AbstractRector
{
public function getRuleDefinition() : RuleDefinition
{
return new RuleDefinition('Replaces static::* access to private constants with self::*', [new CodeSample(<<<'CODE_SAMPLE'
final class Foo
{
private const BAR = 'bar';
public function run()
{
$bar = static::BAR;
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
final class Foo
{
private const BAR = 'bar';
public function run()
{
$bar = self::BAR;
}
}
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [Class_::class];
}
/**
* @param Class_ $node
*/
public function refactor(Node $node) : ?Class_
{
if ($node->getConstants() === []) {
return null;
}
$class = $node;
$hasChanged = \false;
$this->traverseNodesWithCallable($class, function (Node $node) use($class, &$hasChanged) : ?Node {
if (!$node instanceof ClassConstFetch) {
return null;
}
if (!$this->isUsingStatic($node)) {
return null;
}
if (!$class->isFinal() && !$this->isPrivateConstant($node, $class)) {
return null;
}
$hasChanged = \true;
$node->class = new Name('self');
return $node;
});
if ($hasChanged) {
return $node;
}
return null;
}
private function isUsingStatic(ClassConstFetch $classConstFetch) : bool
{
return $this->isName($classConstFetch->class, 'static');
}
private function isPrivateConstant(ClassConstFetch $classConstFetch, Class_ $class) : bool
{
$constantName = $this->getConstantName($classConstFetch);
if ($constantName === null) {
return \false;
}
foreach ($class->getConstants() as $classConst) {
if (!$this->nodeNameResolver->isName($classConst, $constantName)) {
continue;
}
return $classConst->isPrivate();
}
return \false;
}
private function getConstantName(ClassConstFetch $classConstFetch) : ?string
{
$constantNameIdentifier = $classConstFetch->name;
if (!$constantNameIdentifier instanceof Identifier) {
return null;
}
return $constantNameIdentifier->toString();
}
}