Skip to content

Commit fa0bfaf

Browse files
committed
no declarative code refacto
1 parent 79524b5 commit fa0bfaf

File tree

1 file changed

+43
-16
lines changed

1 file changed

+43
-16
lines changed

src/AttributeGenerator/ApiPlatformCoreAttributeGenerator.php

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -148,28 +148,55 @@ private static function extractParameters(string $type, array $values): array
148148
],
149149
[]
150150
);
151+
if (isset(self::$parameterTypes[$type])) {
152+
$types = self::$parameterTypes[$type];
153+
} else {
154+
$types = static::PRAMETER_TYPE_HINTS[$type] ?? [];
155+
$parameterRefls = (new \ReflectionClass($type))
156+
->getConstructor()
157+
?->getParameters() ?? [];
158+
foreach ($parameterRefls as $refl) {
159+
$paramName = $refl->getName();
160+
if (\array_key_exists($paramName, $types)) {
161+
continue;
162+
}
163+
$paramType = $refl->getType();
164+
if ($paramType instanceof \ReflectionNamedType && !$paramType->isBuiltin()) {
165+
$types[$paramName] = $paramType->getName();
166+
} else {
167+
$types[$paramName] = null;
168+
}
169+
}
170+
self::$parameterTypes[$type] = $types;
171+
}
151172

152173
$parameters = array_intersect_key($values, $types);
153174
foreach ($parameters as $name => $parameter) {
154175
$type = $types[$name];
155-
if (null !== $type && \is_array($parameter)) {
156-
$isArrayType = str_ends_with($type, '[]');
157-
$type = $isArrayType ? substr($type, 0, -2) : $type;
158-
$shortName = (new \ReflectionClass($type))->getShortName();
159-
$parameters[$name] = $isArrayType
160-
? array_map(
161-
static fn (array $values): Literal => Literal::new(
162-
$shortName,
163-
self::extractParameters($type, $values)
164-
),
165-
$parameter
166-
)
167-
: Literal::new(
176+
if (null === $type || !\is_array($parameter)) {
177+
continue;
178+
}
179+
$isArrayType = str_ends_with($type, '[]');
180+
/**
181+
* @var class-string
182+
*/
183+
$type = $isArrayType ? substr($type, 0, -2) : $type;
184+
$shortName = (new \ReflectionClass($type))->getShortName();
185+
if ($isArrayType) {
186+
$parameters[$name] = [];
187+
foreach ($parameter as $key => $values) {
188+
$parameters[$name][$key] = Literal::new(
168189
$shortName,
169-
\ArrayObject::class === $type
170-
? [$parameter]
171-
: self::extractParameters($type, $parameter)
190+
self::extractParameters($type, $values)
172191
);
192+
}
193+
} else {
194+
$parameters[$name] = Literal::new(
195+
$shortName,
196+
\ArrayObject::class === $type
197+
? [$parameter]
198+
: self::extractParameters($type, $parameter)
199+
);
173200
}
174201
}
175202

0 commit comments

Comments
 (0)