Skip to content

Commit 1134b52

Browse files
committed
[Config] Add support for class constants and enums in ReflectionClassResource
1 parent 152d788 commit 1134b52

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,35 @@ private function generateSignature(\ReflectionClass $class): iterable
127127
yield (int) $class->isFinal();
128128
yield (int) $class->isAbstract();
129129

130+
$enum = null;
131+
if ($class->isEnum()) {
132+
$enum = new \ReflectionEnum($class->name);
133+
}
134+
130135
if ($class->isTrait()) {
131136
yield print_r(class_uses($class->name), true);
137+
} elseif ($enum) {
138+
yield print_r(class_implements($class->name), true);
132139
} else {
133140
yield print_r(class_parents($class->name), true);
134141
yield print_r(class_implements($class->name), true);
135142
yield print_r($class->getConstants(), true);
136143
}
137144

145+
foreach ($class->getReflectionConstants() as $constant) {
146+
foreach ($constant->getAttributes() as $a) {
147+
$attributes[] = [$a->getName(), (string) $a];
148+
}
149+
yield print_r($attributes, true);
150+
$attributes = [];
151+
yield $constant->getName();
152+
if ($enum && $constant->isEnumCase() && $case = $enum->getCase($constant->name)) {
153+
if ($case instanceof ReflectionEnumBackedCase) {
154+
yield $case->getBackingValue();
155+
}
156+
}
157+
}
158+
138159
if (!$class->isInterface()) {
139160
$defaults = $class->getDefaultProperties();
140161

@@ -182,7 +203,7 @@ private function generateSignature(\ReflectionClass $class): iterable
182203
yield print_r($defaults, true);
183204
}
184205

185-
if ($class->isAbstract() || $class->isInterface() || $class->isTrait()) {
206+
if ($class->isAbstract() || $class->isInterface() || $class->isTrait() || $class->isEnum()) {
186207
return;
187208
}
188209

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,30 @@ public function testIgnoresObjectsInSignature()
216216
TestServiceWithStaticProperty::$initializedObject = new TestServiceWithStaticProperty();
217217
$this->assertTrue($res->isFresh(0));
218218
}
219+
220+
public function testEnum()
221+
{
222+
$res = new ReflectionClassResource($enum = new \ReflectionClass(SomeEnum::class));
223+
$r = new \ReflectionClass(ReflectionClassResource::class);
224+
$generateSignature = $r->getMethod('generateSignature')->getClosure($res);
225+
$actual = implode("\n", iterator_to_array($generateSignature($enum)));
226+
$this->assertStringContainsString('UnitEnum', $actual);
227+
$this->assertStringContainsString('TestAttribute', $actual);
228+
$this->assertStringContainsString('Beta', $actual);
229+
}
230+
231+
public function testBackedEnum()
232+
{
233+
$res = new ReflectionClassResource($enum = new \ReflectionClass(SomeBackedEnum::class));
234+
$r = new \ReflectionClass(ReflectionClassResource::class);
235+
$generateSignature = $r->getMethod('generateSignature')->getClosure($res);
236+
$actual = implode("\n", iterator_to_array($generateSignature($enum)));
237+
$this->assertStringContainsString('UnitEnum', $actual);
238+
$this->assertStringContainsString('BackedEnum', $actual);
239+
$this->assertStringContainsString('TestAttribute', $actual);
240+
$this->assertStringContainsString('Beta', $actual);
241+
$this->assertStringContainsString('beta', $actual);
242+
}
219243
}
220244

221245
interface DummyInterface
@@ -262,3 +286,23 @@ class TestServiceWithStaticProperty
262286
{
263287
public static object $initializedObject;
264288
}
289+
290+
enum SomeEnum
291+
{
292+
case Alpha;
293+
294+
#[TestAttribute]
295+
case Beta;
296+
}
297+
enum SomeBackedEnum: string
298+
{
299+
case Alpha = 'alpha';
300+
301+
#[TestAttribute]
302+
case Beta = 'beta';
303+
}
304+
305+
#[\Attribute(\Attribute::TARGET_PROPERTY)]
306+
class TestAttribute
307+
{
308+
}

0 commit comments

Comments
 (0)