43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			PHP
		
	
	
<?php declare(strict_types=1);
 | 
						|
 | 
						|
/**
 | 
						|
 * @license Apache 2.0
 | 
						|
 */
 | 
						|
 | 
						|
namespace OpenApi\Processors;
 | 
						|
 | 
						|
use OpenApi\Analysis;
 | 
						|
use OpenApi\Annotations\Components;
 | 
						|
use OpenApi\Annotations\Schema;
 | 
						|
use OpenApi\Generator;
 | 
						|
use OpenApi\Util;
 | 
						|
 | 
						|
class InheritTraits
 | 
						|
{
 | 
						|
    public function __invoke(Analysis $analysis)
 | 
						|
    {
 | 
						|
        /** @var Schema[] $schemas */
 | 
						|
        $schemas = $analysis->getAnnotationsOfType(Schema::class);
 | 
						|
 | 
						|
        foreach ($schemas as $schema) {
 | 
						|
            if ($schema->_context->is('class') || $schema->_context->is('trait')) {
 | 
						|
                $source = $schema->_context->class ?: $schema->_context->trait;
 | 
						|
                $traits = $analysis->getTraitsOfClass($schema->_context->fullyQualifiedName($source), true);
 | 
						|
                foreach ($traits as $trait) {
 | 
						|
                    $traitSchema = $analysis->getSchemaForSource($trait['context']->fullyQualifiedName($trait['trait']));
 | 
						|
                    if ($traitSchema) {
 | 
						|
                        $refPath = $traitSchema->schema !== Generator::UNDEFINED ? $traitSchema->schema : $trait['trait'];
 | 
						|
                        if ($schema->allOf === Generator::UNDEFINED) {
 | 
						|
                            $schema->allOf = [];
 | 
						|
                        }
 | 
						|
                        $schema->allOf[] = new Schema([
 | 
						|
                            '_context' => $trait['context']->_context,
 | 
						|
                            'ref' => Components::SCHEMA_REF . Util::refEncode($refPath),
 | 
						|
                        ]);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |