diff --git a/date/date_c.php b/date/date_c.php index 59d59a308..6e8b15420 100644 --- a/date/date_c.php +++ b/date/date_c.php @@ -283,7 +283,7 @@ public static function getLastErrors(): array|false {} #[PhpStormStubsElementAvailable(from:'5.5', to: '8.2')] #[Pure] #[TentativeType] - #[LanguageLevelTypeAware(['8.4' => 'DateTimeImmutable'], default: 'DateTimeImmutable|false')] + #[LanguageLevelTypeAware(['8.4' => 'DateTimeImmutable'], default: 'static|false')] public function modify(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $modifier) {} /** @@ -666,7 +666,7 @@ public function format(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '' */ #[PhpStormStubsElementAvailable(from: '5.3', to: '8.2')] #[TentativeType] - #[LanguageLevelTypeAware(['8.4' => 'DateTime'], default: 'DateTime|false')] + #[LanguageLevelTypeAware(['8.4' => 'DateTime'], default: 'static|false')] public function modify(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $modifier) {} /** @@ -679,7 +679,7 @@ public function modify(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '' */ #[PhpStormStubsElementAvailable(from: '8.3')] #[TentativeType] - #[LanguageLevelTypeAware(['8.4' => 'DateTime'], default: 'DateTime|false')] + #[LanguageLevelTypeAware(['8.4' => 'DateTime'], default: 'static|false')] public function modify(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $modifier) {} /** diff --git a/tests/AbstractBaseStubsTestCase.php b/tests/AbstractBaseStubsTestCase.php index ff5bf0097..1f03f6699 100644 --- a/tests/AbstractBaseStubsTestCase.php +++ b/tests/AbstractBaseStubsTestCase.php @@ -205,13 +205,17 @@ public static function getStringRepresentationOfTypeHintsFromAttributes(array $t * @param string[] $typesToProcess * @param string[] $resultArray */ - public static function convertNullableTypesToUnion(array $typesToProcess, array &$resultArray) + public static function unifyTypes(array $typesToProcess, array &$resultArray, ?PHPClass $parentClass = null) { - array_walk($typesToProcess, function (string $type) use (&$resultArray) { + array_walk($typesToProcess, function (string $type) use (&$resultArray, $parentClass) { if (str_contains($type, '?')) { array_push($resultArray, 'null', ltrim($type, '?')); } else { - $resultArray[] = $type; + if ($type === 'self' || $type === 'static') { + $resultArray[] = $parentClass?->name; + } else { + $resultArray[] = $type; + } } }); } diff --git a/tests/BaseClassesTest.php b/tests/BaseClassesTest.php index e82afddcb..7bc1952c9 100644 --- a/tests/BaseClassesTest.php +++ b/tests/BaseClassesTest.php @@ -193,13 +193,13 @@ public function testClassPropertiesType(?string $classId, ?string $propertyName) $unifiedStubsPropertyTypes = []; $unifiedStubsAttributesPropertyTypes = []; $unifiedReflectionPropertyTypes = []; - self::convertNullableTypesToUnion($reflectionProperty->typesFromSignature, $unifiedReflectionPropertyTypes); + self::unifyTypes($reflectionProperty->typesFromSignature, $unifiedReflectionPropertyTypes); if (!empty($stubProperty->typesFromSignature)) { - self::convertNullableTypesToUnion($stubProperty->typesFromSignature, $unifiedStubsPropertyTypes); + self::unifyTypes($stubProperty->typesFromSignature, $unifiedStubsPropertyTypes); } foreach ($stubProperty->typesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesPropertyTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesPropertyTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesPropertyTypes[$languageVersion]); } $typesFromAttribute = []; $testCondition = self::isReflectionTypesMatchSignature($unifiedReflectionPropertyTypes, $unifiedStubsPropertyTypes); diff --git a/tests/StubsPhp81Tests.php b/tests/StubsPhp81Tests.php index d5069d583..3ba29873f 100644 --- a/tests/StubsPhp81Tests.php +++ b/tests/StubsPhp81Tests.php @@ -41,18 +41,20 @@ public function testClassMethodTentativeReturnTypeHints(?string $classId, ?strin if (!$classId && !$methodName) { self::markTestSkipped($this->emptyDataSetMessage); } - $reflectionMethod = ReflectionStubsSingleton::getReflectionStubs()->getClass($classId, fromReflection: true)->getMethod($methodName, fromReflection: true); - $stubsMethod = PhpStormStubsSingleton::getPhpStormStubs()->getClass($classId)->getMethod($methodName); + $reflectionClass = ReflectionStubsSingleton::getReflectionStubs()->getClass($classId, fromReflection: true); + $reflectionMethod = $reflectionClass->getMethod($methodName, fromReflection: true); + $stubClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($classId); + $stubsMethod = $stubClass->getMethod($methodName); $unifiedStubsReturnTypes = []; $unifiedStubsAttributesReturnTypes = []; $unifiedReflectionReturnTypes = []; - self::convertNullableTypesToUnion($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); + self::unifyTypes($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes, $reflectionClass); if (!empty($stubsMethod->returnTypesFromSignature)) { - self::convertNullableTypesToUnion($stubsMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); + self::unifyTypes($stubsMethod->returnTypesFromSignature, $unifiedStubsReturnTypes, $stubClass); } else { foreach ($stubsMethod->returnTypesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesReturnTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion], $stubClass); } } $conditionToCompareWithSignature = AbstractBaseStubsTestCase::isReflectionTypesMatchSignature( @@ -89,13 +91,13 @@ public function testInterfaceMethodTentativeReturnTypeHints(?string $classId, ?s $unifiedStubsReturnTypes = []; $unifiedStubsAttributesReturnTypes = []; $unifiedReflectionReturnTypes = []; - self::convertNullableTypesToUnion($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); + self::unifyTypes($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); if (!empty($stubsMethod->returnTypesFromSignature)) { - self::convertNullableTypesToUnion($stubsMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); + self::unifyTypes($stubsMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); } else { foreach ($stubsMethod->returnTypesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesReturnTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); } } $conditionToCompareWithSignature = AbstractBaseStubsTestCase::isReflectionTypesMatchSignature( @@ -132,13 +134,13 @@ public function testEnumMethodTentativeReturnTypeHints(?string $classId, ?string $unifiedStubsReturnTypes = []; $unifiedStubsAttributesReturnTypes = []; $unifiedReflectionReturnTypes = []; - self::convertNullableTypesToUnion($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); + self::unifyTypes($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); if (!empty($stubsMethod->returnTypesFromSignature)) { - self::convertNullableTypesToUnion($stubsMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); + self::unifyTypes($stubsMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); } else { foreach ($stubsMethod->returnTypesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesReturnTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); } } $conditionToCompareWithSignature = AbstractBaseStubsTestCase::isReflectionTypesMatchSignature( diff --git a/tests/StubsTypeHintsTest.php b/tests/StubsTypeHintsTest.php index 927a6e33a..a765a9a34 100644 --- a/tests/StubsTypeHintsTest.php +++ b/tests/StubsTypeHintsTest.php @@ -37,13 +37,13 @@ public function testFunctionsReturnTypeHints(?string $functionId) $unifiedStubsReturnTypes = []; $unifiedStubsAttributesReturnTypes = []; $unifiedReflectionReturnTypes = []; - self::convertNullableTypesToUnion($function->returnTypesFromSignature, $unifiedReflectionReturnTypes); + self::unifyTypes($function->returnTypesFromSignature, $unifiedReflectionReturnTypes); if (!empty($stubFunction->returnTypesFromSignature)) { - self::convertNullableTypesToUnion($stubFunction->returnTypesFromSignature, $unifiedStubsReturnTypes); + self::unifyTypes($stubFunction->returnTypesFromSignature, $unifiedStubsReturnTypes); } foreach ($stubFunction->returnTypesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesReturnTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); } $conditionToCompareWithSignature = AbstractBaseStubsTestCase::isReflectionTypesMatchSignature( $unifiedReflectionReturnTypes, @@ -101,13 +101,13 @@ public function testClassMethodsReturnTypeHints(?string $classId, ?string $metho $unifiedStubsReturnTypes = []; $unifiedStubsAttributesReturnTypes = []; $unifiedReflectionReturnTypes = []; - self::convertNullableTypesToUnion($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); + self::unifyTypes($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); if (!empty($stubMethod->returnTypesFromSignature)) { - self::convertNullableTypesToUnion($stubMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); + self::unifyTypes($stubMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); } else { foreach ($stubMethod->returnTypesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesReturnTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); } } $conditionToCompareWithSignature = AbstractBaseStubsTestCase::isReflectionTypesMatchSignature( @@ -140,13 +140,13 @@ public function testInterfaceMethodsReturnTypeHints(?string $classId, ?string $m $unifiedStubsReturnTypes = []; $unifiedStubsAttributesReturnTypes = []; $unifiedReflectionReturnTypes = []; - self::convertNullableTypesToUnion($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); + self::unifyTypes($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); if (!empty($stubMethod->returnTypesFromSignature)) { - self::convertNullableTypesToUnion($stubMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); + self::unifyTypes($stubMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); } else { foreach ($stubMethod->returnTypesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesReturnTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); } } $conditionToCompareWithSignature = AbstractBaseStubsTestCase::isReflectionTypesMatchSignature( @@ -179,13 +179,13 @@ public function testEnumMethodsReturnTypeHints(?string $classId, ?string $method $unifiedStubsReturnTypes = []; $unifiedStubsAttributesReturnTypes = []; $unifiedReflectionReturnTypes = []; - self::convertNullableTypesToUnion($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); + self::unifyTypes($reflectionMethod->returnTypesFromSignature, $unifiedReflectionReturnTypes); if (!empty($stubMethod->returnTypesFromSignature)) { - self::convertNullableTypesToUnion($stubMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); + self::unifyTypes($stubMethod->returnTypesFromSignature, $unifiedStubsReturnTypes); } else { foreach ($stubMethod->returnTypesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesReturnTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesReturnTypes[$languageVersion]); } } $conditionToCompareWithSignature = AbstractBaseStubsTestCase::isReflectionTypesMatchSignature( @@ -599,13 +599,13 @@ private static function typeHintsMatchReflection(?PHPParameter $parameter, ?PHPP $unifiedStubsParameterTypes = []; $unifiedStubsAttributesParameterTypes = []; $unifiedReflectionParameterTypes = []; - self::convertNullableTypesToUnion($parameter->typesFromSignature, $unifiedReflectionParameterTypes); + self::unifyTypes($parameter->typesFromSignature, $unifiedReflectionParameterTypes); if (!empty($stubParameter->typesFromSignature)) { - self::convertNullableTypesToUnion($stubParameter->typesFromSignature, $unifiedStubsParameterTypes); + self::unifyTypes($stubParameter->typesFromSignature, $unifiedStubsParameterTypes); } foreach ($stubParameter->typesFromAttribute as $languageVersion => $listOfTypes) { $unifiedStubsAttributesParameterTypes[$languageVersion] = []; - self::convertNullableTypesToUnion($listOfTypes, $unifiedStubsAttributesParameterTypes[$languageVersion]); + self::unifyTypes($listOfTypes, $unifiedStubsAttributesParameterTypes[$languageVersion]); } $typesFromAttribute = []; $testCondition = AbstractBaseStubsTestCase::isReflectionTypesMatchSignature($unifiedReflectionParameterTypes, $unifiedStubsParameterTypes);