Skip to content

Commit b1afdae

Browse files
committed
Test PHP 8.1 enum lookalikes in conjunction with Enum::valuesOf() / Enum::valueOf()
1 parent 42c8060 commit b1afdae

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

src/main/php/lang/ast/emit/PHP.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ protected function isConstant($result, $node) {
5656
return (
5757
$node->member instanceof Literal &&
5858
is_string($node->type) &&
59-
'enum' !== $result->lookup($node->type)->kind()
59+
!$result->lookup($node->type)->isEnumCase($node->member->expression)
6060
);
6161
} else if ($node instanceof BinaryExpression) {
6262
return $this->isConstant($result, $node->left) && $this->isConstant($result, $node->right);
@@ -956,7 +956,7 @@ protected function emitScope($result, $scope) {
956956
$result->out->write(')?'.$t.'::');
957957
$this->emitOne($result, $scope->member);
958958
$result->out->write(':null');
959-
} else if ($scope->member instanceof Literal && 'enum' === $result->lookup($scope->type)->kind()) {
959+
} else if ($scope->member instanceof Literal && $result->lookup($scope->type)->isEnumCase($scope->member->expression)) {
960960
$result->out->write($scope->type.'::$'.$scope->member->expression);
961961
} else {
962962
$result->out->write($scope->type.'::');

src/test/php/lang/ast/unittest/emit/EnumTest.class.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,39 @@ public static function run($order= self::ASC) {
5050

5151
Assert::equals('ASC', $t->getMethod('run')->invoke(null));
5252
}
53+
54+
#[Test]
55+
public function enum_values() {
56+
$t= $this->type('use lang\Enum; enum <T> {
57+
case Hearts;
58+
case Diamonds;
59+
case Clubs;
60+
case Spades;
61+
62+
public static function run() {
63+
return Enum::valuesOf(self::class);
64+
}
65+
}');
66+
67+
Assert::equals(
68+
['Hearts', 'Diamonds', 'Clubs', 'Spades'],
69+
array_map(function($suit) { return $suit->name; }, $t->getMethod('run')->invoke(null))
70+
);
71+
}
72+
73+
#[Test]
74+
public function enum_value() {
75+
$t= $this->type('use lang\Enum; enum <T> {
76+
case Hearts;
77+
case Diamonds;
78+
case Clubs;
79+
case Spades;
80+
81+
public static function run() {
82+
return Enum::valueOf(self::class, "Hearts")->name;
83+
}
84+
}');
85+
86+
Assert::equals('Hearts', $t->getMethod('run')->invoke(null));
87+
}
5388
}

0 commit comments

Comments
 (0)