From 49df0f87c8cfcfb2f64663d2b19db4c7c565a281 Mon Sep 17 00:00:00 2001 From: Alfred Bez <1001186+alfredbez@users.noreply.github.com> Date: Fri, 16 Oct 2026 13:17:36 +0000 Subject: [PATCH 1/2] [perf] Speed up ChangeMethodVisibilityRector with cheap method name guard before ScopeFetcher --- .../ClassMethod/ChangeMethodVisibilityRector.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php b/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php index 17cf26adcf9..bd83ac7ef78 100644 --- a/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php +++ b/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php @@ -27,6 +27,11 @@ final class ChangeMethodVisibilityRector extends AbstractRector implements Confi */ private array $methodVisibilities = []; + /** + * @var string[] + */ + private array $methodNames = []; + public function __construct( private readonly ParentClassScopeResolver $parentClassScopeResolver, private readonly VisibilityManipulator $visibilityManipulator, @@ -94,6 +99,10 @@ public function refactor(Node $node): ?Node return null; } + if (! $this->isNames($node, $this->methodNames)) { + return null; + } + $scope = ScopeFetcher::fetch($node); $parentClassName = $this->parentClassScopeResolver->resolveParentClassName($scope); if ($parentClassName === null) { @@ -125,5 +134,9 @@ public function configure(array $configuration): void Assert::allIsAOf($configuration, ChangeMethodVisibility::class); $this->methodVisibilities = $configuration; + $this->methodNames = array_map( + static fn (ChangeMethodVisibility $changeMethodVisibility): string => $changeMethodVisibility->getMethod(), + $configuration + ); } } From 6ba0c3d35567fdeb34a4a9560799dac39ab52db0 Mon Sep 17 00:00:00 2001 From: Alfred Bez <1001186+alfredbez@users.noreply.github.com> Date: Sat, 17 Oct 2026 05:53:22 +0000 Subject: [PATCH 2/2] [perf] avoid stateful property on ChangeMethodVisibilityRector --- .../ChangeMethodVisibilityRector.php | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php b/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php index bd83ac7ef78..715e7722e0e 100644 --- a/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php +++ b/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php @@ -27,11 +27,6 @@ final class ChangeMethodVisibilityRector extends AbstractRector implements Confi */ private array $methodVisibilities = []; - /** - * @var string[] - */ - private array $methodNames = []; - public function __construct( private readonly ParentClassScopeResolver $parentClassScopeResolver, private readonly VisibilityManipulator $visibilityManipulator, @@ -99,7 +94,7 @@ public function refactor(Node $node): ?Node return null; } - if (! $this->isNames($node, $this->methodNames)) { + if (! $this->hasMatchingMethodName($node)) { return null; } @@ -134,9 +129,16 @@ public function configure(array $configuration): void Assert::allIsAOf($configuration, ChangeMethodVisibility::class); $this->methodVisibilities = $configuration; - $this->methodNames = array_map( - static fn (ChangeMethodVisibility $changeMethodVisibility): string => $changeMethodVisibility->getMethod(), - $configuration - ); + } + + private function hasMatchingMethodName(ClassMethod $classMethod): bool + { + foreach ($this->methodVisibilities as $methodVisibility) { + if ($this->isName($classMethod, $methodVisibility->getMethod())) { + return true; + } + } + + return false; } }