From d9e79138475e2ba7c44d78adb47cb182e7e9de0b Mon Sep 17 00:00:00 2001 From: AndrolGenhald Date: Wed, 8 Dec 2021 13:28:28 -0600 Subject: [PATCH] Fix non-empty-literal-string to behave as subtype of non-empty-string (fixes #7095). --- src/Psalm/Internal/Type/TypeCombiner.php | 9 +++++++++ tests/TypeCombinationTest.php | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/Psalm/Internal/Type/TypeCombiner.php b/src/Psalm/Internal/Type/TypeCombiner.php index e51000984b6..8761afc75a5 100644 --- a/src/Psalm/Internal/Type/TypeCombiner.php +++ b/src/Psalm/Internal/Type/TypeCombiner.php @@ -38,6 +38,7 @@ use Psalm\Type\Atomic\TNonEmptyList; use Psalm\Type\Atomic\TNonEmptyLowercaseString; use Psalm\Type\Atomic\TNonEmptyMixed; +use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString; use Psalm\Type\Atomic\TNonEmptyString; use Psalm\Type\Atomic\TNonFalsyString; use Psalm\Type\Atomic\TNonspecificLiteralInt; @@ -1131,6 +1132,14 @@ private static function scrapeStringProperties( && get_class($type) === TNonEmptyLowercaseString::class ) { //no-change + } elseif (get_class($combination->value_types['string']) === TNonEmptyNonspecificLiteralString::class + && $type instanceof TNonEmptyString + ) { + $combination->value_types['string'] = new TNonEmptyString(); + } elseif (get_class($type) === TNonEmptyNonspecificLiteralString::class + && $combination->value_types['string'] instanceof TNonEmptyString + ) { + // do nothing } else { $combination->value_types['string'] = new TString(); } diff --git a/tests/TypeCombinationTest.php b/tests/TypeCombinationTest.php index cfb37416a54..17f8d300135 100644 --- a/tests/TypeCombinationTest.php +++ b/tests/TypeCombinationTest.php @@ -801,6 +801,20 @@ public function providerTestValidTypeCombination(): array 'positive-int', ] ], + 'combineNonEmptyStringAndNonEmptyNonSpecificLiteralString' => [ + 'non-empty-string', + [ + 'non-empty-literal-string', + 'non-empty-string', + ], + ], + 'combineNonEmptyNonSpecificLiteralStringAndNonEmptyString' => [ + 'non-empty-string', + [ + 'non-empty-string', + 'non-empty-literal-string', + ], + ], ]; }