Skip to content

Commit 162f774

Browse files
committed
Fix static return type in php-8-stubs
1 parent f61d324 commit 162f774

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

src/Reflection/SignatureMap/Php8SignatureMapProvider.php

+11-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use PHPStan\Reflection\InitializerExprContext;
1717
use PHPStan\Reflection\InitializerExprTypeResolver;
1818
use PHPStan\Reflection\PassedByReference;
19+
use PHPStan\Reflection\ReflectionProvider\ReflectionProviderProvider;
1920
use PHPStan\ShouldNotHappenException;
2021
use PHPStan\Type\FileTypeMapper;
2122
use PHPStan\Type\MixedType;
@@ -50,6 +51,7 @@ public function __construct(
5051
private FileTypeMapper $fileTypeMapper,
5152
private PhpVersion $phpVersion,
5253
private InitializerExprTypeResolver $initializerExprTypeResolver,
54+
private ReflectionProviderProvider $reflectionProviderProvider,
5355
)
5456
{
5557
$this->map = new Php8StubsMap($phpVersion->getVersionId());
@@ -392,14 +394,21 @@ private function getSignature(
392394
$phpDocReturnType = $phpDoc->getReturnTag()->getType();
393395
}
394396
}
397+
398+
$classReflection = null;
399+
if ($className !== null) {
400+
$reflectionProvider = $this->reflectionProviderProvider->getReflectionProvider();
401+
$classReflection = $reflectionProvider->getClass($className);
402+
}
403+
395404
$parameters = [];
396405
$variadic = false;
397406
foreach ($function->getParams() as $param) {
398407
$name = $param->var;
399408
if (!$name instanceof Variable || !is_string($name->name)) {
400409
throw new ShouldNotHappenException();
401410
}
402-
$parameterType = ParserNodeTypeToPHPStanType::resolve($param->type, null);
411+
$parameterType = ParserNodeTypeToPHPStanType::resolve($param->type, $classReflection);
403412
$parameters[] = new ParameterSignature(
404413
$name->name,
405414
$param->default !== null || $param->variadic,
@@ -417,7 +426,7 @@ private function getSignature(
417426
$variadic = $variadic || $param->variadic;
418427
}
419428

420-
$returnType = ParserNodeTypeToPHPStanType::resolve($function->getReturnType(), null);
429+
$returnType = ParserNodeTypeToPHPStanType::resolve($function->getReturnType(), $classReflection);
421430

422431
return new FunctionSignature(
423432
$parameters,
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php // lint >= 8.3
2+
3+
namespace Bug12077;
4+
5+
use ReflectionMethod;
6+
use function PHPStan\Testing\assertType;
7+
8+
function (): void {
9+
$methodInfo = ReflectionMethod::createFromMethodName("Exception::getMessage");
10+
assertType(ReflectionMethod::class, $methodInfo);
11+
};

tests/PHPStan/Reflection/SignatureMap/Php8SignatureMapProviderTest.php

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPStan\Reflection\InitializerExprTypeResolver;
1111
use PHPStan\Reflection\Native\NativeParameterReflection;
1212
use PHPStan\Reflection\PassedByReference;
13+
use PHPStan\Reflection\ReflectionProvider\ReflectionProviderProvider;
1314
use PHPStan\Testing\PHPStanTestCase;
1415
use PHPStan\Type\ArrayType;
1516
use PHPStan\Type\BenevolentUnionType;
@@ -162,6 +163,7 @@ private function createProvider(): Php8SignatureMapProvider
162163
self::getContainer()->getByType(FileTypeMapper::class),
163164
$phpVersion,
164165
self::getContainer()->getByType(InitializerExprTypeResolver::class),
166+
self::getContainer()->getByType(ReflectionProviderProvider::class),
165167
);
166168
}
167169

0 commit comments

Comments
 (0)