diff --git a/src/Rules/Methods/MethodSignatureRule.php b/src/Rules/Methods/MethodSignatureRule.php index 4f410a7b321..5d0cafb6024 100644 --- a/src/Rules/Methods/MethodSignatureRule.php +++ b/src/Rules/Methods/MethodSignatureRule.php @@ -94,6 +94,18 @@ public function processNode(Node $node, Scope $scope): array $parentMethodDeclaringClass->getDisplayName(), $parentMethod->getName(), ))->identifier('method.impureOverridePureUnlessCallable')->build(); + } elseif ( + $this->reportMethodPurityOverride + && $method->isPure()->no() + && count($parentMethod->getPureUnlessParameterPassedParameters()) > 0 + ) { + $errors[] = RuleErrorBuilder::message(sprintf( + 'Impure method %s::%s() overrides method %s::%s() marked @pure-unless-parameter-passed.', + $method->getDeclaringClass()->getDisplayName(), + $method->getName(), + $parentMethodDeclaringClass->getDisplayName(), + $parentMethod->getName(), + ))->identifier('method.impureOverridePureUnlessParameterPassed')->build(); } $parentVariants = $parentMethod->getVariants(); diff --git a/tests/PHPStan/Rules/Methods/MethodSignatureRuleTest.php b/tests/PHPStan/Rules/Methods/MethodSignatureRuleTest.php index 109b85fd3c9..f24317d6b61 100644 --- a/tests/PHPStan/Rules/Methods/MethodSignatureRuleTest.php +++ b/tests/PHPStan/Rules/Methods/MethodSignatureRuleTest.php @@ -659,4 +659,21 @@ public function testPureUnlessCallableIsImpureOverride(): void ]); } + public function testPureUnlessParameterPassedOverride(): void + { + $this->reportMaybes = true; + $this->reportStatic = true; + $this->reportMethodPurityOverride = true; + $this->analyse([__DIR__ . '/data/method-signature-pure-unless-parameter-passed.php'], [ + [ + 'Impure method MethodSignaturePureUnlessParameterPassed\ImpureChild::replace() overrides method MethodSignaturePureUnlessParameterPassed\PureUnlessParent::replace() marked @pure-unless-parameter-passed.', + 22, + ], + [ + 'Impure method MethodSignaturePureUnlessParameterPassed\AllMethodsImpureChild::replace() overrides method MethodSignaturePureUnlessParameterPassed\PureUnlessParent::replace() marked @pure-unless-parameter-passed.', + 76, + ], + ]); + } + } diff --git a/tests/PHPStan/Rules/Methods/data/method-signature-pure-unless-parameter-passed.php b/tests/PHPStan/Rules/Methods/data/method-signature-pure-unless-parameter-passed.php new file mode 100644 index 00000000000..600a91a91b9 --- /dev/null +++ b/tests/PHPStan/Rules/Methods/data/method-signature-pure-unless-parameter-passed.php @@ -0,0 +1,84 @@ +