public function __invoke(Analysis $analysis)
{
$refs = [];
/** @var Definition $definition */
foreach ($analysis->swagger->definitions as $definition) {
if ($definition->definition) {
$refs[strtolower($definition->_context->fullyQualifiedName($definition->_context->class))] = '#/definitions/' . $definition->definition;
}
}
$allProperties = $analysis->getAnnotationsOfType('\\Swagger\\Annotations\\Property');
/** @var \Swagger\Annotations\Property $property */
foreach ($allProperties as $property) {
$context = $property->_context;
// Use the property names for @SWG\Property()
if ($property->property === null) {
$property->property = $context->property;
}
if (preg_match('/@var\\s+(?<type>[^\\s]+)([ \\t])?(?<description>.+)?$/im', $context->comment, $varMatches)) {
if ($property->description === null && isset($varMatches['description'])) {
$property->description = trim($varMatches['description']);
}
if ($property->type === null) {
preg_match('/^([^\\[]+)(.*$)/', trim($varMatches['type']), $typeMatches);
$type = $typeMatches[1];
if (array_key_exists(strtolower($type), static::$types)) {
$type = static::$types[strtolower($type)];
if (is_array($type)) {
if ($property->format === null) {
$property->format = $type[1];
}
$type = $type[0];
}
$property->type = $type;
} elseif ($property->ref === null && $typeMatches[2] === '') {
$tmpKey = strtolower($context->fullyQualifiedName($type));
$property->ref = array_key_exists($tmpKey, $refs) ? $refs[$tmpKey] : null;
}
if ($typeMatches[2] === '[]') {
if ($property->items === null) {
$property->items = new Items(['type' => $property->type, '_context' => new Context(['generated' => true], $context)]);
if ($property->items->type === null) {
$tmpKey = strtolower($context->fullyQualifiedName($type));
$property->items->ref = array_key_exists($tmpKey, $refs) ? $refs[$tmpKey] : null;
}
}
$property->type = 'array';
}
}
}
if ($property->description === null) {
$property->description = $context->phpdocContent();
}
}
}