Skip to content

Commit

Permalink
Enums will no longer crash the playground
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Jan 18, 2022
1 parent c001f66 commit 121e021
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 23 deletions.
21 changes: 21 additions & 0 deletions src/Reflection/ClassReflection.php
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,27 @@ public function hasEnumCase(string $name): bool
return $this->reflection->hasCase($name);
}

/**
* @return array<string, EnumCaseReflection>
*/
public function getEnumCases(): array
{
if (!$this->reflection instanceof ReflectionEnum) {
throw new ShouldNotHappenException();
}

$cases = [];
foreach ($this->reflection->getCases() as $case) {
$valueType = null;
if ($case instanceof ReflectionEnumBackedCase) {
$valueType = ConstantTypeHelper::getTypeFromValue($case->getBackingValue());
}
$cases[$case->getName()] = new EnumCaseReflection($this, $case->getName(), $valueType);
}

return $cases;
}

public function getEnumCase(string $name): EnumCaseReflection
{
if (!$this->hasEnumCase($name)) {
Expand Down
12 changes: 2 additions & 10 deletions src/Reflection/Php/PhpClassReflectionExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -158,11 +158,7 @@ private function createProperty(
|| ($declaringClassReflection->isBackedEnum() && $propertyName === 'value')
) {
$types = [];
foreach (array_keys($classReflection->getNativeReflection()->getConstants()) as $name) {
if (!$classReflection->hasEnumCase($name)) {
continue;
}

foreach (array_keys($classReflection->getEnumCases()) as $name) {
if ($propertyName === 'name') {
$types[] = new ConstantStringType($name);
continue;
Expand Down Expand Up @@ -450,11 +446,7 @@ private function createMethod(
&& strtolower($methodReflection->getName()) === 'cases'
) {
$arrayBuilder = ConstantArrayTypeBuilder::createEmpty();
foreach (array_keys($classReflection->getNativeReflection()->getConstants()) as $name) {
if (!$classReflection->hasEnumCase($name)) {
continue;
}

foreach (array_keys($classReflection->getEnumCases()) as $name) {
$arrayBuilder->setOffsetValueType(null, new EnumCaseObjectType($classReflection->getName(), $name));
}

Expand Down
9 changes: 2 additions & 7 deletions src/Type/ObjectType.php
Original file line number Diff line number Diff line change
Expand Up @@ -979,14 +979,9 @@ public function changeSubtractedType(?Type $subtractedType): Type
{
$classReflection = $this->getClassReflection();
if ($classReflection !== null && $classReflection->isEnum() && $subtractedType !== null) {
$constants = $classReflection->getNativeReflection()->getConstants();
$cases = [];
foreach (array_keys($constants) as $constantName) {
if (!$classReflection->hasEnumCase($constantName)) {
continue;
}

$cases[$constantName] = new EnumCaseObjectType($classReflection->getName(), $constantName);
foreach (array_keys($classReflection->getEnumCases()) as $name) {
$cases[$name] = new EnumCaseObjectType($classReflection->getName(), $name);
}

foreach (TypeUtils::flattenTypes($subtractedType) as $subType) {
Expand Down
7 changes: 1 addition & 6 deletions src/Type/StaticType.php
Original file line number Diff line number Diff line change
Expand Up @@ -408,13 +408,8 @@ public function changeSubtractedType(?Type $subtractedType): Type
{
$classReflection = $this->getClassReflection();
if ($classReflection !== null && $classReflection->isEnum() && $subtractedType !== null) {
$constants = $classReflection->getNativeReflection()->getConstants();
$cases = [];
foreach (array_keys($constants) as $constantName) {
if (!$classReflection->hasEnumCase($constantName)) {
continue;
}

foreach (array_keys($classReflection->getEnumCases()) as $constantName) {
$cases[$constantName] = new EnumCaseObjectType($classReflection->getName(), $constantName);
}

Expand Down

0 comments on commit 121e021

Please sign in to comment.