From 6039e2be9b1ecffde979c58c7e3ca19cd07cba07 Mon Sep 17 00:00:00 2001 From: tuqqu Date: Tue, 10 Oct 2023 22:56:36 +0200 Subject: [PATCH 1/2] Fix for inferring enum case value from a class constant --- .../Expression/SimpleTypeInferer.php | 6 +-- tests/EnumTest.php | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php index ab144621edb..cfd69cb3784 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php @@ -337,15 +337,13 @@ public static function infer( return Type::getLiteralClassString($const_fq_class_name, true); } - if ($existing_class_constants === null - && $file_source instanceof StatementsAnalyzer - ) { + if ($existing_class_constants === null || $existing_class_constants === []) { try { $foreign_class_constant = $codebase->classlikes->getClassConstantType( $const_fq_class_name, $stmt->name->name, ReflectionProperty::IS_PRIVATE, - $file_source, + $file_source instanceof StatementsAnalyzer ? $file_source : null, ); if ($foreign_class_constant) { diff --git a/tests/EnumTest.php b/tests/EnumTest.php index 77df3b8d659..12322c66698 100644 --- a/tests/EnumTest.php +++ b/tests/EnumTest.php @@ -610,6 +610,26 @@ function f(Transport $e): void { 'ignored_issues' => [], 'php_version' => '8.1', ], + 'backedEnumCaseValueFromClassConstant' => [ + 'code' => <<<'PHP' + [], + 'ignored_issues' => [], + 'php_version' => '8.1', + ], ]; } @@ -1030,6 +1050,36 @@ function f(string $state): void {} 'ignored_issues' => [], 'php_version' => '8.1', ], + 'stringBackedEnumCaseValueFromClassConstant' => [ + 'code' => ' 'InvalidEnumCaseValue', + 'ignored_issues' => [], + 'php_version' => '8.1', + ], + 'intBackedEnumCaseValueFromClassConstant' => [ + 'code' => ' 'InvalidEnumCaseValue', + 'ignored_issues' => [], + 'php_version' => '8.1', + ], ]; } } From d0825b5fe2d850d7faea0d7dfac43661087abee7 Mon Sep 17 00:00:00 2001 From: tuqqu Date: Fri, 13 Oct 2023 00:03:53 +0200 Subject: [PATCH 2/2] Fix for inferring enum case value from a class constant, const test fix --- .../Analyzer/Statements/Expression/SimpleTypeInferer.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php index cfd69cb3784..6d94391ffd2 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php @@ -337,7 +337,10 @@ public static function infer( return Type::getLiteralClassString($const_fq_class_name, true); } - if ($existing_class_constants === null || $existing_class_constants === []) { + if ($existing_class_constants === null + || $existing_class_constants === [] + && $file_source !== null + ) { try { $foreign_class_constant = $codebase->classlikes->getClassConstantType( $const_fq_class_name,