Skip to content

Commit 36bb990

Browse files
committed
bug symfony#59066 Fix resolve enum in string type resolver (DavidBadura)
This PR was squashed before being merged into the 7.1 branch. Discussion ---------- Fix resolve enum in string type resolver | Q | A | ------------- | --- | Branch? | 7.1 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | ~ | License | MIT Enum types are not handled correctly in the `StringTypeResolver`. They are always wrongly classified as `object`. ```php enum Status: string { case Pending = 'pending'; case Closed = 'closed'; } class Dto { /** * `@var` list<Status> */ public array $statusList; } $reflection = new ReflectionProperty(Dto::class, 'statusList'); $type TypeResolver::create()->resolve($reflection); $type instanceof BackedEnumType; // false -> should be true ``` Commits ------- f4c4449 Fix resolve enum in string type resolver
2 parents 03c53f3 + f4c4449 commit 36bb990

File tree

3 files changed

+9
-12
lines changed

3 files changed

+9
-12
lines changed

src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
use Symfony\Component\TypeInfo\Exception\UnsupportedException;
1717
use Symfony\Component\TypeInfo\Tests\Fixtures\AbstractDummy;
1818
use Symfony\Component\TypeInfo\Tests\Fixtures\Dummy;
19+
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyBackedEnum;
1920
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyCollection;
21+
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyEnum;
2022
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithTemplates;
2123
use Symfony\Component\TypeInfo\Type;
2224
use Symfony\Component\TypeInfo\TypeContext\TypeContext;
@@ -138,6 +140,8 @@ public static function resolveDataProvider(): iterable
138140
yield [Type::object(Dummy::class), 'static', $typeContextFactory->createFromClassName(Dummy::class, AbstractDummy::class)];
139141
yield [Type::object(AbstractDummy::class), 'parent', $typeContextFactory->createFromClassName(Dummy::class)];
140142
yield [Type::object(Dummy::class), 'Dummy', $typeContextFactory->createFromClassName(Dummy::class)];
143+
yield [Type::enum(DummyEnum::class), 'DummyEnum', $typeContextFactory->createFromClassName(DummyEnum::class)];
144+
yield [Type::enum(DummyBackedEnum::class), 'DummyBackedEnum', $typeContextFactory->createFromClassName(DummyBackedEnum::class)];
141145
yield [Type::template('T', Type::union(Type::int(), Type::string())), 'T', $typeContextFactory->createFromClassName(DummyWithTemplates::class)];
142146
yield [Type::template('V'), 'V', $typeContextFactory->createFromReflection(new \ReflectionMethod(DummyWithTemplates::class, 'getPrice'))];
143147

src/Symfony/Component/TypeInfo/TypeResolver/ReflectionTypeResolver.php

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@
2727
*/
2828
final class ReflectionTypeResolver implements TypeResolverInterface
2929
{
30-
/**
31-
* @var array<class-string, \ReflectionEnum>
32-
*/
33-
private static array $reflectionEnumCache = [];
34-
3530
public function resolve(mixed $subject, ?TypeContext $typeContext = null): Type
3631
{
3732
if ($subject instanceof \ReflectionUnionType) {
@@ -83,11 +78,7 @@ public function resolve(mixed $subject, ?TypeContext $typeContext = null): Type
8378
default => $identifier,
8479
};
8580

86-
if (is_subclass_of($className, \BackedEnum::class)) {
87-
$reflectionEnum = (self::$reflectionEnumCache[$className] ??= new \ReflectionEnum($className));
88-
$backingType = $this->resolve($reflectionEnum->getBackingType(), $typeContext);
89-
$type = Type::enum($className, $backingType);
90-
} elseif (is_subclass_of($className, \UnitEnum::class)) {
81+
if (is_subclass_of($className, \UnitEnum::class)) {
9182
$type = Type::enum($className);
9283
} else {
9384
$type = Type::object($className);

src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,16 @@ private function resolveCustomIdentifier(string $identifier, ?TypeContext $typeC
243243
try {
244244
new \ReflectionClass($className);
245245
self::$classExistCache[$className] = true;
246-
247-
return Type::object($className);
248246
} catch (\Throwable) {
249247
}
250248
}
251249
}
252250

253251
if (self::$classExistCache[$className]) {
252+
if (is_subclass_of($className, \UnitEnum::class)) {
253+
return Type::enum($className);
254+
}
255+
254256
return Type::object($className);
255257
}
256258

0 commit comments

Comments
 (0)