From 0840e69332b6a0fd5ab35223501b3796a3f08597 Mon Sep 17 00:00:00 2001 From: Oleg Zhulnev Date: Mon, 3 May 2021 22:40:21 +0300 Subject: [PATCH] Multiplication mutator should not mutate when return value is integer --- src/Mutator/Arithmetic/Multiplication.php | 23 +++++++++- .../Mutator/Arithmetic/MultiplicationTest.php | 42 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/Mutator/Arithmetic/Multiplication.php b/src/Mutator/Arithmetic/Multiplication.php index b3f65eec8..d787964ee 100644 --- a/src/Mutator/Arithmetic/Multiplication.php +++ b/src/Mutator/Arithmetic/Multiplication.php @@ -39,6 +39,9 @@ use Infection\Mutator\GetMutatorName; use Infection\Mutator\Mutator; use Infection\Mutator\MutatorCategory; +use Infection\PhpParser\Visitor\ParentConnector; +use Infection\PhpParser\Visitor\ReflectionVisitor; +use function is_string; use PhpParser\Node; /** @@ -94,7 +97,25 @@ public function canMutate(Node $node): bool return false; } - return true; + $functionScope = $node->getAttribute(ReflectionVisitor::FUNCTION_SCOPE_KEY); + + if (!$functionScope instanceof Node\Stmt\ClassMethod) { + return true; + } + + $parentNode = ParentConnector::getParent($node); + + if (!$parentNode instanceof Node\Stmt\Return_) { + return true; + } + + $returnType = $functionScope->getReturnType(); + + if ($returnType instanceof Node\Identifier) { + $returnType = $returnType->name; + } + + return !(is_string($returnType) && $returnType === 'int'); } private function isNumericOne(Node $node): bool diff --git a/tests/phpunit/Mutator/Arithmetic/MultiplicationTest.php b/tests/phpunit/Mutator/Arithmetic/MultiplicationTest.php index 4aa62f2dc..04b65db6a 100644 --- a/tests/phpunit/Mutator/Arithmetic/MultiplicationTest.php +++ b/tests/phpunit/Mutator/Arithmetic/MultiplicationTest.php @@ -135,6 +135,48 @@ public function mutationsProvider(): iterable [ + <<<'PHP' + [ + <<<'PHP' +