|
4 | 4 |
|
5 | 5 | use PhpParser\Node; |
6 | 6 | use PHPStan\Analyser\Scope; |
7 | | -use PHPStan\Broker\Broker; |
8 | 7 | use PHPStan\Node\InClassMethodNode; |
9 | | -use PHPStan\Reflection\ClassReflection; |
10 | 8 | use PHPStan\Reflection\MethodReflection; |
11 | | -use PHPStan\Reflection\ParameterReflection; |
12 | 9 | use PHPStan\Reflection\ParametersAcceptorSelector; |
13 | 10 |
|
14 | 11 | class TypeHintDeprecatedInClassMethodSignatureRule implements \PHPStan\Rules\Rule |
15 | 12 | { |
16 | 13 |
|
17 | | - /** @var Broker */ |
18 | | - private $broker; |
| 14 | + /** @var DeprecatedClassHelper */ |
| 15 | + private $deprecatedClassHelper; |
19 | 16 |
|
20 | | - public function __construct(Broker $broker) |
| 17 | + public function __construct(DeprecatedClassHelper $deprecatedClassHelper) |
21 | 18 | { |
22 | | - $this->broker = $broker; |
| 19 | + $this->deprecatedClassHelper = $deprecatedClassHelper; |
23 | 20 | } |
24 | 21 |
|
25 | 22 | public function getNodeType(): string |
@@ -47,98 +44,54 @@ public function processNode(Node $node, Scope $scope): array |
47 | 44 |
|
48 | 45 | $errors = []; |
49 | 46 | foreach ($methodSignature->getParameters() as $i => $parameter) { |
50 | | - /** @var ParameterReflection $parameter */ |
51 | | - $deprecatedClasses = $this->filterDeprecatedClasses($parameter->getType()->getReferencedClasses()); |
| 47 | + $deprecatedClasses = $this->deprecatedClassHelper->filterDeprecatedClasses($parameter->getType()->getReferencedClasses()); |
52 | 48 | foreach ($deprecatedClasses as $deprecatedClass) { |
53 | 49 | if ($method->getDeclaringClass()->isAnonymous()) { |
54 | 50 | $errors[] = sprintf( |
55 | 51 | 'Parameter $%s of method %s() in anonymous class has typehint with deprecated %s %s%s', |
56 | 52 | $parameter->getName(), |
57 | 53 | $method->getName(), |
58 | | - $this->getClassType($deprecatedClass), |
| 54 | + $this->deprecatedClassHelper->getClassType($deprecatedClass), |
59 | 55 | $deprecatedClass->getName(), |
60 | | - $this->getClassDeprecationDescription($deprecatedClass) |
| 56 | + $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass) |
61 | 57 | ); |
62 | 58 | } else { |
63 | 59 | $errors[] = sprintf( |
64 | 60 | 'Parameter $%s of method %s::%s() has typehint with deprecated %s %s%s', |
65 | 61 | $parameter->getName(), |
66 | 62 | $method->getDeclaringClass()->getName(), |
67 | 63 | $method->getName(), |
68 | | - $this->getClassType($deprecatedClass), |
| 64 | + $this->deprecatedClassHelper->getClassType($deprecatedClass), |
69 | 65 | $deprecatedClass->getName(), |
70 | | - $this->getClassDeprecationDescription($deprecatedClass) |
| 66 | + $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass) |
71 | 67 | ); |
72 | 68 | } |
73 | 69 | } |
74 | 70 | } |
75 | 71 |
|
76 | | - $deprecatedClasses = $this->filterDeprecatedClasses($methodSignature->getReturnType()->getReferencedClasses()); |
| 72 | + $deprecatedClasses = $this->deprecatedClassHelper->filterDeprecatedClasses($methodSignature->getReturnType()->getReferencedClasses()); |
77 | 73 | foreach ($deprecatedClasses as $deprecatedClass) { |
78 | 74 | if ($method->getDeclaringClass()->isAnonymous()) { |
79 | 75 | $errors[] = sprintf( |
80 | 76 | 'Return type of method %s() in anonymous class has typehint with deprecated %s %s%s', |
81 | 77 | $method->getName(), |
82 | | - $this->getClassType($deprecatedClass), |
| 78 | + $this->deprecatedClassHelper->getClassType($deprecatedClass), |
83 | 79 | $deprecatedClass->getName(), |
84 | | - $this->getClassDeprecationDescription($deprecatedClass) |
| 80 | + $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass) |
85 | 81 | ); |
86 | 82 | } else { |
87 | 83 | $errors[] = sprintf( |
88 | 84 | 'Return type of method %s::%s() has typehint with deprecated %s %s%s', |
89 | 85 | $method->getDeclaringClass()->getName(), |
90 | 86 | $method->getName(), |
91 | | - $this->getClassType($deprecatedClass), |
| 87 | + $this->deprecatedClassHelper->getClassType($deprecatedClass), |
92 | 88 | $deprecatedClass->getName(), |
93 | | - $this->getClassDeprecationDescription($deprecatedClass) |
| 89 | + $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass) |
94 | 90 | ); |
95 | 91 | } |
96 | 92 | } |
97 | 93 |
|
98 | 94 | return $errors; |
99 | 95 | } |
100 | 96 |
|
101 | | - private function getClassType(ClassReflection $class): string |
102 | | - { |
103 | | - if ($class->isInterface()) { |
104 | | - return 'interface'; |
105 | | - } |
106 | | - |
107 | | - return 'class'; |
108 | | - } |
109 | | - |
110 | | - private function getClassDeprecationDescription(ClassReflection $class): string |
111 | | - { |
112 | | - $description = $class->getDeprecatedDescription(); |
113 | | - if ($description === null) { |
114 | | - return '.'; |
115 | | - } |
116 | | - |
117 | | - return sprintf(":\n%s", $description); |
118 | | - } |
119 | | - |
120 | | - /** |
121 | | - * @param string[] $referencedClasses |
122 | | - * @return ClassReflection[] |
123 | | - */ |
124 | | - private function filterDeprecatedClasses(array $referencedClasses): array |
125 | | - { |
126 | | - $deprecatedClasses = []; |
127 | | - foreach ($referencedClasses as $referencedClass) { |
128 | | - try { |
129 | | - $class = $this->broker->getClass($referencedClass); |
130 | | - } catch (\PHPStan\Broker\ClassNotFoundException $e) { |
131 | | - continue; |
132 | | - } |
133 | | - |
134 | | - if (!$class->isDeprecated()) { |
135 | | - continue; |
136 | | - } |
137 | | - |
138 | | - $deprecatedClasses[] = $class; |
139 | | - } |
140 | | - |
141 | | - return $deprecatedClasses; |
142 | | - } |
143 | | - |
144 | 97 | } |
0 commit comments