Skip to content

Commit 31f1e40

Browse files
gnutixnicolas-grekas
authored andcommitted
[TypeInfo] Fix StringTypeResolver calling Type::enum() on interfaces extending BackedEnum
1 parent 595fd2a commit 31f1e40

File tree

2 files changed

+4
-2
lines changed

2 files changed

+4
-2
lines changed

Tests/TypeResolver/StringTypeResolverTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\TypeInfo\Tests\Fixtures\AbstractDummy;
1919
use Symfony\Component\TypeInfo\Tests\Fixtures\Dummy;
2020
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyBackedEnum;
21+
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyBackedEnumInterface;
2122
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyCollection;
2223
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyEnum;
2324
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithConstants;
@@ -183,6 +184,7 @@ public static function resolveDataProvider(): iterable
183184
yield [Type::object(Dummy::class), 'Dummy', $typeContextFactory->createFromClassName(Dummy::class)];
184185
yield [Type::enum(DummyEnum::class), 'DummyEnum', $typeContextFactory->createFromClassName(DummyEnum::class)];
185186
yield [Type::enum(DummyBackedEnum::class), 'DummyBackedEnum', $typeContextFactory->createFromClassName(DummyBackedEnum::class)];
187+
yield [Type::object(DummyBackedEnumInterface::class), 'DummyBackedEnumInterface', $typeContextFactory->createFromClassName(DummyBackedEnumInterface::class)];
186188
yield [Type::template('T', Type::union(Type::int(), Type::string())), 'T', $typeContextFactory->createFromClassName(DummyWithTemplates::class)];
187189
yield [Type::template('V'), 'V', $typeContextFactory->createFromReflection(new \ReflectionMethod(DummyWithTemplates::class, 'getPrice'))];
188190

TypeResolver/StringTypeResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public function resolve(mixed $subject, ?TypeContext $typeContext = null): Type
100100

101101
private function getTypeFromNode(TypeNode $node, ?TypeContext $typeContext): Type
102102
{
103-
$typeIsCollectionObject = fn (Type $type): bool => $type->isIdentifiedBy(\Traversable::class) || $type->isIdentifiedBy(\ArrayAccess::class);
103+
$typeIsCollectionObject = static fn (Type $type): bool => $type->isIdentifiedBy(\Traversable::class) || $type->isIdentifiedBy(\ArrayAccess::class);
104104

105105
if ($node instanceof CallableTypeNode) {
106106
return Type::callable();
@@ -344,7 +344,7 @@ private function resolveCustomIdentifier(string $identifier, ?TypeContext $typeC
344344
}
345345

346346
if (self::$classExistCache[$className]) {
347-
if (is_subclass_of($className, \UnitEnum::class)) {
347+
if (is_subclass_of($className, \UnitEnum::class) && !interface_exists($className)) {
348348
return Type::enum($className);
349349
}
350350

0 commit comments

Comments
 (0)