Skip to content

Commit b3f6c68

Browse files
committed
[Config] Add support for enums in ReflectionClassResource
1 parent 51ec885 commit b3f6c68

File tree

3 files changed

+68
-2
lines changed

3 files changed

+68
-2
lines changed

src/Symfony/Component/Config/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
7.4
5+
---
6+
7+
* Add support for enums in ReflectionClassResource
8+
49
7.3
510
---
611

src/Symfony/Component/Config/Resource/ReflectionClassResource.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,15 @@ private function generateSignature(\ReflectionClass $class): iterable
128128

129129
if ($class->isTrait()) {
130130
yield print_r(class_uses($class->name), true);
131+
} elseif ($class->isEnum()) {
132+
yield print_r(class_implements($class->name), true);
131133
} else {
132134
yield print_r(class_parents($class->name), true);
133135
yield print_r(class_implements($class->name), true);
134136
yield print_r($class->getConstants(), true);
135137
}
136138

137-
if (!$class->isInterface()) {
139+
if (!$class->isInterface() && !$class->isEnum()) {
138140
$defaults = $class->getDefaultProperties();
139141

140142
foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED) as $p) {
@@ -153,6 +155,21 @@ private function generateSignature(\ReflectionClass $class): iterable
153155
}
154156
}
155157

158+
if ($class->isEnum()) {
159+
$enum = new \ReflectionEnum($class->name);
160+
foreach ($enum->getCases() as $case) {
161+
foreach ($case->getAttributes() as $a) {
162+
$attributes[] = [$a->getName(), (string) $a];
163+
}
164+
yield print_r($attributes, true);
165+
$attributes = [];
166+
yield $case->name;
167+
if ($case instanceof \ReflectionEnumBackedCase) {
168+
yield $case->getBackingValue();
169+
}
170+
}
171+
}
172+
156173
foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $m) {
157174
foreach ($this->excludedVendors as $vendor) {
158175
$file = $m->getFileName();
@@ -188,7 +205,7 @@ private function generateSignature(\ReflectionClass $class): iterable
188205
yield print_r($defaults, true);
189206
}
190207

191-
if ($class->isAbstract() || $class->isInterface() || $class->isTrait()) {
208+
if ($class->isAbstract() || $class->isInterface() || $class->isTrait() || $class->isEnum()) {
192209
return;
193210
}
194211

src/Symfony/Component/Config/Tests/Resource/ReflectionClassResourceTest.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,30 @@ public function testIgnoresObjectsInSignature()
195195
TestServiceWithStaticProperty::$initializedObject = new TestServiceWithStaticProperty();
196196
$this->assertTrue($res->isFresh(0));
197197
}
198+
199+
public function testEnum()
200+
{
201+
$res = new ReflectionClassResource($enum = new \ReflectionClass(SomeEnum::class));
202+
$r = new \ReflectionClass(ReflectionClassResource::class);
203+
$generateSignature = $r->getMethod('generateSignature')->getClosure($res);
204+
$actual = implode("\n", iterator_to_array($generateSignature($enum)));
205+
$this->assertStringContainsString('UnitEnum', $actual);
206+
$this->assertStringContainsString('TestAttribute', $actual);
207+
$this->assertStringContainsString('Beta', $actual);
208+
}
209+
210+
public function testBackedEnum()
211+
{
212+
$res = new ReflectionClassResource($enum = new \ReflectionClass(SomeBackedEnum::class));
213+
$r = new \ReflectionClass(ReflectionClassResource::class);
214+
$generateSignature = $r->getMethod('generateSignature')->getClosure($res);
215+
$actual = implode("\n", iterator_to_array($generateSignature($enum)));
216+
$this->assertStringContainsString('UnitEnum', $actual);
217+
$this->assertStringContainsString('BackedEnum', $actual);
218+
$this->assertStringContainsString('TestAttribute', $actual);
219+
$this->assertStringContainsString('Beta', $actual);
220+
$this->assertStringContainsString('beta', $actual);
221+
}
198222
}
199223

200224
interface DummyInterface
@@ -225,3 +249,23 @@ class TestServiceWithStaticProperty
225249
{
226250
public static object $initializedObject;
227251
}
252+
253+
enum SomeEnum
254+
{
255+
case Alpha;
256+
257+
#[TestAttribute]
258+
case Beta;
259+
}
260+
enum SomeBackedEnum: string
261+
{
262+
case Alpha = 'alpha';
263+
264+
#[TestAttribute]
265+
case Beta = 'beta';
266+
}
267+
268+
#[\Attribute(\Attribute::TARGET_PROPERTY)]
269+
class TestAttribute
270+
{
271+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy