From 526013e77e25f12cbf68a7a2f7b40ba7d40d8a33 Mon Sep 17 00:00:00 2001 From: robchett Date: Sat, 3 Feb 2024 18:09:23 +0000 Subject: [PATCH 1/2] Fix check-type when using reserved types from within a namespace --- .../Internal/Analyzer/StatementsAnalyzer.php | 13 ++++++-- tests/AssertAnnotationTest.php | 31 ++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php b/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php index cb3c9b49d94..9e484ca32b5 100644 --- a/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php @@ -45,6 +45,8 @@ use Psalm\Internal\ReferenceConstraint; use Psalm\Internal\Scanner\ParsedDocblock; use Psalm\Internal\Type\Comparator\UnionTypeComparator; +use Psalm\Internal\Type\TypeParser; +use Psalm\Internal\Type\TypeTokenizer; use Psalm\Issue\CheckType; use Psalm\Issue\ComplexFunction; use Psalm\Issue\ComplexMethod; @@ -678,11 +680,18 @@ private static function analyzeStatement( } else { try { $checked_type = $context->vars_in_scope[$checked_var_id]; - $fq_check_type_string = Type::getFQCLNFromString( + $check_tokens = TypeTokenizer::getFullyQualifiedTokens( $check_type_string, $statements_analyzer->getAliases(), + $statements_analyzer->getTemplateTypeMap(), + ); + $check_type = TypeParser::parseTokens( + $check_tokens, + null, + $statements_analyzer->getTemplateTypeMap() ?? [], + [], + true, ); - $check_type = Type::parseString($fq_check_type_string); /** @psalm-suppress InaccessibleProperty We just created this type */ $check_type->possibly_undefined = $possibly_undefined; diff --git a/tests/AssertAnnotationTest.php b/tests/AssertAnnotationTest.php index 5b619971f8e..83945999d87 100644 --- a/tests/AssertAnnotationTest.php +++ b/tests/AssertAnnotationTest.php @@ -2255,7 +2255,36 @@ function takesSomeIntFromEnum(int $foo): IntEnum function isNonEmptyString($_str): bool { return true; - }', + } + ', + ], + 'assertStringIsNonEmptyStringInNamespace' => [ + 'code' => ' [ 'code' => ' Date: Sat, 3 Feb 2024 18:26:20 +0000 Subject: [PATCH 2/2] Support user defined types for psalm-check-type --- src/Psalm/Internal/Analyzer/StatementsAnalyzer.php | 7 ++++++- tests/CheckTypeTest.php | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php b/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php index 9e484ca32b5..4f89f5de1d8 100644 --- a/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php @@ -680,16 +680,21 @@ private static function analyzeStatement( } else { try { $checked_type = $context->vars_in_scope[$checked_var_id]; + + $path = $statements_analyzer->getRootFilePath(); + $file_storage = $codebase->file_storage_provider->get($path); + $check_tokens = TypeTokenizer::getFullyQualifiedTokens( $check_type_string, $statements_analyzer->getAliases(), $statements_analyzer->getTemplateTypeMap(), + $file_storage->type_aliases, ); $check_type = TypeParser::parseTokens( $check_tokens, null, $statements_analyzer->getTemplateTypeMap() ?? [], - [], + $file_storage->type_aliases, true, ); /** @psalm-suppress InaccessibleProperty We just created this type */ diff --git a/tests/CheckTypeTest.php b/tests/CheckTypeTest.php index 457c496db83..64b65e3fc32 100644 --- a/tests/CheckTypeTest.php +++ b/tests/CheckTypeTest.php @@ -38,6 +38,15 @@ final class A {} $_a = new stdClass(); /** @psalm-check-type-exact $_a = \stdClass */', ]; + yield 'allowType' => [ + 'code' => '