Skip to content

Commit 151c7ee

Browse files
committed
Simplified case detection
1 parent 36aa911 commit 151c7ee

File tree

4 files changed

+32
-44
lines changed

4 files changed

+32
-44
lines changed

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
},
2323
"require-dev": {
2424
"phpstan/phpstan": "^1.3.0",
25-
"phpunit/phpunit": "^7.5.20 | ^8.5.8 | ^9.3.8",
26-
"vimeo/psalm": "^4.16.1"
25+
"phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11",
26+
"vimeo/psalm": "^4.17.0"
2727
},
2828
"autoload": {
2929
"psr-4": {

src/Mabe/Enum/Cl/EmulatedBackedEnumTrait.php

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -205,39 +205,34 @@ private static function init(string $enumClass): void
205205
"Enum class \"{$enumClass}\" needs to be final"
206206
);
207207

208-
// Case constants must be private
209208
$caseConstants = [];
210-
if (\PHP_VERSION_ID >= 80000) {
211-
/** @phpstan-ignore-next-line */
212-
$caseConstants = $reflection->getConstants(ReflectionClassConstant::IS_PRIVATE);
213-
} else {
214-
foreach ($reflection->getReflectionConstants() as $reflConstant) {
215-
if ($reflConstant->isPrivate()) {
216-
$caseConstants[$reflConstant->getName()] = $reflConstant->getValue();
217-
}
209+
$cases = [];
210+
foreach ($reflection->getReflectionConstants() as $reflConstant) {
211+
// Case constants must be private
212+
if ($reflConstant->isPrivate()) {
213+
$name = $reflConstant->getName();
214+
$value = $reflConstant->getValue();
215+
216+
assert(
217+
/** @phpstan-ignore-next-line */
218+
(\is_subclass_of($enumClass, EmulatedIntEnum::class) && \is_int($value))
219+
|| (\is_subclass_of($enumClass, EmulatedStringEnum::class) && \is_string($value)), /** @phpstan-ignore-line */
220+
"Enum case constant \"{$enumClass}::{$name}\" does not match enum backing type"
221+
);
222+
223+
assert(
224+
\count(\array_keys($caseConstants, $value, true)) === 0,
225+
"Enum case value for {$enumClass}::{$name} is ambiguous"
226+
);
227+
228+
/** @var static $case */
229+
$case = new $enumClass($name, $value);
230+
231+
$cases[$name] = $case;
232+
$caseConstants[$name] = $value;
218233
}
219234
}
220235

221-
$cases = [];
222-
foreach ($caseConstants as $name => $value) {
223-
assert(
224-
/** @phpstan-ignore-next-line */
225-
(\is_subclass_of($enumClass, EmulatedIntEnum::class) && \is_int($value))
226-
|| (\is_subclass_of($enumClass, EmulatedStringEnum::class) && \is_string($value)), /** @phpstan-ignore-line */
227-
"Enum case constant \"{$enumClass}::{$name}\" does not match enum backing type"
228-
);
229-
230-
assert(
231-
\count(\array_keys($caseConstants, $value, true)) === 1,
232-
"Enum case value for {$enumClass}::{$name} is ambiguous"
233-
);
234-
235-
/** @var static $case */
236-
$case = new $enumClass($name, $value);
237-
$cases[$name] = $case;
238-
}
239-
240-
/** @var array<string, string|int> $caseConstants */
241236
self::$cases[$enumClass] = $cases;
242237
self::$caseConstants[$enumClass] = $caseConstants;
243238
}

src/Mabe/Enum/Cl/EmulatedUnitEnum.php

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,20 +130,13 @@ private static function init(string $enumClass): void
130130
"Enum class \"{$enumClass}\" needs to be final"
131131
);
132132

133-
// Case constants must be private
134133
$cases = [];
135-
if (\PHP_VERSION_ID >= 80000) {
136-
/** @phpstan-ignore-next-line */
137-
foreach ($reflection->getConstants(ReflectionClassConstant::IS_PRIVATE) as $name => $_) {
134+
foreach ($reflection->getReflectionConstants() as $reflConstant) {
135+
// Case constants must be private
136+
if ($reflConstant->isPrivate()) {
137+
$name = $reflConstant->getName();
138138
$cases[$name] = new $enumClass($name);
139139
}
140-
} else {
141-
foreach ($reflection->getReflectionConstants() as $reflConstant) {
142-
if ($reflConstant->isPrivate()) {
143-
$name = $reflConstant->getName();
144-
$cases[$name] = new $enumClass($name);
145-
}
146-
}
147140
}
148141

149142
self::$cases[$enumClass] = $cases;

tests/AmbiguousBackingValuesEnumEmulatedTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ public function setUp(): void
1818
public function testAmbiguousBackingValuesForIntBackedEnum(): void
1919
{
2020
$this->expectException('AssertionError');
21-
$this->expectExceptionMessage('Enum case value for AmbiguousIntValuesEnumEmulated::TEST1 is ambiguous');
21+
$this->expectExceptionMessage('Enum case value for AmbiguousIntValuesEnumEmulated::TEST2 is ambiguous');
2222
$cases = AmbiguousIntValuesEnumEmulated::cases();
2323
}
2424

2525
public function testAmbiguousBackingValuesEnumEmulatedForStringBackedEnum(): void
2626
{
2727
$this->expectException('AssertionError');
28-
$this->expectExceptionMessage('Enum case value for AmbiguousStringValuesEnumEmulated::TEST1 is ambiguous');
28+
$this->expectExceptionMessage('Enum case value for AmbiguousStringValuesEnumEmulated::TEST2 is ambiguous');
2929
$cases = AmbiguousStringValuesEnumEmulated::cases();
3030
}
3131
}

0 commit comments

Comments
 (0)