|
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;
|
35 | 37 |
|
@@ -248,11 +250,33 @@ public function getParameterAnnotationsPerParameter(array $refParameters): array
|
248 | 250 | if (empty($refParameters)) {
|
249 | 251 | return [];
|
250 | 252 | }
|
251 |
| - $firstParam = reset($refParameters); |
252 | 253 |
|
| 254 | + /** @var array<string, array<int,ParameterAnnotationInterface>> $parameterAnnotationsPerParameter */ |
| 255 | + $parameterAnnotationsPerParameter = []; |
| 256 | + |
| 257 | + // resolve parameter annotations targeted to method |
| 258 | + $firstParam = reset($refParameters); |
253 | 259 | $method = $firstParam->getDeclaringFunction();
|
254 | 260 | assert($method instanceof ReflectionMethod);
|
255 | 261 |
|
| 262 | + $parameterAnnotations = $this->getMethodAnnotations($method, ParameterAnnotationInterface::class); |
| 263 | + foreach ($parameterAnnotations as $parameterAnnotation) { |
| 264 | + $parameterAnnotationsPerParameter[$parameterAnnotation->getTarget()][] = $parameterAnnotation; |
| 265 | + } |
| 266 | + |
| 267 | + // Let's check that the referenced parameters actually do exist: |
| 268 | + $parametersByKey = []; |
| 269 | + foreach ($refParameters as $refParameter) { |
| 270 | + $parametersByKey[$refParameter->getName()] = true; |
| 271 | + } |
| 272 | + $diff = array_diff_key($parameterAnnotationsPerParameter, $parametersByKey); |
| 273 | + if (count($diff) > 0) { |
| 274 | + foreach ($diff as $parameterName => $parameterAnnotations) { |
| 275 | + throw InvalidParameterException::parameterNotFound($parameterName, get_class($parameterAnnotations[0]), $method); |
| 276 | + } |
| 277 | + } |
| 278 | + |
| 279 | + // resolve parameter annotations targeted to parameter |
256 | 280 | foreach ($refParameters as $refParameter) {
|
257 | 281 | $attributes = $refParameter->getAttributes();
|
258 | 282 | $parameterAnnotationsPerParameter[$refParameter->getName()] = [...$parameterAnnotationsPerParameter[$refParameter->getName()] ??
|
|
0 commit comments