From 544e56697607ca848a3865409008e840323b8e3a Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 14 Feb 2026 09:54:41 +0100 Subject: [PATCH 1/4] ClassNameCheck: Retrieve extensions just once --- src/Rules/ClassNameCheck.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Rules/ClassNameCheck.php b/src/Rules/ClassNameCheck.php index ba23578483..eae3997bbd 100644 --- a/src/Rules/ClassNameCheck.php +++ b/src/Rules/ClassNameCheck.php @@ -11,6 +11,8 @@ #[AutowiredService] final class ClassNameCheck { + /** @var RestrictedClassNameUsageExtension[] $extensions */ + private array $extensions; public function __construct( private ClassCaseSensitivityCheck $classCaseSensitivityCheck, @@ -19,6 +21,7 @@ public function __construct( private Container $container, ) { + $this->extensions = $this->container->getServicesByTag(RestrictedClassNameUsageExtension::CLASS_NAME_EXTENSION_TAG); } /** @@ -47,9 +50,7 @@ public function checkClassNames( return $errors; } - /** @var RestrictedClassNameUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedClassNameUsageExtension::CLASS_NAME_EXTENSION_TAG); - if ($extensions === []) { + if ($this->extensions === []) { return $errors; } @@ -59,7 +60,7 @@ public function checkClassNames( } $classReflection = $this->reflectionProvider->getClass($pair->getClassName()); - foreach ($extensions as $extension) { + foreach ($this->extensions as $extension) { $restrictedUsage = $extension->isRestrictedClassNameUsage($classReflection, $scope, $location); if ($restrictedUsage === null) { continue; From 8697e20d4bcd518b990afe5074a373adc3603f8b Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 14 Feb 2026 09:59:11 +0100 Subject: [PATCH 2/4] cs --- src/Rules/ClassNameCheck.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Rules/ClassNameCheck.php b/src/Rules/ClassNameCheck.php index eae3997bbd..3585798a47 100644 --- a/src/Rules/ClassNameCheck.php +++ b/src/Rules/ClassNameCheck.php @@ -11,6 +11,7 @@ #[AutowiredService] final class ClassNameCheck { + /** @var RestrictedClassNameUsageExtension[] $extensions */ private array $extensions; From 9b72e371704d7610701bbf2f3cacbe1a6abc8a62 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 14 Feb 2026 10:19:36 +0100 Subject: [PATCH 3/4] lazy property --- src/Rules/ClassNameCheck.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Rules/ClassNameCheck.php b/src/Rules/ClassNameCheck.php index 3585798a47..9328917f5b 100644 --- a/src/Rules/ClassNameCheck.php +++ b/src/Rules/ClassNameCheck.php @@ -13,7 +13,7 @@ final class ClassNameCheck { /** @var RestrictedClassNameUsageExtension[] $extensions */ - private array $extensions; + private ?array $extensions = null; public function __construct( private ClassCaseSensitivityCheck $classCaseSensitivityCheck, @@ -22,7 +22,6 @@ public function __construct( private Container $container, ) { - $this->extensions = $this->container->getServicesByTag(RestrictedClassNameUsageExtension::CLASS_NAME_EXTENSION_TAG); } /** @@ -51,7 +50,8 @@ public function checkClassNames( return $errors; } - if ($this->extensions === []) { + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedClassNameUsageExtension::CLASS_NAME_EXTENSION_TAG); + if ($extensions === []) { return $errors; } @@ -61,7 +61,7 @@ public function checkClassNames( } $classReflection = $this->reflectionProvider->getClass($pair->getClassName()); - foreach ($this->extensions as $extension) { + foreach ($extensions as $extension) { $restrictedUsage = $extension->isRestrictedClassNameUsage($classReflection, $scope, $location); if ($restrictedUsage === null) { continue; From 6ab60b541c2c2d01e454ee019c49d0d257c233be Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 15 Feb 2026 08:40:05 +0100 Subject: [PATCH 4/4] same fix Restricted*Rule --- .../RestrictedUsage/RestrictedClassConstantUsageRule.php | 6 ++++-- .../RestrictedUsage/RestrictedFunctionCallableUsageRule.php | 6 ++++-- src/Rules/RestrictedUsage/RestrictedFunctionUsageRule.php | 6 ++++-- .../RestrictedUsage/RestrictedMethodCallableUsageRule.php | 6 ++++-- src/Rules/RestrictedUsage/RestrictedMethodUsageRule.php | 6 ++++-- src/Rules/RestrictedUsage/RestrictedPropertyUsageRule.php | 6 ++++-- .../RestrictedStaticMethodCallableUsageRule.php | 6 ++++-- .../RestrictedUsage/RestrictedStaticMethodUsageRule.php | 6 ++++-- .../RestrictedUsage/RestrictedStaticPropertyUsageRule.php | 6 ++++-- .../RestrictedUsageOfDeprecatedStringCastRule.php | 6 ++++-- 10 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/Rules/RestrictedUsage/RestrictedClassConstantUsageRule.php b/src/Rules/RestrictedUsage/RestrictedClassConstantUsageRule.php index 8f8ad16229..f283844e8d 100644 --- a/src/Rules/RestrictedUsage/RestrictedClassConstantUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedClassConstantUsageRule.php @@ -22,6 +22,9 @@ final class RestrictedClassConstantUsageRule implements Rule { + /** @var RestrictedClassConstantUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -44,8 +47,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - /** @var RestrictedClassConstantUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedClassConstantUsageExtension::CLASS_CONSTANT_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedClassConstantUsageExtension::CLASS_CONSTANT_EXTENSION_TAG); if ($extensions === []) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedFunctionCallableUsageRule.php b/src/Rules/RestrictedUsage/RestrictedFunctionCallableUsageRule.php index b6840c712f..cc485dc320 100644 --- a/src/Rules/RestrictedUsage/RestrictedFunctionCallableUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedFunctionCallableUsageRule.php @@ -19,6 +19,9 @@ final class RestrictedFunctionCallableUsageRule implements Rule { + /** @var RestrictedFunctionUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -46,8 +49,7 @@ public function processNode(Node $node, Scope $scope): array $functionReflection = $this->reflectionProvider->getFunction($node->getName(), $scope); - /** @var RestrictedFunctionUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedFunctionUsageExtension::FUNCTION_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedFunctionUsageExtension::FUNCTION_EXTENSION_TAG); $errors = []; foreach ($extensions as $extension) { diff --git a/src/Rules/RestrictedUsage/RestrictedFunctionUsageRule.php b/src/Rules/RestrictedUsage/RestrictedFunctionUsageRule.php index 969963ed2b..4fbfe812e5 100644 --- a/src/Rules/RestrictedUsage/RestrictedFunctionUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedFunctionUsageRule.php @@ -18,6 +18,9 @@ final class RestrictedFunctionUsageRule implements Rule { + /** @var RestrictedFunctionUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -45,8 +48,7 @@ public function processNode(Node $node, Scope $scope): array $functionReflection = $this->reflectionProvider->getFunction($node->name, $scope); - /** @var RestrictedFunctionUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedFunctionUsageExtension::FUNCTION_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedFunctionUsageExtension::FUNCTION_EXTENSION_TAG); $errors = []; foreach ($extensions as $extension) { diff --git a/src/Rules/RestrictedUsage/RestrictedMethodCallableUsageRule.php b/src/Rules/RestrictedUsage/RestrictedMethodCallableUsageRule.php index c9f1861b7c..2abd8a8844 100644 --- a/src/Rules/RestrictedUsage/RestrictedMethodCallableUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedMethodCallableUsageRule.php @@ -19,6 +19,9 @@ final class RestrictedMethodCallableUsageRule implements Rule { + /** @var RestrictedMethodUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -40,8 +43,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - /** @var RestrictedMethodUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); if ($extensions === []) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedMethodUsageRule.php b/src/Rules/RestrictedUsage/RestrictedMethodUsageRule.php index 7c1b4fe37c..5e4f192a4c 100644 --- a/src/Rules/RestrictedUsage/RestrictedMethodUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedMethodUsageRule.php @@ -19,6 +19,9 @@ final class RestrictedMethodUsageRule implements Rule { + /** @var RestrictedMethodUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -40,8 +43,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - /** @var RestrictedMethodUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); if ($extensions === []) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedPropertyUsageRule.php b/src/Rules/RestrictedUsage/RestrictedPropertyUsageRule.php index 5136a304ee..5e528e307a 100644 --- a/src/Rules/RestrictedUsage/RestrictedPropertyUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedPropertyUsageRule.php @@ -18,6 +18,9 @@ final class RestrictedPropertyUsageRule implements Rule { + /** @var RestrictedPropertyUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -39,8 +42,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - /** @var RestrictedPropertyUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedPropertyUsageExtension::PROPERTY_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedPropertyUsageExtension::PROPERTY_EXTENSION_TAG); if ($extensions === []) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedStaticMethodCallableUsageRule.php b/src/Rules/RestrictedUsage/RestrictedStaticMethodCallableUsageRule.php index 22230ca299..39c660dd2a 100644 --- a/src/Rules/RestrictedUsage/RestrictedStaticMethodCallableUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedStaticMethodCallableUsageRule.php @@ -23,6 +23,9 @@ final class RestrictedStaticMethodCallableUsageRule implements Rule { + /** @var RestrictedMethodUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -45,8 +48,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - /** @var RestrictedMethodUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); if ($extensions === []) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedStaticMethodUsageRule.php b/src/Rules/RestrictedUsage/RestrictedStaticMethodUsageRule.php index 898075b514..427e9c032b 100644 --- a/src/Rules/RestrictedUsage/RestrictedStaticMethodUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedStaticMethodUsageRule.php @@ -22,6 +22,9 @@ final class RestrictedStaticMethodUsageRule implements Rule { + /** @var RestrictedMethodUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -44,8 +47,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - /** @var RestrictedMethodUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); if ($extensions === []) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedStaticPropertyUsageRule.php b/src/Rules/RestrictedUsage/RestrictedStaticPropertyUsageRule.php index 6361276a20..45b204d225 100644 --- a/src/Rules/RestrictedUsage/RestrictedStaticPropertyUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedStaticPropertyUsageRule.php @@ -22,6 +22,9 @@ final class RestrictedStaticPropertyUsageRule implements Rule { + /** @var RestrictedPropertyUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -44,8 +47,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - /** @var RestrictedPropertyUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedPropertyUsageExtension::PROPERTY_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedPropertyUsageExtension::PROPERTY_EXTENSION_TAG); if ($extensions === []) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedUsageOfDeprecatedStringCastRule.php b/src/Rules/RestrictedUsage/RestrictedUsageOfDeprecatedStringCastRule.php index 006282c94d..87df6dfa83 100644 --- a/src/Rules/RestrictedUsage/RestrictedUsageOfDeprecatedStringCastRule.php +++ b/src/Rules/RestrictedUsage/RestrictedUsageOfDeprecatedStringCastRule.php @@ -18,6 +18,9 @@ final class RestrictedUsageOfDeprecatedStringCastRule implements Rule { + /** @var RestrictedMethodUsageExtension[] $extensions */ + private ?array $extensions = null; + public function __construct( private Container $container, private ReflectionProvider $reflectionProvider, @@ -32,8 +35,7 @@ public function getNodeType(): string public function processNode(Node $node, Scope $scope): array { - /** @var RestrictedMethodUsageExtension[] $extensions */ - $extensions = $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); + $extensions = $this->extensions ??= $this->container->getServicesByTag(RestrictedMethodUsageExtension::METHOD_EXTENSION_TAG); if ($extensions === []) { return []; }