|
24 | 24 | use TheCodingMachine\GraphQLite\Annotations\Type;
|
25 | 25 | use TheCodingMachine\GraphQLite\Annotations\TypeInterface;
|
26 | 26 |
|
| 27 | +use function array_diff_key; |
27 | 28 | use function array_filter;
|
28 | 29 | use function array_key_exists;
|
29 | 30 | use function array_map;
|
30 | 31 | use function array_merge;
|
31 | 32 | use function assert;
|
32 | 33 | use function count;
|
| 34 | +use function get_class; |
33 | 35 | use function is_a;
|
34 | 36 | use function reset;
|
| 37 | +use function trigger_error; |
| 38 | + |
| 39 | +use const E_USER_DEPRECATED; |
35 | 40 |
|
36 | 41 | class AnnotationReader
|
37 | 42 | {
|
@@ -248,11 +253,41 @@ public function getParameterAnnotationsPerParameter(array $refParameters): array
|
248 | 253 | if (empty($refParameters)) {
|
249 | 254 | return [];
|
250 | 255 | }
|
251 |
| - $firstParam = reset($refParameters); |
252 | 256 |
|
| 257 | + /** @var array<string, array<int,ParameterAnnotationInterface>> $parameterAnnotationsPerParameter */ |
| 258 | + $parameterAnnotationsPerParameter = []; |
| 259 | + |
| 260 | + // resolve parameter annotations targeted to method |
| 261 | + $firstParam = reset($refParameters); |
253 | 262 | $method = $firstParam->getDeclaringFunction();
|
254 | 263 | assert($method instanceof ReflectionMethod);
|
255 | 264 |
|
| 265 | + $parameterAnnotations = $this->getMethodAnnotations($method, ParameterAnnotationInterface::class); |
| 266 | + foreach ($parameterAnnotations as $parameterAnnotation) { |
| 267 | + trigger_error( |
| 268 | + "Using '" . ParameterAnnotationInterface::class . "' over methods is deprecated. " . |
| 269 | + "Found attribute '" . $parameterAnnotation::class . |
| 270 | + "' over '" . $method->getDeclaringClass()->getName() . ':' . $method->getName() . "'. " . |
| 271 | + "Please target annotation to the parameter '$" . $parameterAnnotation->getTarget() . "' instead", |
| 272 | + E_USER_DEPRECATED, |
| 273 | + ); |
| 274 | + |
| 275 | + $parameterAnnotationsPerParameter[$parameterAnnotation->getTarget()][] = $parameterAnnotation; |
| 276 | + } |
| 277 | + |
| 278 | + // Let's check that the referenced parameters actually do exist: |
| 279 | + $parametersByKey = []; |
| 280 | + foreach ($refParameters as $refParameter) { |
| 281 | + $parametersByKey[$refParameter->getName()] = true; |
| 282 | + } |
| 283 | + $diff = array_diff_key($parameterAnnotationsPerParameter, $parametersByKey); |
| 284 | + if (count($diff) > 0) { |
| 285 | + foreach ($diff as $parameterName => $parameterAnnotations) { |
| 286 | + throw InvalidParameterException::parameterNotFound($parameterName, get_class($parameterAnnotations[0]), $method); |
| 287 | + } |
| 288 | + } |
| 289 | + |
| 290 | + // resolve parameter annotations targeted to parameter |
256 | 291 | foreach ($refParameters as $refParameter) {
|
257 | 292 | $attributes = $refParameter->getAttributes();
|
258 | 293 | $parameterAnnotationsPerParameter[$refParameter->getName()] = [...$parameterAnnotationsPerParameter[$refParameter->getName()] ??
|
|
0 commit comments