mirror of https://github.com/rectorphp/rector.git
Updated Rector to commit 6a89b43080ca6f349322af160b15bf0814d40cb6
6a89b43080
[TypeDeclaration] Remove AstResolver usage on ReturnedNodesReturnTypeInfererTypeInferer (#5108)
This commit is contained in:
parent
dc3682f340
commit
3c946b60af
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue