Updated Rector to commit 6a89b43080ca6f349322af160b15bf0814d40cb6

6a89b43080 [TypeDeclaration] Remove AstResolver usage on ReturnedNodesReturnTypeInfererTypeInferer (#5108)
This commit is contained in:
Tomas Votruba 2023-10-02 23:27:49 +00:00
parent dc3682f340
commit 3c946b60af
2 changed files with 3 additions and 84 deletions

View File

@ -5,20 +5,14 @@ namespace Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ArrowFunction;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\FunctionLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Return_;
use PhpParser\NodeTraverser;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\VoidType;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\PhpParser\Printer\BetterStandardPrinter;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\NodeTypeResolver\NodeTypeResolver;
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
@ -55,30 +49,18 @@ final class ReturnedNodesReturnTypeInfererTypeInferer
* @var \Rector\TypeDeclaration\TypeInferer\SplArrayFixedTypeNarrower
*/
private $splArrayFixedTypeNarrower;
/**
* @readonly
* @var \Rector\Core\PhpParser\AstResolver
*/
private $reflectionAstResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Printer\BetterStandardPrinter
*/
private $betterStandardPrinter;
/**
* @readonly
* @var \Rector\Core\Reflection\ReflectionResolver
*/
private $reflectionResolver;
public function __construct(SilentVoidResolver $silentVoidResolver, NodeTypeResolver $nodeTypeResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, TypeFactory $typeFactory, SplArrayFixedTypeNarrower $splArrayFixedTypeNarrower, AstResolver $reflectionAstResolver, BetterStandardPrinter $betterStandardPrinter, ReflectionResolver $reflectionResolver)
public function __construct(SilentVoidResolver $silentVoidResolver, NodeTypeResolver $nodeTypeResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, TypeFactory $typeFactory, SplArrayFixedTypeNarrower $splArrayFixedTypeNarrower, ReflectionResolver $reflectionResolver)
{
$this->silentVoidResolver = $silentVoidResolver;
$this->nodeTypeResolver = $nodeTypeResolver;
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
$this->typeFactory = $typeFactory;
$this->splArrayFixedTypeNarrower = $splArrayFixedTypeNarrower;
$this->reflectionAstResolver = $reflectionAstResolver;
$this->betterStandardPrinter = $betterStandardPrinter;
$this->reflectionResolver = $reflectionResolver;
}
public function inferFunctionLike(FunctionLike $functionLike) : Type
@ -97,7 +79,6 @@ final class ReturnedNodesReturnTypeInfererTypeInferer
}
foreach ($localReturnNodes as $localReturnNode) {
$returnedExprType = $localReturnNode->expr instanceof Expr ? $this->nodeTypeResolver->getNativeType($localReturnNode->expr) : new VoidType();
$returnedExprType = $this->correctWithNestedType($returnedExprType, $localReturnNode, $functionLike);
$types[] = $this->splArrayFixedTypeNarrower->narrow($returnedExprType);
}
if ($this->silentVoidResolver->hasSilentVoid($functionLike)) {
@ -145,66 +126,4 @@ final class ReturnedNodesReturnTypeInfererTypeInferer
}
return $classReflection->isAbstract();
}
private function inferFromReturnedMethodCall(Return_ $return, FunctionLike $originalFunctionLike) : Type
{
if (!$return->expr instanceof MethodCall) {
return new MixedType();
}
$methodReflection = $this->reflectionResolver->resolveMethodReflectionFromMethodCall($return->expr);
if (!$methodReflection instanceof MethodReflection) {
return new MixedType();
}
$isReturnScoped = \false;
$this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $originalFunctionLike->getStmts(), static function (Node $subNode) use($return, &$isReturnScoped) : ?int {
if ($subNode instanceof FunctionLike && !$subNode instanceof ArrowFunction) {
return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN;
}
if (!$subNode instanceof Return_) {
return null;
}
if ($return === $subNode) {
$isReturnScoped = \true;
return NodeTraverser::STOP_TRAVERSAL;
}
return null;
});
if ($isReturnScoped) {
return new MixedType();
}
return $this->resolveClassMethod($methodReflection, $originalFunctionLike);
}
private function isArrayTypeMixed(Type $type) : bool
{
if (!$type instanceof ArrayType) {
return \false;
}
if (!$type->getItemType() instanceof MixedType) {
return \false;
}
return $type->getKeyType() instanceof MixedType;
}
private function correctWithNestedType(Type $resolvedType, Return_ $return, FunctionLike $functionLike) : Type
{
if ($resolvedType instanceof MixedType || $this->isArrayTypeMixed($resolvedType)) {
$correctedType = $this->inferFromReturnedMethodCall($return, $functionLike);
// override only if has some extra value
if (!$correctedType instanceof MixedType && !$correctedType->isVoid()->yes()) {
return $correctedType;
}
}
return $resolvedType;
}
private function resolveClassMethod(MethodReflection $methodReflection, FunctionLike $originalFunctionLike) : Type
{
$classMethod = $this->reflectionAstResolver->resolveClassMethodFromMethodReflection($methodReflection);
if (!$classMethod instanceof ClassMethod) {
return new MixedType();
}
$classMethodCacheKey = $this->betterStandardPrinter->print($classMethod);
$functionLikeCacheKey = $this->betterStandardPrinter->print($originalFunctionLike);
if ($classMethodCacheKey === $functionLikeCacheKey) {
return new MixedType();
}
return $this->inferFunctionLike($classMethod);
}
}

View File

@ -19,12 +19,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '8c9fe9ac64330acd0271bc1494dbbb86281310ca';
public const PACKAGE_VERSION = '6a89b43080ca6f349322af160b15bf0814d40cb6';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2023-10-03 00:53:30';
public const RELEASE_DATE = '2023-10-03 06:25:09';
/**
* @var int
*/