From 8b2bf927482c4fc9170ff4064289494b038639a4 Mon Sep 17 00:00:00 2001 From: Christian Daguerre Date: Tue, 1 Mar 2022 22:43:18 +0100 Subject: [PATCH 1/3] [attributes] add support for class constants --- src/Analysers/AttributeAnnotationFactory.php | 16 ++++++++++++++++ src/Attributes/Property.php | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Analysers/AttributeAnnotationFactory.php b/src/Analysers/AttributeAnnotationFactory.php index bd689a5e7..6964fb261 100644 --- a/src/Analysers/AttributeAnnotationFactory.php +++ b/src/Analysers/AttributeAnnotationFactory.php @@ -74,6 +74,22 @@ public function build(\Reflector $reflector, Context $context): array } } } + + if ($reflector instanceof \ReflectionClass) { + foreach ($reflector->getReflectionConstants() as $rc) { + foreach ($rc->getAttributes(Property::class) as $attribute) { + $instance = $attribute->newInstance(); + if (Generator::isDefault($instance->property)) { + $instance->property = $rc->getName(); + } + if (Generator::isDefault($instance->type)) { + $instance->type = 'const'; + $instance->const = [$rc->getValue()]; + } + $annotations[] = $instance; + } + } + } } finally { Generator::$context = null; } diff --git a/src/Attributes/Property.php b/src/Attributes/Property.php index 595b2bcc3..393240b85 100644 --- a/src/Attributes/Property.php +++ b/src/Attributes/Property.php @@ -8,7 +8,7 @@ use OpenApi\Generator; -#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY | \Attribute::TARGET_PARAMETER)] +#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY | \Attribute::TARGET_PARAMETER | \Attribute::TARGET_CLASS_CONSTANT)] class Property extends \OpenApi\Annotations\Property { /** From 874616f526ede0db13bf7d9b99221ca59045dae7 Mon Sep 17 00:00:00 2001 From: Christian Daguerre Date: Wed, 2 Mar 2022 07:44:48 +0100 Subject: [PATCH 2/3] value of const keyword should be a string --- src/Analysers/AttributeAnnotationFactory.php | 2 +- src/Annotations/Schema.php | 3 +++ src/Attributes/Schema.php | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Analysers/AttributeAnnotationFactory.php b/src/Analysers/AttributeAnnotationFactory.php index 6964fb261..2ff78fc1d 100644 --- a/src/Analysers/AttributeAnnotationFactory.php +++ b/src/Analysers/AttributeAnnotationFactory.php @@ -84,7 +84,7 @@ public function build(\Reflector $reflector, Context $context): array } if (Generator::isDefault($instance->type)) { $instance->type = 'const'; - $instance->const = [$rc->getValue()]; + $instance->const = $rc->getValue(); } $annotations[] = $instance; } diff --git a/src/Annotations/Schema.php b/src/Annotations/Schema.php index cdcdd058a..7cb91f012 100644 --- a/src/Annotations/Schema.php +++ b/src/Annotations/Schema.php @@ -336,6 +336,8 @@ class Schema extends AbstractAnnotation /** * http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.24. + * + * @var string */ public $const = Generator::UNDEFINED; @@ -362,6 +364,7 @@ class Schema extends AbstractAnnotation 'allOf' => '[' . Schema::class . ']', 'oneOf' => '[' . Schema::class . ']', 'anyOf' => '[' . Schema::class . ']', + 'const' => 'string', ]; /** diff --git a/src/Attributes/Schema.php b/src/Attributes/Schema.php index 14c07f01d..208bb68ec 100644 --- a/src/Attributes/Schema.php +++ b/src/Attributes/Schema.php @@ -40,6 +40,7 @@ public function __construct( ?int $minItems = null, ?bool $uniqueItems = null, ?string $pattern = null, + ?string $const = null, ?array $enum = null, ?Discriminator $discriminator = null, ?bool $readOnly = null, @@ -78,6 +79,7 @@ public function __construct( 'minItems' => $minItems ?? Generator::UNDEFINED, 'uniqueItems' => $uniqueItems ?? Generator::UNDEFINED, 'pattern' => $pattern ?? Generator::UNDEFINED, + 'const' => $const ?? Generator::UNDEFINED, 'enum' => $enum ?? Generator::UNDEFINED, 'readOnly' => $readOnly ?? Generator::UNDEFINED, 'writeOnly' => $writeOnly ?? Generator::UNDEFINED, From fcc66b2681ad39d387a2dae3984d813b8a739a25 Mon Sep 17 00:00:00 2001 From: Christian Daguerre Date: Wed, 2 Mar 2022 10:14:28 +0100 Subject: [PATCH 3/3] add processor to backport const keyword for open api < 3.1 --- src/Analysers/AttributeAnnotationFactory.php | 1 - src/Generator.php | 1 + src/Processors/BackportConstants.php | 36 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/Processors/BackportConstants.php diff --git a/src/Analysers/AttributeAnnotationFactory.php b/src/Analysers/AttributeAnnotationFactory.php index 2ff78fc1d..9937ce374 100644 --- a/src/Analysers/AttributeAnnotationFactory.php +++ b/src/Analysers/AttributeAnnotationFactory.php @@ -83,7 +83,6 @@ public function build(\Reflector $reflector, Context $context): array $instance->property = $rc->getName(); } if (Generator::isDefault($instance->type)) { - $instance->type = 'const'; $instance->const = $rc->getValue(); } $annotations[] = $instance; diff --git a/src/Generator.php b/src/Generator.php index ef0bca7d3..5b8eb2601 100644 --- a/src/Generator.php +++ b/src/Generator.php @@ -191,6 +191,7 @@ public function getProcessors(): array new Processors\MergeXmlContent(), new Processors\OperationId(), new Processors\CleanUnmerged(), + new Processors\BackportConstants(), ]; } diff --git a/src/Processors/BackportConstants.php b/src/Processors/BackportConstants.php new file mode 100644 index 000000000..71113b6cb --- /dev/null +++ b/src/Processors/BackportConstants.php @@ -0,0 +1,36 @@ +getAnnotationsOfType([AnnotationSchema::class, AttributeSchema::class], true); + + foreach ($schemas as $schema) { + if (Generator::isDefault($schema->const)) { + continue; + } + + if (version_compare($analysis->context->version, OpenApi::VERSION_3_1_0, '<')) { + $schema->enum = [$schema->const]; + $schema->const = Generator::UNDEFINED; + } + } + } +}