From f97bd059cb155c273b634b6ea90b95dac0796705 Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Mon, 10 Feb 2020 00:42:35 +0100 Subject: [PATCH] remove duplicated method --- .../AbstractNodeVendorLockResolver.php | 18 ++++++++---- .../ClassMethodParamVendorLockResolver.php | 28 ++----------------- .../ClassMethodVendorLockResolver.php | 8 ++---- .../vendor-locker/src/VendorLockResolver.php | 8 ------ 4 files changed, 17 insertions(+), 45 deletions(-) diff --git a/packages/vendor-locker/src/NodeVendorLocker/AbstractNodeVendorLockResolver.php b/packages/vendor-locker/src/NodeVendorLocker/AbstractNodeVendorLockResolver.php index a1d00e16d62..a6b19805647 100644 --- a/packages/vendor-locker/src/NodeVendorLocker/AbstractNodeVendorLockResolver.php +++ b/packages/vendor-locker/src/NodeVendorLocker/AbstractNodeVendorLockResolver.php @@ -62,12 +62,7 @@ abstract class AbstractNodeVendorLockResolver $interfaceNames = $this->classManipulator->getClassLikeNodeParentInterfaceNames($classLike); foreach ($interfaceNames as $interfaceName) { - if (! interface_exists($interfaceName)) { - continue; - } - - $interfaceMethods = get_class_methods($interfaceName); - if (! in_array($methodName, $interfaceMethods, true)) { + if (! $this->hasInterfaceMethod($methodName, $interfaceName)) { continue; } @@ -76,4 +71,15 @@ abstract class AbstractNodeVendorLockResolver return false; } + + private function hasInterfaceMethod(string $methodName, string $interfaceName): bool + { + if (! interface_exists($interfaceName)) { + return false; + } + + $interfaceMethods = get_class_methods($interfaceName); + + return in_array($methodName, $interfaceMethods, true); + } } diff --git a/packages/vendor-locker/src/NodeVendorLocker/ClassMethodParamVendorLockResolver.php b/packages/vendor-locker/src/NodeVendorLocker/ClassMethodParamVendorLockResolver.php index 2a6f83a3795..ec326754d12 100644 --- a/packages/vendor-locker/src/NodeVendorLocker/ClassMethodParamVendorLockResolver.php +++ b/packages/vendor-locker/src/NodeVendorLocker/ClassMethodParamVendorLockResolver.php @@ -7,7 +7,6 @@ namespace Rector\VendorLocker\NodeVendorLocker; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Interface_; -use Rector\Core\Exception\ShouldNotHappenException; use Rector\NodeTypeResolver\Node\AttributeKey; final class ClassMethodParamVendorLockResolver extends AbstractNodeVendorLockResolver @@ -24,10 +23,8 @@ final class ClassMethodParamVendorLockResolver extends AbstractNodeVendorLockRes return false; } + /** @var string $methodName */ $methodName = $this->nodeNameResolver->getName($classMethod); - if (! is_string($methodName)) { - throw new ShouldNotHappenException(); - } // @todo extract to some "inherited parent method" service /** @var string|null $parentClassName */ @@ -45,8 +42,7 @@ final class ClassMethodParamVendorLockResolver extends AbstractNodeVendorLockRes return false; } - $interfaceNames = $this->classManipulator->getClassLikeNodeParentInterfaceNames($classNode); - return $this->isInterfaceParamVendorLockin($interfaceNames, $methodName); + return $this->isMethodVendorLockedByInterface($classNode, $methodName); } private function isParentClassVendorLocking(int $paramPosition, string $parentClassName, string $methodName): ?bool @@ -74,24 +70,4 @@ final class ClassMethodParamVendorLockResolver extends AbstractNodeVendorLockRes return null; } - - private function isInterfaceParamVendorLockin(array $interfaceNames, string $methodName): bool - { - foreach ($interfaceNames as $interfaceName) { - $interface = $this->parsedNodeCollector->findInterface($interfaceName); - // parent class method in local scope → it's ok - // @todo validate type is conflicting - if ($interface !== null && $interface->getMethod($methodName) !== null) { - return false; - } - - if (method_exists($interfaceName, $methodName)) { - // parent class method in external scope → it's not ok - // @todo validate type is conflicting - return true; - } - } - - return false; - } } diff --git a/packages/vendor-locker/src/NodeVendorLocker/ClassMethodVendorLockResolver.php b/packages/vendor-locker/src/NodeVendorLocker/ClassMethodVendorLockResolver.php index 460d65ac047..b53b2fb5aec 100644 --- a/packages/vendor-locker/src/NodeVendorLocker/ClassMethodVendorLockResolver.php +++ b/packages/vendor-locker/src/NodeVendorLocker/ClassMethodVendorLockResolver.php @@ -6,7 +6,7 @@ namespace Rector\VendorLocker\NodeVendorLocker; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use Rector\Core\Exception\ShouldNotHappenException; +use PhpParser\Node\Stmt\Interface_; use Rector\NodeTypeResolver\Node\AttributeKey; use ReflectionClass; @@ -22,12 +22,10 @@ final class ClassMethodVendorLockResolver extends AbstractNodeVendorLockResolver */ public function isRemovalVendorLocked(ClassMethod $classMethod): bool { + /** @var string $classMethodName */ $classMethodName = $this->nodeNameResolver->getName($classMethod); - if (! is_string($classMethodName)) { - throw new ShouldNotHappenException(); - } - /** @var Class_|null $class */ + /** @var Class_|Interface_|null $class */ $class = $classMethod->getAttribute(AttributeKey::CLASS_NODE); if ($class === null) { return false; diff --git a/packages/vendor-locker/src/VendorLockResolver.php b/packages/vendor-locker/src/VendorLockResolver.php index 19726dbe42c..08ce89bdc96 100644 --- a/packages/vendor-locker/src/VendorLockResolver.php +++ b/packages/vendor-locker/src/VendorLockResolver.php @@ -60,14 +60,6 @@ final class VendorLockResolver return $this->propertyVendorLockResolver->isVendorLocked($property); } - /** - * Checks for: - * - interface required methods - * - abstract classes reqired method - * - * Prevent: - * - removing class methods, that breaks the code - */ public function isClassMethodRemovalVendorLocked(ClassMethod $classMethod): bool { return $this->classMethodVendorLockResolver->isRemovalVendorLocked($classMethod);