diff --git a/composer.json b/composer.json index 230a9d1fc79..d92bab2429c 100644 --- a/composer.json +++ b/composer.json @@ -72,7 +72,8 @@ }, "files": [ "src/functions/node_helper.php", - "src/functions/rule_doc_generator_class_aliases.php" + "src/functions/rule_doc_generator_class_aliases.php", + "src/functions/rule_class_aliases.php" ] }, "autoload-dev": { diff --git a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Fixture/fixture2.php.inc b/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Fixture/fixture2.php.inc deleted file mode 100644 index 0c5996d577f..00000000000 --- a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Fixture/fixture2.php.inc +++ /dev/null @@ -1,29 +0,0 @@ - ------ - diff --git a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/ChangeMethodVisibilityRectorTest.php b/rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/ChangeMethodVisibilityRectorTest.php similarity index 88% rename from rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/ChangeMethodVisibilityRectorTest.php rename to rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/ChangeMethodVisibilityRectorTest.php index 8eb0cd90401..c35c6f9f0d6 100644 --- a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/ChangeMethodVisibilityRectorTest.php +++ b/rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/ChangeMethodVisibilityRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Rector\Tests\Visibility\Rector\ClassMethod\ChangeMethodVisibilityRector; +namespace Rector\Tests\Visibility\Rector\Class_\ChangeMethodVisibilityRector; use Iterator; use PHPUnit\Framework\Attributes\DataProvider; diff --git a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Fixture/fixture.php.inc b/rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/Fixture/fixture.php.inc similarity index 53% rename from rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Fixture/fixture.php.inc rename to rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/Fixture/fixture.php.inc index 34a8ba19510..8beee12de15 100644 --- a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Fixture/fixture.php.inc +++ b/rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/Fixture/fixture.php.inc @@ -1,8 +1,8 @@ +----- + diff --git a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Source/ParentObject.php b/rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/Source/ParentObject.php similarity index 74% rename from rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Source/ParentObject.php rename to rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/Source/ParentObject.php index 6f571a1f3b9..75c4f79bc82 100644 --- a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/Source/ParentObject.php +++ b/rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/Source/ParentObject.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Rector\Tests\Visibility\Rector\ClassMethod\ChangeMethodVisibilityRector\Source; +namespace Rector\Tests\Visibility\Rector\Class_\ChangeMethodVisibilityRector\Source; class ParentObject { diff --git a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/config/configured_rule.php b/rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/config/configured_rule.php similarity index 81% rename from rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/config/configured_rule.php rename to rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/config/configured_rule.php index 06c17798cb0..8f3c281a9e3 100644 --- a/rules-tests/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector/config/configured_rule.php +++ b/rules-tests/Visibility/Rector/Class_/ChangeMethodVisibilityRector/config/configured_rule.php @@ -3,9 +3,9 @@ declare(strict_types=1); use Rector\Config\RectorConfig; -use Rector\Tests\Visibility\Rector\ClassMethod\ChangeMethodVisibilityRector\Source\ParentObject; +use Rector\Tests\Visibility\Rector\Class_\ChangeMethodVisibilityRector\Source\ParentObject; use Rector\ValueObject\Visibility; -use Rector\Visibility\Rector\ClassMethod\ChangeMethodVisibilityRector; +use Rector\Visibility\Rector\Class_\ChangeMethodVisibilityRector; use Rector\Visibility\ValueObject\ChangeMethodVisibility; return static function (RectorConfig $rectorConfig): void { diff --git a/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php b/rules/Visibility/Rector/Class_/ChangeMethodVisibilityRector.php similarity index 61% rename from rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php rename to rules/Visibility/Rector/Class_/ChangeMethodVisibilityRector.php index b2b8668627d..7a0451e392d 100644 --- a/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php +++ b/rules/Visibility/Rector/Class_/ChangeMethodVisibilityRector.php @@ -2,13 +2,12 @@ declare(strict_types=1); -namespace Rector\Visibility\Rector\ClassMethod; +namespace Rector\Visibility\Rector\Class_; use PhpParser\Node; -use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\Class_; +use PHPStan\Reflection\ClassReflection; use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver; -use Rector\PHPStan\ScopeFetcher; use Rector\Privatization\NodeManipulator\VisibilityManipulator; use Rector\Rector\AbstractRector; use Rector\RuleDoc\CodeSample\ConfiguredCodeSample; @@ -18,7 +17,7 @@ use Webmozart\Assert\Assert; /** - * @see \Rector\Tests\Visibility\Rector\ClassMethod\ChangeMethodVisibilityRector\ChangeMethodVisibilityRectorTest + * @see \Rector\Tests\Visibility\Rector\Class_\ChangeMethodVisibilityRector\ChangeMethodVisibilityRectorTest */ final class ChangeMethodVisibilityRector extends AbstractRector implements ConfigurableRectorInterface { @@ -28,7 +27,6 @@ final class ChangeMethodVisibilityRector extends AbstractRector implements Confi private array $methodVisibilities = []; public function __construct( - private readonly ParentClassScopeResolver $parentClassScopeResolver, private readonly VisibilityManipulator $visibilityManipulator, ) { } @@ -82,11 +80,11 @@ protected function someMethod() */ public function getNodeTypes(): array { - return [ClassMethod::class]; + return [Class_::class]; } /** - * @param ClassMethod $node + * @param Class_ $node */ public function refactor(Node $node): ?Node { @@ -94,31 +92,39 @@ public function refactor(Node $node): ?Node return null; } - if (! $this->hasMatchingMethodName($node)) { + $classReflection = $this->getClassReflection($node); + if (! $classReflection instanceof ClassReflection) { return null; } - $scope = ScopeFetcher::fetch($node); - $parentClassName = $this->parentClassScopeResolver->resolveParentClassName($scope); - if ($parentClassName === null) { + $parentClassReflection = $classReflection->getParentClass(); + if (! $parentClassReflection instanceof ClassReflection) { return null; } - foreach ($this->methodVisibilities as $methodVisibility) { - if ($methodVisibility->getClass() !== $parentClassName) { - continue; - } + $parentClassName = $parentClassReflection->getName(); - if (! $this->isName($node, $methodVisibility->getMethod())) { - continue; - } + $hasChanged = false; + foreach ($node->getMethods() as $classMethod) { + foreach ($this->methodVisibilities as $methodVisibility) { + if ($methodVisibility->getClass() !== $parentClassName) { + continue; + } - $this->visibilityManipulator->changeNodeVisibility($node, $methodVisibility->getVisibility()); + if (! $this->isName($classMethod, $methodVisibility->getMethod())) { + continue; + } - return $node; + $this->visibilityManipulator->changeNodeVisibility($classMethod, $methodVisibility->getVisibility()); + $hasChanged = true; + } } - return null; + if (! $hasChanged) { + return null; + } + + return $node; } /** @@ -130,9 +136,4 @@ public function configure(array $configuration): void $this->methodVisibilities = $configuration; } - - private function hasMatchingMethodName(ClassMethod $classMethod): bool - { - return array_any($this->methodVisibilities, fn (ChangeMethodVisibility $methodVisibility): bool => $this->isName($classMethod, $methodVisibility->getMethod())); - } } diff --git a/src/NodeCollector/ScopeResolver/ParentClassScopeResolver.php b/src/NodeCollector/ScopeResolver/ParentClassScopeResolver.php index d02bc1643d7..78237657e9b 100644 --- a/src/NodeCollector/ScopeResolver/ParentClassScopeResolver.php +++ b/src/NodeCollector/ScopeResolver/ParentClassScopeResolver.php @@ -9,16 +9,6 @@ final class ParentClassScopeResolver { - public function resolveParentClassName(Scope $scope): ?string - { - $parentClassReflection = $this->resolveParentClassReflection($scope); - if (! $parentClassReflection instanceof ClassReflection) { - return null; - } - - return $parentClassReflection->getName(); - } - public function resolveParentClassReflection(Scope $scope): ?ClassReflection { $classReflection = $scope->getClassReflection(); diff --git a/src/functions/rule_class_aliases.php b/src/functions/rule_class_aliases.php new file mode 100644 index 00000000000..9e5338a8f0d --- /dev/null +++ b/src/functions/rule_class_aliases.php @@ -0,0 +1,21 @@ + 'Rector\Visibility\Rector\ClassMethod\ChangeMethodVisibilityRector', + RemoveParentDelegatingClassMethodRector::class => 'Rector\DeadCode\Rector\ClassMethod\RemoveParentDelegatingClassMethodRector', + ReturnTypeFromMockObjectRector::class => 'Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromMockObjectRector', + AddVoidReturnTypeWhereNoReturnRector::class => 'Rector\TypeDeclaration\Rector\ClassMethod\AddVoidReturnTypeWhereNoReturnRector', +]; + +foreach ($ruleClassAliases as $currentClass => $legacyClass) { + class_alias($currentClass, $legacyClass); +}