forked from prism-php/bedrock
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReorderMethodsRector.php
More file actions
76 lines (60 loc) · 1.67 KB
/
ReorderMethodsRector.php
File metadata and controls
76 lines (60 loc) · 1.67 KB
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
<?php
namespace Prism\Bedrock\Rectors;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Rector\AbstractRector;
class ReorderMethodsRector extends AbstractRector
{
#[\Override]
public function getNodeTypes(): array
{
return [Class_::class];
}
/**
* @param Class_ $node
*/
#[\Override]
public function refactor(Node $node): ?Node
{
$methods = $node->getMethods();
if (count($methods) <= 1) {
return null;
}
$reorderedMethods = $this->reorderMethods($methods);
if ($methods === $reorderedMethods) {
return null;
}
$node->stmts = array_merge(
array_filter($node->stmts, fn (\PhpParser\Node\Stmt $stmt): bool => ! $stmt instanceof ClassMethod),
$reorderedMethods
);
return $node;
}
/**
* @param array<int, ClassMethod> $methods
* @return array<int, ClassMethod>
*/
protected function reorderMethods(array $methods): array
{
usort($methods, fn (ClassMethod $a, ClassMethod $b): int => $this->getMethodWeight($a) <=> $this->getMethodWeight($b));
return $methods;
}
protected function getMethodWeight(ClassMethod $method): int
{
if ($this->isMagicMethod($method)) {
return 0;
}
if ($method->isPublic()) {
return 1;
}
if ($method->isProtected()) {
return 2;
}
return 3; // private
}
protected function isMagicMethod(ClassMethod $method): bool
{
return str_starts_with($method->name->toString(), '__');
}
}