Skip to content

Commit 97a7cf8

Browse files
committed
Allow enum cases to be global constants
1 parent 147505c commit 97a7cf8

File tree

2 files changed

+77
-5
lines changed

2 files changed

+77
-5
lines changed

src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php

+11-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Psalm\FileSource;
1313
use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
1414
use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\ArithmeticOpAnalyzer;
15+
use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ConstFetchAnalyzer;
1516
use Psalm\Internal\Analyzer\StatementsAnalyzer;
1617
use Psalm\Internal\Provider\NodeDataProvider;
1718
use Psalm\Internal\Type\TypeCombiner;
@@ -261,23 +262,28 @@ public static function infer(
261262
}
262263

263264
if ($stmt instanceof PhpParser\Node\Expr\ConstFetch) {
264-
$name = strtolower($stmt->name->getFirst());
265-
if ($name === 'false') {
265+
$name = $stmt->name->getFirst();
266+
$name_lowercase = strtolower($name);
267+
if ($name_lowercase === 'false') {
266268
return Type::getFalse();
267269
}
268270

269-
if ($name === 'true') {
271+
if ($name_lowercase === 'true') {
270272
return Type::getTrue();
271273
}
272274

273-
if ($name === 'null') {
275+
if ($name_lowercase === 'null') {
274276
return Type::getNull();
275277
}
276278

277-
if ($stmt->name->getFirst() === '__NAMESPACE__') {
279+
if ($name === '__NAMESPACE__') {
278280
return Type::getString($aliases->namespace);
279281
}
280282

283+
if ($type = ConstFetchAnalyzer::getGlobalConstType($codebase, $name, $name)) {
284+
return $type;
285+
}
286+
281287
return null;
282288
}
283289

tests/EnumTest.php

+66
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,28 @@ enum BarEnum: int {
657657
'ignored_issues' => [],
658658
'php_version' => '8.1',
659659
],
660+
'stringBackedEnumCaseValueFromStringGlobalConstant' => [
661+
'code' => '<?php
662+
enum Bar: string
663+
{
664+
case Foo = \DATE_ATOM;
665+
}
666+
',
667+
'assertions' => [],
668+
'ignored_issues' => [],
669+
'php_version' => '8.1',
670+
],
671+
'intBackedEnumCaseValueFromIntGlobalConstant' => [
672+
'code' => '<?php
673+
enum Bar: int
674+
{
675+
case Foo = \UPLOAD_ERR_OK;
676+
}
677+
',
678+
'assertions' => [],
679+
'ignored_issues' => [],
680+
'php_version' => '8.1',
681+
],
660682
];
661683
}
662684

@@ -1107,6 +1129,50 @@ enum Bar: int
11071129
'ignored_issues' => [],
11081130
'php_version' => '8.1',
11091131
],
1132+
'invalidStringBackedEnumCaseValueFromStringGlobalConstant' => [
1133+
'code' => '<?php
1134+
enum Bar: string
1135+
{
1136+
case Foo = \PHP_VERSION_ID;
1137+
}
1138+
',
1139+
'error_message' => 'InvalidEnumCaseValue',
1140+
'ignored_issues' => [],
1141+
'php_version' => '8.1',
1142+
],
1143+
'invalidIntBackedEnumCaseValueFromIntGlobalConstant' => [
1144+
'code' => '<?php
1145+
enum Bar: int
1146+
{
1147+
case Foo = \PHP_BINARY;
1148+
}
1149+
',
1150+
'error_message' => 'InvalidEnumCaseValue',
1151+
'ignored_issues' => [],
1152+
'php_version' => '8.1',
1153+
],
1154+
'invalidStringBackedEnumCaseValueFromIntGlobalConstant' => [
1155+
'code' => '<?php
1156+
enum Bar: string
1157+
{
1158+
case Foo = \PHP_BINARY;
1159+
}
1160+
',
1161+
'error_message' => 'InvalidEnumCaseValue',
1162+
'ignored_issues' => [],
1163+
'php_version' => '8.1',
1164+
],
1165+
'invalidIntBackedEnumCaseValueFromStringGlobalConstant' => [
1166+
'code' => '<?php
1167+
enum Bar: int
1168+
{
1169+
case Foo = \PHP_VERSION_ID;
1170+
}
1171+
',
1172+
'error_message' => 'InvalidEnumCaseValue',
1173+
'ignored_issues' => [],
1174+
'php_version' => '8.1',
1175+
],
11101176
];
11111177
}
11121178
}

0 commit comments

Comments
 (0)