From dfe1a0054cd53c1e7785c5818d7d25743558c0e9 Mon Sep 17 00:00:00 2001 From: Carlos Granados Date: Fri, 10 Jan 2025 15:41:25 +0100 Subject: [PATCH 1/2] Do not report constructor unused parameter if class implements an Interface that defines a constructor --- .../Classes/UnusedConstructorParametersRule.php | 6 ++++++ .../UnusedConstructorParametersRuleTest.php | 5 +++++ tests/PHPStan/Rules/Classes/data/bug-11454.php | 14 ++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 tests/PHPStan/Rules/Classes/data/bug-11454.php diff --git a/src/Rules/Classes/UnusedConstructorParametersRule.php b/src/Rules/Classes/UnusedConstructorParametersRule.php index d87581f69c..23593b7d76 100644 --- a/src/Rules/Classes/UnusedConstructorParametersRule.php +++ b/src/Rules/Classes/UnusedConstructorParametersRule.php @@ -48,6 +48,12 @@ public function processNode(Node $node, Scope $scope): array return []; } + foreach ($node->getClassReflection()->getInterfaces() as $interface) { + if ($interface->hasMethod('__construct')) { + return []; + } + } + $message = sprintf( 'Constructor of class %s has an unused parameter $%%s.', SprintfHelper::escapeFormatString($node->getClassReflection()->getDisplayName()), diff --git a/tests/PHPStan/Rules/Classes/UnusedConstructorParametersRuleTest.php b/tests/PHPStan/Rules/Classes/UnusedConstructorParametersRuleTest.php index cf547b909c..542ba55e5e 100644 --- a/tests/PHPStan/Rules/Classes/UnusedConstructorParametersRuleTest.php +++ b/tests/PHPStan/Rules/Classes/UnusedConstructorParametersRuleTest.php @@ -71,4 +71,9 @@ public function testBug10865(): void $this->analyse([__DIR__ . '/data/bug-10865.php'], []); } + public function testBug11454(): void + { + $this->analyse([__DIR__ . '/data/bug-11454.php'], []); + } + } diff --git a/tests/PHPStan/Rules/Classes/data/bug-11454.php b/tests/PHPStan/Rules/Classes/data/bug-11454.php new file mode 100644 index 0000000000..1a7fe447d1 --- /dev/null +++ b/tests/PHPStan/Rules/Classes/data/bug-11454.php @@ -0,0 +1,14 @@ + Date: Sun, 2 Mar 2025 12:01:25 +0100 Subject: [PATCH 2/2] Use isConstructor and hasConstructor functions --- src/Rules/Classes/UnusedConstructorParametersRule.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Rules/Classes/UnusedConstructorParametersRule.php b/src/Rules/Classes/UnusedConstructorParametersRule.php index 23593b7d76..b29ca65bd4 100644 --- a/src/Rules/Classes/UnusedConstructorParametersRule.php +++ b/src/Rules/Classes/UnusedConstructorParametersRule.php @@ -16,7 +16,6 @@ use function array_values; use function count; use function sprintf; -use function strtolower; /** * @implements Rule @@ -37,7 +36,7 @@ public function processNode(Node $node, Scope $scope): array { $method = $node->getMethodReflection(); $originalNode = $node->getOriginalNode(); - if (strtolower($method->getName()) !== '__construct' || $originalNode->stmts === null) { + if (!$method->isConstructor() || $originalNode->stmts === null) { return []; } @@ -49,7 +48,7 @@ public function processNode(Node $node, Scope $scope): array } foreach ($node->getClassReflection()->getInterfaces() as $interface) { - if ($interface->hasMethod('__construct')) { + if ($interface->hasConstructor()) { return []; } }