Skip to content

Commit 1ce1a15

Browse files
bug symfony#61079 [Config] Fix support for attributes on class constants and enum cases (ruudk)
This PR was squashed before being merged into the 6.4 branch. Discussion ---------- [Config] Fix support for attributes on class constants and enum cases | Q | A | ------------- | --- | Branch? | 6.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | | License | MIT I'm using ReflectionClassResource in a project to track changes of files. I noticed that attributes on enum cases were not tracked properly. The cases were visible, because the enum cases are available as class constants. But the attributes were missing. This solves the problem. Not sure if we should see this as a bug or feature. I think it's a bug. Commits ------- 51b2c78 [Config] Fix support for attributes on class constants and enum cases
2 parents 152d788 + 51b2c78 commit 1ce1a15

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ private function generateSignature(\ReflectionClass $class): iterable
135135
yield print_r($class->getConstants(), true);
136136
}
137137

138+
foreach ($class->getReflectionConstants() as $constant) {
139+
foreach ($constant->getAttributes() as $a) {
140+
$attributes[] = [$a->getName(), (string) $a];
141+
}
142+
yield $constant->name.print_r($attributes, true);
143+
$attributes = [];
144+
}
145+
138146
if (!$class->isInterface()) {
139147
$defaults = $class->getDefaultProperties();
140148

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

Lines changed: 40 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,19 @@ 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+
298+
enum SomeBackedEnum: string
299+
{
300+
case Alpha = 'alpha';
301+
302+
#[TestAttribute]
303+
case Beta = 'beta';
304+
}

0 commit comments

Comments
 (0)