Skip to content

Commit fe49578

Browse files
ettorednnicolas-grekas
authored andcommitted
[TypeInfo] Prevent interfaces extending BackedEnum to be treated as BackedEnums
1 parent 22a97c4 commit fe49578

File tree

4 files changed

+21
-1
lines changed

4 files changed

+21
-1
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\TypeInfo\Tests\Fixtures;
13+
14+
interface DummyBackedEnumInterface extends \BackedEnum
15+
{
16+
}

src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableDummy.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ final class ReflectionExtractableDummy extends AbstractDummy
3737
public DummyBackedEnum $backedEnum;
3838
public ?DummyBackedEnum $nullableBackedEnum;
3939

40+
public DummyBackedEnumInterface $backedEnumInterface;
41+
4042
public int|string $union;
4143
public \Traversable&\Stringable $intersection;
4244

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Symfony\Component\TypeInfo\Tests\Fixtures\AbstractDummy;
1818
use Symfony\Component\TypeInfo\Tests\Fixtures\Dummy;
1919
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyBackedEnum;
20+
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyBackedEnumInterface;
2021
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyEnum;
2122
use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummy;
2223
use Symfony\Component\TypeInfo\Type;
@@ -67,6 +68,7 @@ public static function resolveDataProvider(): iterable
6768
yield [Type::nullable(Type::enum(DummyEnum::class)), $reflection->getProperty('nullableEnum')->getType()];
6869
yield [Type::enum(DummyBackedEnum::class), $reflection->getProperty('backedEnum')->getType()];
6970
yield [Type::nullable(Type::enum(DummyBackedEnum::class)), $reflection->getProperty('nullableBackedEnum')->getType()];
71+
yield [Type::object(DummyBackedEnumInterface::class), $reflection->getProperty('backedEnumInterface')->getType()];
7072
yield [Type::union(Type::int(), Type::string()), $reflection->getProperty('union')->getType()];
7173
yield [Type::intersection(Type::object(\Traversable::class), Type::object(\Stringable::class)), $reflection->getProperty('intersection')->getType()];
7274
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public function resolve(mixed $subject, ?TypeContext $typeContext = null): Type
7676
default => $identifier,
7777
};
7878

79-
if (is_subclass_of($className, \UnitEnum::class)) {
79+
if (is_subclass_of($className, \UnitEnum::class) && !interface_exists($className)) {
8080
$type = Type::enum($className);
8181
} else {
8282
$type = Type::object($className);

0 commit comments

Comments
 (0)