Skip to content

Commit a3bc2dc

Browse files
[TypeDeclaration] Handle crash Multiple variants - use selectFromArgs() on ReturnAnnotationIncorrectNullableRector (rectorphp#3359)
Co-authored-by: GitHub Action <[email protected]>
1 parent b999639 commit a3bc2dc

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

packages/NodeTypeResolver/PHPStan/ParametersAcceptorSelectorVariantsWrapper.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ public static function select(
2121
): ParametersAcceptor {
2222
$variants = $reflection->getVariants();
2323
if ($node instanceof FunctionLike) {
24-
return ParametersAcceptorSelector::selectSingle($variants);
24+
$parameterAcceptors = [];
25+
foreach ($variants as $variant) {
26+
$parameterAcceptors[] = ParametersAcceptorSelector::selectSingle([$variant]);
27+
}
28+
29+
return ParametersAcceptorSelector::combineAcceptors($parameterAcceptors);
2530
}
2631

2732
if ($node->isFirstClassCallable()) {

packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php

+13-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
use PhpParser\Node\Expr;
99
use PhpParser\Node\Stmt\ClassMethod;
1010
use PhpParser\Node\Stmt\Return_;
11+
use PHPStan\Analyser\Scope;
1112
use PHPStan\Reflection\ClassReflection;
1213
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
1314
use PHPStan\Reflection\MethodReflection;
14-
use PHPStan\Reflection\ParametersAcceptorSelector;
1515
use PHPStan\Reflection\ReflectionProvider;
1616
use PHPStan\Type\MixedType;
1717
use PHPStan\Type\Type;
@@ -22,6 +22,8 @@
2222
use Rector\Core\Reflection\ReflectionResolver;
2323
use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer;
2424
use Rector\NodeNameResolver\NodeNameResolver;
25+
use Rector\NodeTypeResolver\Node\AttributeKey;
26+
use Rector\NodeTypeResolver\PHPStan\ParametersAcceptorSelectorVariantsWrapper;
2527
use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer;
2628
use Rector\VendorLocker\ParentClassMethodTypeOverrideGuard;
2729

@@ -94,7 +96,16 @@ private function isReturnTypeChangeAllowed(ClassMethod $classMethod): bool
9496
return true;
9597
}
9698

97-
$parametersAcceptor = ParametersAcceptorSelector::selectSingle($parentClassMethodReflection->getVariants());
99+
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
100+
if (! $scope instanceof Scope) {
101+
return false;
102+
}
103+
104+
$parametersAcceptor = ParametersAcceptorSelectorVariantsWrapper::select(
105+
$parentClassMethodReflection,
106+
$classMethod,
107+
$scope
108+
);
98109
if ($parametersAcceptor instanceof FunctionVariantWithPhpDocs && ! $parametersAcceptor->getNativeReturnType() instanceof MixedType) {
99110
return false;
100111
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnAnnotationIncorrectNullableRector\Fixture;
4+
5+
class SkipReturnAnonymousClassExtends
6+
{
7+
public function getMockedRedis() : \Redis
8+
{
9+
$redis = new class() extends \Redis {
10+
public function set($key, $value, $timeout = null)
11+
{
12+
throw new \BadMethodCallException('Not implemented in mock object');
13+
}
14+
};
15+
16+
return $redis;
17+
}
18+
}
19+
20+

0 commit comments

Comments
 (0)