Skip to content

Commit

Permalink
Merge pull request #10339 from robchett/global_const_as_enum_case
Browse files Browse the repository at this point in the history
Allow enum cases to be global constants
  • Loading branch information
orklah committed Nov 3, 2023
2 parents b9c82d3 + 97a7cf8 commit e6564c6
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Psalm\FileSource;
use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\ArithmeticOpAnalyzer;
use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ConstFetchAnalyzer;
use Psalm\Internal\Analyzer\StatementsAnalyzer;
use Psalm\Internal\Provider\NodeDataProvider;
use Psalm\Internal\Type\TypeCombiner;
Expand Down Expand Up @@ -261,23 +262,28 @@ public static function infer(
}

if ($stmt instanceof PhpParser\Node\Expr\ConstFetch) {
$name = strtolower($stmt->name->getFirst());
if ($name === 'false') {
$name = $stmt->name->getFirst();
$name_lowercase = strtolower($name);
if ($name_lowercase === 'false') {
return Type::getFalse();
}

if ($name === 'true') {
if ($name_lowercase === 'true') {
return Type::getTrue();
}

if ($name === 'null') {
if ($name_lowercase === 'null') {
return Type::getNull();
}

if ($stmt->name->getFirst() === '__NAMESPACE__') {
if ($name === '__NAMESPACE__') {
return Type::getString($aliases->namespace);
}

if ($type = ConstFetchAnalyzer::getGlobalConstType($codebase, $name, $name)) {
return $type;
}

return null;
}

Expand Down
66 changes: 66 additions & 0 deletions tests/EnumTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -657,6 +657,28 @@ enum BarEnum: int {
'ignored_issues' => [],
'php_version' => '8.1',
],
'stringBackedEnumCaseValueFromStringGlobalConstant' => [
'code' => '<?php
enum Bar: string
{
case Foo = \DATE_ATOM;
}
',
'assertions' => [],
'ignored_issues' => [],
'php_version' => '8.1',
],
'intBackedEnumCaseValueFromIntGlobalConstant' => [
'code' => '<?php
enum Bar: int
{
case Foo = \UPLOAD_ERR_OK;
}
',
'assertions' => [],
'ignored_issues' => [],
'php_version' => '8.1',
],
];
}

Expand Down Expand Up @@ -1107,6 +1129,50 @@ enum Bar: int
'ignored_issues' => [],
'php_version' => '8.1',
],
'invalidStringBackedEnumCaseValueFromStringGlobalConstant' => [
'code' => '<?php
enum Bar: string
{
case Foo = \PHP_VERSION_ID;
}
',
'error_message' => 'InvalidEnumCaseValue',
'ignored_issues' => [],
'php_version' => '8.1',
],
'invalidIntBackedEnumCaseValueFromIntGlobalConstant' => [
'code' => '<?php
enum Bar: int
{
case Foo = \PHP_BINARY;
}
',
'error_message' => 'InvalidEnumCaseValue',
'ignored_issues' => [],
'php_version' => '8.1',
],
'invalidStringBackedEnumCaseValueFromIntGlobalConstant' => [
'code' => '<?php
enum Bar: string
{
case Foo = \PHP_BINARY;
}
',
'error_message' => 'InvalidEnumCaseValue',
'ignored_issues' => [],
'php_version' => '8.1',
],
'invalidIntBackedEnumCaseValueFromStringGlobalConstant' => [
'code' => '<?php
enum Bar: int
{
case Foo = \PHP_VERSION_ID;
}
',
'error_message' => 'InvalidEnumCaseValue',
'ignored_issues' => [],
'php_version' => '8.1',
],
];
}
}

0 comments on commit e6564c6

Please sign in to comment.