From 51b2c784a2966baea287e328ebf8eb3b2d71a871 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Wed, 16 Jul 2025 14:21:36 +0200 Subject: [PATCH] [Config] Fix support for attributes on class constants and enum cases --- .../Resource/ReflectionClassResource.php | 8 ++++ .../Resource/ReflectionClassResourceTest.php | 40 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/Symfony/Component/Config/Resource/ReflectionClassResource.php b/src/Symfony/Component/Config/Resource/ReflectionClassResource.php index 3ee0a805f8b4d..cfd96135d124b 100644 --- a/src/Symfony/Component/Config/Resource/ReflectionClassResource.php +++ b/src/Symfony/Component/Config/Resource/ReflectionClassResource.php @@ -135,6 +135,14 @@ private function generateSignature(\ReflectionClass $class): iterable yield print_r($class->getConstants(), true); } + foreach ($class->getReflectionConstants() as $constant) { + foreach ($constant->getAttributes() as $a) { + $attributes[] = [$a->getName(), (string) $a]; + } + yield $constant->name.print_r($attributes, true); + $attributes = []; + } + if (!$class->isInterface()) { $defaults = $class->getDefaultProperties(); diff --git a/src/Symfony/Component/Config/Tests/Resource/ReflectionClassResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/ReflectionClassResourceTest.php index 7968c96171be6..a803535cc0d2c 100644 --- a/src/Symfony/Component/Config/Tests/Resource/ReflectionClassResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/ReflectionClassResourceTest.php @@ -216,6 +216,30 @@ public function testIgnoresObjectsInSignature() TestServiceWithStaticProperty::$initializedObject = new TestServiceWithStaticProperty(); $this->assertTrue($res->isFresh(0)); } + + public function testEnum() + { + $res = new ReflectionClassResource($enum = new \ReflectionClass(SomeEnum::class)); + $r = new \ReflectionClass(ReflectionClassResource::class); + $generateSignature = $r->getMethod('generateSignature')->getClosure($res); + $actual = implode("\n", iterator_to_array($generateSignature($enum))); + $this->assertStringContainsString('UnitEnum', $actual); + $this->assertStringContainsString('TestAttribute', $actual); + $this->assertStringContainsString('Beta', $actual); + } + + public function testBackedEnum() + { + $res = new ReflectionClassResource($enum = new \ReflectionClass(SomeBackedEnum::class)); + $r = new \ReflectionClass(ReflectionClassResource::class); + $generateSignature = $r->getMethod('generateSignature')->getClosure($res); + $actual = implode("\n", iterator_to_array($generateSignature($enum))); + $this->assertStringContainsString('UnitEnum', $actual); + $this->assertStringContainsString('BackedEnum', $actual); + $this->assertStringContainsString('TestAttribute', $actual); + $this->assertStringContainsString('Beta', $actual); + $this->assertStringContainsString('beta', $actual); + } } interface DummyInterface @@ -262,3 +286,19 @@ class TestServiceWithStaticProperty { public static object $initializedObject; } + +enum SomeEnum +{ + case Alpha; + + #[TestAttribute] + case Beta; +} + +enum SomeBackedEnum: string +{ + case Alpha = 'alpha'; + + #[TestAttribute] + case Beta = 'beta'; +}