Skip to content

Commit 1a2ff0e

Browse files
authored
Merge pull request #1389 from kukulich/fix
Fixed ReflectionSourceStubber for enums
2 parents 9209122 + 14172de commit 1a2ff0e

File tree

3 files changed

+22
-16
lines changed

3 files changed

+22
-16
lines changed

src/SourceLocator/SourceStubber/ReflectionSourceStubber.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Roave\BetterReflection\SourceLocator\SourceStubber;
66

7+
use BackedEnum;
78
use LogicException;
89
use PhpParser\Builder\Class_;
910
use PhpParser\Builder\ClassConst;
@@ -39,6 +40,7 @@
3940
use ReflectionUnionType as CoreReflectionUnionType;
4041
use Roave\BetterReflection\Reflection\Annotation\AnnotationHelper;
4142
use Roave\BetterReflection\Util\ClassExistenceChecker;
43+
use UnitEnum;
4244

4345
use function array_diff;
4446
use function array_key_exists;
@@ -285,6 +287,10 @@ private function addExtendsAndImplements(Class_|Interface_|Enum_ $classNode, Cor
285287
}
286288

287289
foreach ($interfaces as $interfaceName) {
290+
if ($classReflection->isEnum() && in_array($interfaceName, [BackedEnum::class, UnitEnum::class], true)) {
291+
continue;
292+
}
293+
288294
$interfaceNode = new FullyQualified($interfaceName);
289295

290296
if ($classNode instanceof Interface_) {
@@ -479,15 +485,27 @@ private function isMethodDeclaredInClass(CoreReflectionMethod $methodReflection,
479485
return false;
480486
}
481487

488+
$methodName = $methodReflection->getName();
489+
482490
/** @var array<string, string> $traitAliases */
483491
$traitAliases = $classReflection->getTraitAliases();
484492

485-
if (array_key_exists($methodReflection->getName(), $traitAliases)) {
493+
if (array_key_exists($methodName, $traitAliases)) {
486494
return false;
487495
}
488496

489497
foreach ($classReflection->getTraits() as $trait) {
490-
if ($trait->hasMethod($methodReflection->getName())) {
498+
if ($trait->hasMethod($methodName)) {
499+
return false;
500+
}
501+
}
502+
503+
if ($classReflection instanceof CoreReflectionEnum) {
504+
if ($methodName === 'cases') {
505+
return false;
506+
}
507+
508+
if ($classReflection->isBacked() && in_array($methodName, ['from', 'tryFrom'], true)) {
491509
return false;
492510
}
493511
}

test/unit/Fixture/EnumBackedForSourceStubberExpected.php

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,8 @@
55
/**
66
* Class comment
77
*/
8-
enum EnumBackedForSourceStubber : int implements \BackedEnum
8+
enum EnumBackedForSourceStubber : int
99
{
1010
case ONE = 1;
1111
case TWO = 2;
12-
public static function cases() : array
13-
{
14-
}
15-
public static function from(string|int $value) : static
16-
{
17-
}
18-
public static function tryFrom(string|int $value) : ?static
19-
{
20-
}
2112
}

test/unit/Fixture/EnumPureForSourceStubberExpected.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/**
66
* Class comment
77
*/
8-
enum EnumPureForSourceStubber implements \Roave\BetterReflectionTest\Fixture\ImplementedInterfaceForEnumSourceStubber, \UnitEnum
8+
enum EnumPureForSourceStubber implements \Roave\BetterReflectionTest\Fixture\ImplementedInterfaceForEnumSourceStubber
99
{
1010
use \Roave\BetterReflectionTest\Fixture\UsedTraitForEnumSourceStubber;
1111
use \Roave\BetterReflectionTest\Fixture\UsedTraitToAliasForEnumSourceStubber {
@@ -22,7 +22,4 @@ enum EnumPureForSourceStubber implements \Roave\BetterReflectionTest\Fixture\Imp
2222
public function methodFromInterface()
2323
{
2424
}
25-
public static function cases() : array
26-
{
27-
}
2825
}

0 commit comments

Comments
 (0)