From 1e94a7045029d16fc4932fdd8127691c07813d4c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 5 Nov 2021 17:07:31 +0700 Subject: [PATCH] [DowngradePhp72] Improve DowngradeParameterTypeWideningRector (#1150) * [DowngradePhp72] Improve DowngradeParameterTypeWideningRector * check early for no params, private, or magic early * clean up unneded $param->type === null check as already checked in hasParamAlreadyNonTyped() --- .../DowngradeParameterTypeWideningRector.php | 42 +++++++++---------- ...AutowiredClassMethodOrPropertyAnalyzer.php | 17 ++------ 2 files changed, 22 insertions(+), 37 deletions(-) diff --git a/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php b/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php index b336c1e905..1c7c4e184e 100644 --- a/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php +++ b/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php @@ -164,19 +164,31 @@ public function configure(array $configuration): void private function shouldSkip(ClassReflection $classReflection, ClassMethod $classMethod): bool { + if ($classMethod->params === []) { + return true; + } + + if ($classMethod->isPrivate()) { + return true; + } + + if ($classMethod->isMagic()) { + return true; + } + if ($this->sealedClassAnalyzer->isSealedClass($classReflection)) { return true; } - if ($this->isSafeType($classReflection, $classMethod)) { + if ($this->autowiredClassMethodOrPropertyAnalyzer->detect($classMethod)) { return true; } - if ($classMethod->isPrivate()) { + if ($this->hasParamAlreadyNonTyped($classMethod)) { return true; } - return $this->shouldSkipClassMethod($classMethod); + return $this->isSafeType($classReflection, $classMethod); } private function processRemoveParamTypeFromMethod( @@ -206,30 +218,13 @@ private function removeParamTypeFromMethod(ClassMethod $classMethod, int $paramP return; } - // It already has no type => nothing to do - check original param, as it could have been removed by this rule - if ($param->type === null) { - return; - } - // Add the current type in the PHPDoc $this->nativeParamToPhpDocDecorator->decorate($classMethod, $param); $param->type = null; } - private function shouldSkipClassMethod(ClassMethod $classMethod): bool + private function hasParamAlreadyNonTyped(ClassMethod $classMethod): bool { - if ($classMethod->isMagic()) { - return true; - } - - if ($classMethod->params === []) { - return true; - } - - if ($this->autowiredClassMethodOrPropertyAnalyzer->detect($classMethod)) { - return true; - } - foreach ($classMethod->params as $param) { if ($param->type !== null) { return false; @@ -241,13 +236,14 @@ private function shouldSkipClassMethod(ClassMethod $classMethod): bool private function isSafeType(ClassReflection $classReflection, ClassMethod $classMethod): bool { + $classReflectionName = $classReflection->getName(); foreach ($this->safeTypes as $safeType) { if ($classReflection->isSubclassOf($safeType)) { return true; } // skip self too - if ($classReflection->getName() === $safeType) { + if ($classReflectionName === $safeType) { return true; } } @@ -262,7 +258,7 @@ private function isSafeType(ClassReflection $classReflection, ClassMethod $class } // skip self too - if ($classReflection->getName() === $safeType) { + if ($classReflectionName === $safeType) { return true; } } diff --git a/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.php b/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.php index 75df1aa988..06676de5a1 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.php +++ b/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.php @@ -8,14 +8,14 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\NodeNameResolver\NodeNameResolver; +use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Symfony\Contracts\Service\Attribute\Required; final class AutowiredClassMethodOrPropertyAnalyzer { public function __construct( private PhpDocInfoFactory $phpDocInfoFactory, - private NodeNameResolver $nodeNameResolver + private PhpAttributeAnalyzer $phpAttributeAnalyzer ) { } @@ -26,17 +26,6 @@ public function detect(ClassMethod | Param | Property $node): bool return true; } - foreach ($node->attrGroups as $attrGroup) { - foreach ($attrGroup->attrs as $attribute) { - if ($this->nodeNameResolver->isNames( - $attribute->name, - [Required::class, 'Nette\DI\Attributes\Inject'] - )) { - return true; - } - } - } - - return false; + return $this->phpAttributeAnalyzer->hasPhpAttributes($node, [Required::class, 'Nette\DI\Attributes\Inject']); } }