From 3c946b60afb92664bc6c0e162624f22d7a898967 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 2 Oct 2023 23:27:49 +0000 Subject: [PATCH] Updated Rector to commit 6a89b43080ca6f349322af160b15bf0814d40cb6 https://github.com/rectorphp/rector-src/commit/6a89b43080ca6f349322af160b15bf0814d40cb6 [TypeDeclaration] Remove AstResolver usage on ReturnedNodesReturnTypeInfererTypeInferer (#5108) --- ...urnedNodesReturnTypeInfererTypeInferer.php | 83 +------------------ src/Application/VersionResolver.php | 4 +- 2 files changed, 3 insertions(+), 84 deletions(-) diff --git a/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php b/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php index c4cca775736..99f5abe8e4e 100644 --- a/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php @@ -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); - } } diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index b50810798de..f760bbcc54a 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -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 */