-
Notifications
You must be signed in to change notification settings - Fork 559
Expand file tree
/
Copy pathParentMethodHelper.php
More file actions
77 lines (63 loc) · 2.05 KB
/
ParentMethodHelper.php
File metadata and controls
77 lines (63 loc) · 2.05 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
77
<?php declare(strict_types = 1);
namespace PHPStan\Rules\Methods;
use PHPStan\DependencyInjection\AutowiredService;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ExtendedMethodReflection;
use PHPStan\Reflection\Php\PhpClassReflectionExtension;
#[AutowiredService]
final class ParentMethodHelper
{
public function __construct(
private PhpClassReflectionExtension $phpClassReflectionExtension,
)
{
}
/**
* @return list<array{ExtendedMethodReflection, ClassReflection}>
*/
public function collectParentMethods(string $methodName, ClassReflection $class): array
{
$parentMethods = [];
$parentClass = $class->getParentClass();
if ($parentClass !== null && $parentClass->hasNativeMethod($methodName)) {
$parentMethod = $parentClass->getNativeMethod($methodName);
if (!$parentMethod->isPrivate()) {
$parentMethods[] = [$parentMethod, $parentMethod->getDeclaringClass()];
}
}
foreach ($class->getInterfaces() as $interface) {
if (!$interface->hasNativeMethod($methodName)) {
continue;
}
$method = $interface->getNativeMethod($methodName);
$parentMethods[] = [$method, $method->getDeclaringClass()];
}
foreach ($class->getTraits(true) as $trait) {
$nativeTraitReflection = $trait->getNativeReflection();
if (!$nativeTraitReflection->hasMethod($methodName)) {
continue;
}
$methodReflection = $nativeTraitReflection->getMethod($methodName);
$isAbstract = $methodReflection->isAbstract();
if (!$isAbstract) {
continue;
}
// Skip traits that inherited the method from a sub-trait
// The actual declaring trait will be processed separately
if ($methodReflection->getBetterReflection()->getDeclaringClass()->getName() !== $trait->getName()) {
continue;
}
$declaringTrait = $trait->getNativeMethod($methodName)->getDeclaringClass();
$parentMethods[] = [
$this->phpClassReflectionExtension->createUserlandMethodReflection(
$trait,
$class,
$methodReflection,
$declaringTrait->getName(),
),
$declaringTrait,
];
}
return $parentMethods;
}
}