diff --git a/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php b/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php index 8beea77c32d..6d51c7d2d9d 100644 --- a/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php +++ b/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php @@ -15,8 +15,6 @@ use Psalm\Type\Atomic\TString; use Psalm\Type\Union; -use function count; - use const PHP_URL_FRAGMENT; use const PHP_URL_HOST; use const PHP_URL_PASS; @@ -44,7 +42,8 @@ public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $ev return Type::getMixed(); } - if (count($call_args) > 1) { + if (isset($call_args[1])) { + $is_default_component = false; if ($component_type = $statements_source->node_data->getType($call_args[1]->value)) { if (!$component_type->hasMixed()) { $codebase = $statements_source->getCodebase(); @@ -110,22 +109,29 @@ public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $ev return $nullable_falsable_int; } + + if ($component_type->isSingleIntLiteral()) { + $component_type_type = $component_type->getSingleIntLiteral(); + $is_default_component = $component_type_type->value <= -1; + } } } - $nullable_string_or_int = new Union([ - new TString, - new TInt, - new TNull, - ]); + if (!$is_default_component) { + $nullable_string_or_int = new Union([ + new TString, + new TInt, + new TNull, + ]); - $codebase = $statements_source->getCodebase(); + $codebase = $statements_source->getCodebase(); - if ($codebase->config->ignore_internal_nullable_issues) { - $nullable_string_or_int->ignore_nullable_issues = true; - } + if ($codebase->config->ignore_internal_nullable_issues) { + $nullable_string_or_int->ignore_nullable_issues = true; + } - return $nullable_string_or_int; + return $nullable_string_or_int; + } } $component_types = [ diff --git a/tests/FunctionCallTest.php b/tests/FunctionCallTest.php index 4835ce61e91..dc0185bc60c 100644 --- a/tests/FunctionCallTest.php +++ b/tests/FunctionCallTest.php @@ -673,6 +673,19 @@ function bag(string $s) : string { '$fragment' => 'false|null|string', ], ], + 'parseUrlDefaultComponent' => [ + ' [ + '$a' => 'array{fragment?: string, host?: string, pass?: string, path?: string, port?: int, query?: string, scheme?: string, user?: string}|false', + '$b' => 'array{fragment?: string, host?: string, pass?: string, path?: string, port?: int, query?: string, scheme?: string, user?: string}|false', + '$c' => 'array{fragment?: string, host?: string, pass?: string, path?: string, port?: int, query?: string, scheme?: string, user?: string}|false', + ], + ], 'triggerUserError' => [ '