diff --git a/resources/schema.json b/resources/schema.json index b24c4f14ac..f989ecf6a9 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -90,7 +90,33 @@ }, "mutators": { "type": "object", - "description": "Contains the settings for different mutations and profiles" + "description": "Contains the settings for different mutations and profiles", + "properties": { + "TrueValue": { + "type": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": {"type": "array", "items": {"type": "string"}}, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "in_array": {"type": "boolean"}, + "array_search": {"type": "boolean"} + } + } + } + } + ] + } + } + } }, "testFramework": { "type": "string", diff --git a/src/Mutator/Arithmetic/Assignment.php b/src/Mutator/Arithmetic/Assignment.php index e27c79891b..bb86ea29b6 100644 --- a/src/Mutator/Arithmetic/Assignment.php +++ b/src/Mutator/Arithmetic/Assignment.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\Assign($node->var, $node->expr, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\AssignOp; } diff --git a/src/Mutator/Arithmetic/AssignmentEqual.php b/src/Mutator/Arithmetic/AssignmentEqual.php index 5d45828d37..6faefff107 100644 --- a/src/Mutator/Arithmetic/AssignmentEqual.php +++ b/src/Mutator/Arithmetic/AssignmentEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\Assign($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Equal && $node->left instanceof Node\Expr\Variable; } diff --git a/src/Mutator/Arithmetic/BitwiseAnd.php b/src/Mutator/Arithmetic/BitwiseAnd.php index 41e85ec192..6f479714b0 100644 --- a/src/Mutator/Arithmetic/BitwiseAnd.php +++ b/src/Mutator/Arithmetic/BitwiseAnd.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\BitwiseOr($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\BitwiseAnd; } diff --git a/src/Mutator/Arithmetic/BitwiseNot.php b/src/Mutator/Arithmetic/BitwiseNot.php index 13e3d09003..886bbfe87a 100644 --- a/src/Mutator/Arithmetic/BitwiseNot.php +++ b/src/Mutator/Arithmetic/BitwiseNot.php @@ -51,7 +51,7 @@ public function mutate(Node $node) return $node->expr; } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BitwiseNot; } diff --git a/src/Mutator/Arithmetic/BitwiseOr.php b/src/Mutator/Arithmetic/BitwiseOr.php index b2432761d6..21e2ce3101 100644 --- a/src/Mutator/Arithmetic/BitwiseOr.php +++ b/src/Mutator/Arithmetic/BitwiseOr.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\BitwiseAnd($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\BitwiseOr; } diff --git a/src/Mutator/Arithmetic/BitwiseXor.php b/src/Mutator/Arithmetic/BitwiseXor.php index 88bfc3291d..4008c69712 100644 --- a/src/Mutator/Arithmetic/BitwiseXor.php +++ b/src/Mutator/Arithmetic/BitwiseXor.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\BitwiseAnd($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\BitwiseXor; } diff --git a/src/Mutator/Arithmetic/Decrement.php b/src/Mutator/Arithmetic/Decrement.php index 88bc60b73c..f5cb7bca3e 100644 --- a/src/Mutator/Arithmetic/Decrement.php +++ b/src/Mutator/Arithmetic/Decrement.php @@ -64,7 +64,7 @@ public function mutate(Node $node) } } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof PreDec || $node instanceof PostDec; } diff --git a/src/Mutator/Arithmetic/DivEqual.php b/src/Mutator/Arithmetic/DivEqual.php index 37f947b8e8..b655044dee 100644 --- a/src/Mutator/Arithmetic/DivEqual.php +++ b/src/Mutator/Arithmetic/DivEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\AssignOp\Mul($node->var, $node->expr, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\AssignOp\Div; } diff --git a/src/Mutator/Arithmetic/Division.php b/src/Mutator/Arithmetic/Division.php index fe77a923a7..cf909de20d 100644 --- a/src/Mutator/Arithmetic/Division.php +++ b/src/Mutator/Arithmetic/Division.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Mul($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Div; } diff --git a/src/Mutator/Arithmetic/Exponentiation.php b/src/Mutator/Arithmetic/Exponentiation.php index 27f7b78cd7..9c2751c654 100644 --- a/src/Mutator/Arithmetic/Exponentiation.php +++ b/src/Mutator/Arithmetic/Exponentiation.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Div($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Pow; } diff --git a/src/Mutator/Arithmetic/Increment.php b/src/Mutator/Arithmetic/Increment.php index 83902e057d..fa346bbd9f 100644 --- a/src/Mutator/Arithmetic/Increment.php +++ b/src/Mutator/Arithmetic/Increment.php @@ -64,7 +64,7 @@ public function mutate(Node $node) } } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof PreInc || $node instanceof PostInc; } diff --git a/src/Mutator/Arithmetic/Minus.php b/src/Mutator/Arithmetic/Minus.php index 4941b791c6..db6369d2b8 100644 --- a/src/Mutator/Arithmetic/Minus.php +++ b/src/Mutator/Arithmetic/Minus.php @@ -53,7 +53,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Plus($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Minus; } diff --git a/src/Mutator/Arithmetic/MinusEqual.php b/src/Mutator/Arithmetic/MinusEqual.php index 625d1a8083..d5cde0a22d 100644 --- a/src/Mutator/Arithmetic/MinusEqual.php +++ b/src/Mutator/Arithmetic/MinusEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\AssignOp\Plus($node->var, $node->expr, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\AssignOp\Minus; } diff --git a/src/Mutator/Arithmetic/ModEqual.php b/src/Mutator/Arithmetic/ModEqual.php index 76f33438fb..45be104e15 100644 --- a/src/Mutator/Arithmetic/ModEqual.php +++ b/src/Mutator/Arithmetic/ModEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\AssignOp\Mul($node->var, $node->expr, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\AssignOp\Mod; } diff --git a/src/Mutator/Arithmetic/Modulus.php b/src/Mutator/Arithmetic/Modulus.php index ab607e398f..4a25501857 100644 --- a/src/Mutator/Arithmetic/Modulus.php +++ b/src/Mutator/Arithmetic/Modulus.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Mul($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Mod; } diff --git a/src/Mutator/Arithmetic/MulEqual.php b/src/Mutator/Arithmetic/MulEqual.php index 9d28c68a5c..33e8479e67 100644 --- a/src/Mutator/Arithmetic/MulEqual.php +++ b/src/Mutator/Arithmetic/MulEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\AssignOp\Div($node->var, $node->expr, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\AssignOp\Mul; } diff --git a/src/Mutator/Arithmetic/Multiplication.php b/src/Mutator/Arithmetic/Multiplication.php index 4557041fef..e918cb9971 100644 --- a/src/Mutator/Arithmetic/Multiplication.php +++ b/src/Mutator/Arithmetic/Multiplication.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Div($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Mul; } diff --git a/src/Mutator/Arithmetic/Plus.php b/src/Mutator/Arithmetic/Plus.php index ba24ae5599..15ce112e3d 100644 --- a/src/Mutator/Arithmetic/Plus.php +++ b/src/Mutator/Arithmetic/Plus.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Minus($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!($node instanceof Node\Expr\BinaryOp\Plus)) { return false; diff --git a/src/Mutator/Arithmetic/PlusEqual.php b/src/Mutator/Arithmetic/PlusEqual.php index ede092f13a..4158961779 100644 --- a/src/Mutator/Arithmetic/PlusEqual.php +++ b/src/Mutator/Arithmetic/PlusEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\AssignOp\Minus($node->var, $node->expr, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\AssignOp\Plus; } diff --git a/src/Mutator/Arithmetic/PowEqual.php b/src/Mutator/Arithmetic/PowEqual.php index 929c1148d9..929772640a 100644 --- a/src/Mutator/Arithmetic/PowEqual.php +++ b/src/Mutator/Arithmetic/PowEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\AssignOp\Div($node->var, $node->expr, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\AssignOp\Pow; } diff --git a/src/Mutator/Arithmetic/RoundingFamily.php b/src/Mutator/Arithmetic/RoundingFamily.php index d9ed2647ee..7e067ba1a9 100644 --- a/src/Mutator/Arithmetic/RoundingFamily.php +++ b/src/Mutator/Arithmetic/RoundingFamily.php @@ -74,7 +74,7 @@ public function mutate(Node $node) } } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Expr\FuncCall) { return false; diff --git a/src/Mutator/Arithmetic/ShiftLeft.php b/src/Mutator/Arithmetic/ShiftLeft.php index 4510e9ac9a..cdcb5f1099 100644 --- a/src/Mutator/Arithmetic/ShiftLeft.php +++ b/src/Mutator/Arithmetic/ShiftLeft.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\ShiftRight($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\ShiftLeft; } diff --git a/src/Mutator/Arithmetic/ShiftRight.php b/src/Mutator/Arithmetic/ShiftRight.php index bd67d9e30b..cdfabd5efe 100644 --- a/src/Mutator/Arithmetic/ShiftRight.php +++ b/src/Mutator/Arithmetic/ShiftRight.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\ShiftLeft($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\ShiftRight; } diff --git a/src/Mutator/Boolean/ArrayItem.php b/src/Mutator/Boolean/ArrayItem.php index 8ef9678245..7991b0bdb7 100644 --- a/src/Mutator/Boolean/ArrayItem.php +++ b/src/Mutator/Boolean/ArrayItem.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Greater($node->key, $node->value, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\ArrayItem && $node->key && ($this->isNodeWithSideEffects($node->value) || $this->isNodeWithSideEffects($node->key)); } diff --git a/src/Mutator/Boolean/EqualIdentical.php b/src/Mutator/Boolean/EqualIdentical.php index 162ddfab5f..b8ad4ba4d2 100644 --- a/src/Mutator/Boolean/EqualIdentical.php +++ b/src/Mutator/Boolean/EqualIdentical.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Identical($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Equal; } diff --git a/src/Mutator/Boolean/FalseValue.php b/src/Mutator/Boolean/FalseValue.php index 1be8949823..a3b48172c0 100644 --- a/src/Mutator/Boolean/FalseValue.php +++ b/src/Mutator/Boolean/FalseValue.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\ConstFetch(new Node\Name('true')); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!($node instanceof Node\Expr\ConstFetch)) { return false; diff --git a/src/Mutator/Boolean/IdenticalEqual.php b/src/Mutator/Boolean/IdenticalEqual.php index 635b9c2f14..324a4d354c 100644 --- a/src/Mutator/Boolean/IdenticalEqual.php +++ b/src/Mutator/Boolean/IdenticalEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Equal($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Identical; } diff --git a/src/Mutator/Boolean/LogicalAnd.php b/src/Mutator/Boolean/LogicalAnd.php index c90e2c897a..9357168f90 100644 --- a/src/Mutator/Boolean/LogicalAnd.php +++ b/src/Mutator/Boolean/LogicalAnd.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\BooleanOr($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\BooleanAnd; } diff --git a/src/Mutator/Boolean/LogicalLowerAnd.php b/src/Mutator/Boolean/LogicalLowerAnd.php index 88e679b0b0..bf53268a58 100644 --- a/src/Mutator/Boolean/LogicalLowerAnd.php +++ b/src/Mutator/Boolean/LogicalLowerAnd.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\LogicalOr($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\LogicalAnd; } diff --git a/src/Mutator/Boolean/LogicalLowerOr.php b/src/Mutator/Boolean/LogicalLowerOr.php index f4f23f1e4f..623cdb8fe4 100644 --- a/src/Mutator/Boolean/LogicalLowerOr.php +++ b/src/Mutator/Boolean/LogicalLowerOr.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\LogicalAnd($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\LogicalOr; } diff --git a/src/Mutator/Boolean/LogicalNot.php b/src/Mutator/Boolean/LogicalNot.php index 57fb7bb5a1..4bbaaa8055 100644 --- a/src/Mutator/Boolean/LogicalNot.php +++ b/src/Mutator/Boolean/LogicalNot.php @@ -51,7 +51,7 @@ public function mutate(Node $node) return $node->expr; } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!($node instanceof Node\Expr\BooleanNot)) { return false; diff --git a/src/Mutator/Boolean/LogicalOr.php b/src/Mutator/Boolean/LogicalOr.php index eb61a921e4..bd4ff99092 100644 --- a/src/Mutator/Boolean/LogicalOr.php +++ b/src/Mutator/Boolean/LogicalOr.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\BooleanAnd($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\BooleanOr; } diff --git a/src/Mutator/Boolean/NotEqualNotIdentical.php b/src/Mutator/Boolean/NotEqualNotIdentical.php index 911cbbb018..ce1cbd4762 100644 --- a/src/Mutator/Boolean/NotEqualNotIdentical.php +++ b/src/Mutator/Boolean/NotEqualNotIdentical.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\NotIdentical($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\NotEqual; } diff --git a/src/Mutator/Boolean/NotIdenticalNotEqual.php b/src/Mutator/Boolean/NotIdenticalNotEqual.php index 5c211c148a..97bc0cd639 100644 --- a/src/Mutator/Boolean/NotIdenticalNotEqual.php +++ b/src/Mutator/Boolean/NotIdenticalNotEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\NotEqual($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\NotIdentical; } diff --git a/src/Mutator/Boolean/TrueValue.php b/src/Mutator/Boolean/TrueValue.php index 75c2dbe8ef..fc28b0b272 100644 --- a/src/Mutator/Boolean/TrueValue.php +++ b/src/Mutator/Boolean/TrueValue.php @@ -36,6 +36,7 @@ namespace Infection\Mutator\Boolean; use Infection\Mutator\Util\Mutator; +use Infection\Visitor\ParentConnectorVisitor; use PhpParser\Node; /** @@ -43,6 +44,11 @@ */ final class TrueValue extends Mutator { + private const DEFAULT_SETTINGS = [ + 'in_array' => false, + 'array_search' => false, + ]; + /** * Replaces "true" with "false" * @@ -54,12 +60,29 @@ public function mutate(Node $node) return new Node\Expr\ConstFetch(new Node\Name('false')); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!($node instanceof Node\Expr\ConstFetch)) { return false; } - return $node->name->toLowerString() === 'true'; + if ($node->name->toLowerString() !== 'true') { + return false; + } + + $parentNode = $node->getAttribute(ParentConnectorVisitor::PARENT_KEY); + $grandParentNode = $parentNode !== null ? $parentNode->getAttribute(ParentConnectorVisitor::PARENT_KEY) : null; + + if ($grandParentNode instanceof Node\Expr\FuncCall) { + $resultSettings = array_merge(self::DEFAULT_SETTINGS, $mutatorSettings); + + $functionName = $grandParentNode->name->toLowerString(); + + if (array_key_exists($functionName, $resultSettings) && $resultSettings[$functionName] === false) { + return false; + } + } + + return true; } } diff --git a/src/Mutator/Boolean/Yield_.php b/src/Mutator/Boolean/Yield_.php index 9897bdf01e..a6fc5b7d3e 100644 --- a/src/Mutator/Boolean/Yield_.php +++ b/src/Mutator/Boolean/Yield_.php @@ -57,7 +57,7 @@ public function mutate(Node $node) return $node; } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\Yield_ && $node->key; } diff --git a/src/Mutator/Cast/CastArray.php b/src/Mutator/Cast/CastArray.php index 10bbe11cf2..23947079d6 100644 --- a/src/Mutator/Cast/CastArray.php +++ b/src/Mutator/Cast/CastArray.php @@ -42,7 +42,7 @@ */ final class CastArray extends AbstractCastMutator { - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\Cast\Array_; } diff --git a/src/Mutator/Cast/CastBool.php b/src/Mutator/Cast/CastBool.php index 9ad3fd062e..dd3b872c85 100644 --- a/src/Mutator/Cast/CastBool.php +++ b/src/Mutator/Cast/CastBool.php @@ -42,7 +42,7 @@ */ final class CastBool extends AbstractCastMutator { - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\Cast\Bool_; } diff --git a/src/Mutator/Cast/CastFloat.php b/src/Mutator/Cast/CastFloat.php index a03056e68b..5fa887674d 100644 --- a/src/Mutator/Cast/CastFloat.php +++ b/src/Mutator/Cast/CastFloat.php @@ -42,7 +42,7 @@ */ final class CastFloat extends AbstractCastMutator { - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\Cast\Double; } diff --git a/src/Mutator/Cast/CastInt.php b/src/Mutator/Cast/CastInt.php index 567a9c6854..944f02077d 100644 --- a/src/Mutator/Cast/CastInt.php +++ b/src/Mutator/Cast/CastInt.php @@ -42,7 +42,7 @@ */ final class CastInt extends AbstractCastMutator { - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\Cast\Int_; } diff --git a/src/Mutator/Cast/CastObject.php b/src/Mutator/Cast/CastObject.php index 49287945fe..dba1dc162a 100644 --- a/src/Mutator/Cast/CastObject.php +++ b/src/Mutator/Cast/CastObject.php @@ -42,7 +42,7 @@ */ final class CastObject extends AbstractCastMutator { - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\Cast\Object_; } diff --git a/src/Mutator/Cast/CastString.php b/src/Mutator/Cast/CastString.php index 50e31b0db9..fc8d5ec381 100644 --- a/src/Mutator/Cast/CastString.php +++ b/src/Mutator/Cast/CastString.php @@ -42,7 +42,7 @@ */ final class CastString extends AbstractCastMutator { - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\Cast\String_; } diff --git a/src/Mutator/ConditionalBoundary/GreaterThan.php b/src/Mutator/ConditionalBoundary/GreaterThan.php index 4dfeaff83a..9a874190df 100644 --- a/src/Mutator/ConditionalBoundary/GreaterThan.php +++ b/src/Mutator/ConditionalBoundary/GreaterThan.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\GreaterOrEqual($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Greater; } diff --git a/src/Mutator/ConditionalBoundary/GreaterThanOrEqualTo.php b/src/Mutator/ConditionalBoundary/GreaterThanOrEqualTo.php index b347624057..660c51eb4d 100644 --- a/src/Mutator/ConditionalBoundary/GreaterThanOrEqualTo.php +++ b/src/Mutator/ConditionalBoundary/GreaterThanOrEqualTo.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Greater($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\GreaterOrEqual; } diff --git a/src/Mutator/ConditionalBoundary/LessThan.php b/src/Mutator/ConditionalBoundary/LessThan.php index d1f8650285..486a722d23 100644 --- a/src/Mutator/ConditionalBoundary/LessThan.php +++ b/src/Mutator/ConditionalBoundary/LessThan.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\SmallerOrEqual($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Smaller; } diff --git a/src/Mutator/ConditionalBoundary/LessThanOrEqualTo.php b/src/Mutator/ConditionalBoundary/LessThanOrEqualTo.php index e561aa8d85..7cd0e2d875 100644 --- a/src/Mutator/ConditionalBoundary/LessThanOrEqualTo.php +++ b/src/Mutator/ConditionalBoundary/LessThanOrEqualTo.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Smaller($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\SmallerOrEqual; } diff --git a/src/Mutator/ConditionalNegotiation/Equal.php b/src/Mutator/ConditionalNegotiation/Equal.php index 32691bbdf2..e9b1eddace 100644 --- a/src/Mutator/ConditionalNegotiation/Equal.php +++ b/src/Mutator/ConditionalNegotiation/Equal.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\NotEqual($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Equal; } diff --git a/src/Mutator/ConditionalNegotiation/GreaterThanNegotiation.php b/src/Mutator/ConditionalNegotiation/GreaterThanNegotiation.php index 7cfec98a55..d64519a8ba 100644 --- a/src/Mutator/ConditionalNegotiation/GreaterThanNegotiation.php +++ b/src/Mutator/ConditionalNegotiation/GreaterThanNegotiation.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\SmallerOrEqual($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Greater; } diff --git a/src/Mutator/ConditionalNegotiation/GreaterThanOrEqualToNegotiation.php b/src/Mutator/ConditionalNegotiation/GreaterThanOrEqualToNegotiation.php index f86a65068b..bb7646ea1a 100644 --- a/src/Mutator/ConditionalNegotiation/GreaterThanOrEqualToNegotiation.php +++ b/src/Mutator/ConditionalNegotiation/GreaterThanOrEqualToNegotiation.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Smaller($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\GreaterOrEqual; } diff --git a/src/Mutator/ConditionalNegotiation/Identical.php b/src/Mutator/ConditionalNegotiation/Identical.php index df3d23473b..f838b42402 100644 --- a/src/Mutator/ConditionalNegotiation/Identical.php +++ b/src/Mutator/ConditionalNegotiation/Identical.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\NotIdentical($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Identical; } diff --git a/src/Mutator/ConditionalNegotiation/LessThanNegotiation.php b/src/Mutator/ConditionalNegotiation/LessThanNegotiation.php index cfb87af962..c1911b7b4b 100644 --- a/src/Mutator/ConditionalNegotiation/LessThanNegotiation.php +++ b/src/Mutator/ConditionalNegotiation/LessThanNegotiation.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\GreaterOrEqual($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Smaller; } diff --git a/src/Mutator/ConditionalNegotiation/LessThanOrEqualToNegotiation.php b/src/Mutator/ConditionalNegotiation/LessThanOrEqualToNegotiation.php index 45dfbc0663..ff0fe2b0d0 100644 --- a/src/Mutator/ConditionalNegotiation/LessThanOrEqualToNegotiation.php +++ b/src/Mutator/ConditionalNegotiation/LessThanOrEqualToNegotiation.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Greater($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\SmallerOrEqual; } diff --git a/src/Mutator/ConditionalNegotiation/NotEqual.php b/src/Mutator/ConditionalNegotiation/NotEqual.php index 4bf747d43b..0d42e58574 100644 --- a/src/Mutator/ConditionalNegotiation/NotEqual.php +++ b/src/Mutator/ConditionalNegotiation/NotEqual.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Equal($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\NotEqual; } diff --git a/src/Mutator/ConditionalNegotiation/NotIdentical.php b/src/Mutator/ConditionalNegotiation/NotIdentical.php index f744c08b29..a588fac2a5 100644 --- a/src/Mutator/ConditionalNegotiation/NotIdentical.php +++ b/src/Mutator/ConditionalNegotiation/NotIdentical.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Identical($node->left, $node->right, $node->getAttributes()); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\NotIdentical; } diff --git a/src/Mutator/FunctionSignature/ProtectedVisibility.php b/src/Mutator/FunctionSignature/ProtectedVisibility.php index 5c55917f7f..e845039491 100644 --- a/src/Mutator/FunctionSignature/ProtectedVisibility.php +++ b/src/Mutator/FunctionSignature/ProtectedVisibility.php @@ -68,7 +68,7 @@ public function mutate(Node $node) ); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof ClassMethod) { return false; diff --git a/src/Mutator/FunctionSignature/PublicVisibility.php b/src/Mutator/FunctionSignature/PublicVisibility.php index 82782ce73c..b62741c290 100644 --- a/src/Mutator/FunctionSignature/PublicVisibility.php +++ b/src/Mutator/FunctionSignature/PublicVisibility.php @@ -71,7 +71,7 @@ public function mutate(Node $node) ); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof ClassMethod) { return false; diff --git a/src/Mutator/Number/DecrementInteger.php b/src/Mutator/Number/DecrementInteger.php index 8a617bafa2..a6abf8173b 100644 --- a/src/Mutator/Number/DecrementInteger.php +++ b/src/Mutator/Number/DecrementInteger.php @@ -57,7 +57,7 @@ public function mutate(Node $node) return new Node\Scalar\LNumber($node->value - 1); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Scalar\LNumber || $node->value === 1) { return false; diff --git a/src/Mutator/Number/IncrementInteger.php b/src/Mutator/Number/IncrementInteger.php index 33474da85c..7479cd7703 100644 --- a/src/Mutator/Number/IncrementInteger.php +++ b/src/Mutator/Number/IncrementInteger.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Scalar\LNumber($node->value + 1); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Scalar\LNumber && $node->value !== 0; } diff --git a/src/Mutator/Number/OneZeroFloat.php b/src/Mutator/Number/OneZeroFloat.php index f5af2b2bcf..1e028cf9b5 100644 --- a/src/Mutator/Number/OneZeroFloat.php +++ b/src/Mutator/Number/OneZeroFloat.php @@ -58,7 +58,7 @@ public function mutate(Node $node) return new Node\Scalar\DNumber(0.0); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Scalar\DNumber && ($node->value === 0.0 || $node->value === 1.0); } diff --git a/src/Mutator/Number/OneZeroInteger.php b/src/Mutator/Number/OneZeroInteger.php index 27d2fe71d2..f716254e11 100644 --- a/src/Mutator/Number/OneZeroInteger.php +++ b/src/Mutator/Number/OneZeroInteger.php @@ -58,7 +58,7 @@ public function mutate(Node $node) return new Node\Scalar\LNumber(0); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Scalar\LNumber && ($node->value === 0 || $node->value === 1); } diff --git a/src/Mutator/Operator/Break_.php b/src/Mutator/Operator/Break_.php index 325febe00d..f27d6e3f02 100644 --- a/src/Mutator/Operator/Break_.php +++ b/src/Mutator/Operator/Break_.php @@ -55,7 +55,7 @@ public function mutate(Node $node) return new Node\Stmt\Continue_(); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Break_) { return false; diff --git a/src/Mutator/Operator/Coalesce.php b/src/Mutator/Operator/Coalesce.php index a6ce7f4584..077f29ccda 100644 --- a/src/Mutator/Operator/Coalesce.php +++ b/src/Mutator/Operator/Coalesce.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return $node->right; } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Coalesce; } diff --git a/src/Mutator/Operator/Continue_.php b/src/Mutator/Operator/Continue_.php index 01732836a2..0f3eb11e09 100644 --- a/src/Mutator/Operator/Continue_.php +++ b/src/Mutator/Operator/Continue_.php @@ -55,7 +55,7 @@ public function mutate(Node $node) return new Node\Stmt\Break_(); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Continue_) { return false; diff --git a/src/Mutator/Operator/Finally_.php b/src/Mutator/Operator/Finally_.php index 4d45b17d3f..0e139117f1 100644 --- a/src/Mutator/Operator/Finally_.php +++ b/src/Mutator/Operator/Finally_.php @@ -55,7 +55,7 @@ public function mutate(Node $node) return new Node\Stmt\Nop(); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Finally_) { return false; diff --git a/src/Mutator/Operator/Throw_.php b/src/Mutator/Operator/Throw_.php index e3574910e4..73b1007b89 100644 --- a/src/Mutator/Operator/Throw_.php +++ b/src/Mutator/Operator/Throw_.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Stmt\Expression($node->expr); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Stmt\Throw_; } diff --git a/src/Mutator/Regex/PregMatchMatches.php b/src/Mutator/Regex/PregMatchMatches.php index f13d8db87a..3c25364777 100644 --- a/src/Mutator/Regex/PregMatchMatches.php +++ b/src/Mutator/Regex/PregMatchMatches.php @@ -55,7 +55,7 @@ public function mutate(Node $node) return new Node\Expr\Cast\Int_(new Node\Expr\Assign($node->args[2]->value, new Node\Expr\Array_())); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Expr\FuncCall) { return false; diff --git a/src/Mutator/Regex/PregQuote.php b/src/Mutator/Regex/PregQuote.php index 561d9af806..ae102739c5 100644 --- a/src/Mutator/Regex/PregQuote.php +++ b/src/Mutator/Regex/PregQuote.php @@ -51,7 +51,7 @@ public function mutate(Node $node) return $node->args[0]; } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name && diff --git a/src/Mutator/Removal/FunctionCallRemoval.php b/src/Mutator/Removal/FunctionCallRemoval.php index 5918551ff3..bf67ab352f 100644 --- a/src/Mutator/Removal/FunctionCallRemoval.php +++ b/src/Mutator/Removal/FunctionCallRemoval.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Stmt\Nop(); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Expression) { return false; diff --git a/src/Mutator/Removal/MethodCallRemoval.php b/src/Mutator/Removal/MethodCallRemoval.php index 2a0e23edb8..bdd747e435 100644 --- a/src/Mutator/Removal/MethodCallRemoval.php +++ b/src/Mutator/Removal/MethodCallRemoval.php @@ -54,7 +54,7 @@ public function mutate(Node $node) return new Node\Stmt\Nop(); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Expression) { return false; diff --git a/src/Mutator/ReturnValue/FloatNegation.php b/src/Mutator/ReturnValue/FloatNegation.php index 183ee93bdb..bd1bd36c4b 100644 --- a/src/Mutator/ReturnValue/FloatNegation.php +++ b/src/Mutator/ReturnValue/FloatNegation.php @@ -61,7 +61,7 @@ public function mutate(Node $node) ); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Return_) { return false; diff --git a/src/Mutator/ReturnValue/FunctionCall.php b/src/Mutator/ReturnValue/FunctionCall.php index 9c5d371019..aeeda5dec9 100644 --- a/src/Mutator/ReturnValue/FunctionCall.php +++ b/src/Mutator/ReturnValue/FunctionCall.php @@ -59,7 +59,7 @@ public function mutate(Node $node) ]; } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Return_) { return false; diff --git a/src/Mutator/ReturnValue/IntegerNegation.php b/src/Mutator/ReturnValue/IntegerNegation.php index 9383f5cc09..27ea49184e 100644 --- a/src/Mutator/ReturnValue/IntegerNegation.php +++ b/src/Mutator/ReturnValue/IntegerNegation.php @@ -61,7 +61,7 @@ public function mutate(Node $node) ); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Return_) { return false; diff --git a/src/Mutator/ReturnValue/NewObject.php b/src/Mutator/ReturnValue/NewObject.php index bd9e9258b7..d1309ef903 100644 --- a/src/Mutator/ReturnValue/NewObject.php +++ b/src/Mutator/ReturnValue/NewObject.php @@ -59,7 +59,7 @@ public function mutate(Node $node) ]; } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Stmt\Return_) { return false; diff --git a/src/Mutator/ReturnValue/This.php b/src/Mutator/ReturnValue/This.php index 78274771e8..1b91ce1ed1 100644 --- a/src/Mutator/ReturnValue/This.php +++ b/src/Mutator/ReturnValue/This.php @@ -56,7 +56,7 @@ public function mutate(Node $node) ); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Stmt\Return_ && $node->expr instanceof Node\Expr\Variable && diff --git a/src/Mutator/Sort/Spaceship.php b/src/Mutator/Sort/Spaceship.php index c8e6986f25..81e84278d5 100644 --- a/src/Mutator/Sort/Spaceship.php +++ b/src/Mutator/Sort/Spaceship.php @@ -55,7 +55,7 @@ public function mutate(Node $node) return new Node\Expr\BinaryOp\Spaceship($node->right, $node->left); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Expr\BinaryOp\Spaceship; } diff --git a/src/Mutator/Unwrap/AbstractUnwrapMutator.php b/src/Mutator/Unwrap/AbstractUnwrapMutator.php index 0865909412..a9676ac7f6 100644 --- a/src/Mutator/Unwrap/AbstractUnwrapMutator.php +++ b/src/Mutator/Unwrap/AbstractUnwrapMutator.php @@ -59,7 +59,7 @@ abstract protected function getFunctionName(): string; abstract protected function getParameterIndexes(Node $node): \Generator; - final protected function mutatesNode(Node $node): bool + final protected function mutatesNode(Node $node, array $mutatorSettings): bool { if (!$node instanceof Node\Expr\FuncCall || !$node->name instanceof Node\Name) { return false; diff --git a/src/Mutator/Util/Mutator.php b/src/Mutator/Util/Mutator.php index 55f332d0dd..5d0e80f569 100644 --- a/src/Mutator/Util/Mutator.php +++ b/src/Mutator/Util/Mutator.php @@ -57,7 +57,7 @@ abstract public function mutate(Node $node); final public function shouldMutate(Node $node): bool { - if (!$this->mutatesNode($node)) { + if (!$this->mutatesNode($node, $this->config->getMutatorSettings())) { return false; } @@ -77,5 +77,5 @@ final public static function getName(): string return end($parts); } - abstract protected function mutatesNode(Node $node): bool; + abstract protected function mutatesNode(Node $node, array $mutatorSettings): bool; } diff --git a/src/Mutator/Util/MutatorConfig.php b/src/Mutator/Util/MutatorConfig.php index 113dfd8b8f..d7e1c0618a 100644 --- a/src/Mutator/Util/MutatorConfig.php +++ b/src/Mutator/Util/MutatorConfig.php @@ -45,9 +45,15 @@ final class MutatorConfig */ private $ignoreConfig; + /** + * @var array + */ + private $mutatorSettings; + public function __construct(array $config) { $this->ignoreConfig = $config['ignore'] ?? []; + $this->mutatorSettings = $config['settings'] ?? []; } public function isIgnored(string $class, string $method): bool @@ -68,4 +74,9 @@ public function isIgnored(string $class, string $method): bool return false; } + + public function getMutatorSettings(): array + { + return $this->mutatorSettings; + } } diff --git a/src/Mutator/ZeroIteration/For_.php b/src/Mutator/ZeroIteration/For_.php index 418395f276..5b87b4e476 100644 --- a/src/Mutator/ZeroIteration/For_.php +++ b/src/Mutator/ZeroIteration/For_.php @@ -62,7 +62,7 @@ public function mutate(Node $node) ); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Stmt\For_; } diff --git a/src/Mutator/ZeroIteration/Foreach_.php b/src/Mutator/ZeroIteration/Foreach_.php index ab514e451c..966dc6e14b 100644 --- a/src/Mutator/ZeroIteration/Foreach_.php +++ b/src/Mutator/ZeroIteration/Foreach_.php @@ -63,7 +63,7 @@ public function mutate(Node $node) ); } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { return $node instanceof Node\Stmt\Foreach_; } diff --git a/tests/Fixtures/Autoloaded/Mutator/ErrorMutator.php b/tests/Fixtures/Autoloaded/Mutator/ErrorMutator.php index 60388f5c27..987c647b1d 100644 --- a/tests/Fixtures/Autoloaded/Mutator/ErrorMutator.php +++ b/tests/Fixtures/Autoloaded/Mutator/ErrorMutator.php @@ -13,7 +13,7 @@ public function mutate(Node $node) return $node; } - protected function mutatesNode(Node $node): bool + protected function mutatesNode(Node $node, array $mutatorSettings): bool { //This is intended to cause an error. $name = (string) $node; diff --git a/tests/Fixtures/StubMutator.php b/tests/Fixtures/StubMutator.php index 4c65486afe..f38da9f5df 100644 --- a/tests/Fixtures/StubMutator.php +++ b/tests/Fixtures/StubMutator.php @@ -12,7 +12,7 @@ public function mutate(Node $node) { } - public function mutatesNode(Node $node): bool + public function mutatesNode(Node $node, array $mutatorSettings): bool { return false; } diff --git a/tests/Json/JsonFileTest.php b/tests/Json/JsonFileTest.php index 83c9ffe97b..b301cc7753 100644 --- a/tests/Json/JsonFileTest.php +++ b/tests/Json/JsonFileTest.php @@ -113,4 +113,153 @@ public function test_it_throws_schema_validation_exception(): void (new JsonFile($jsonPath))->decode(); } + + /** + * @dataProvider validTrueValueProvider + */ + public function test_it_validates_true_value_mutator(string $jsonString): void + { + $jsonPath = $this->tmpDir . '/file.json'; + + $this->filesystem->dumpFile($jsonPath, $jsonString); + + $content = (new JsonFile($jsonPath))->decode(); + + self::assertObjectHasAttribute('mutators', $content); + } + + public function validTrueValueProvider(): \Generator + { + yield 'Boolean value' => [ + << [ + <<tmpDir . '/file.json'; + + $this->filesystem->dumpFile($jsonPath, $jsonString); + + self::expectException(ValidationException::class); + self::expectExceptionMessageRegExp($expectedMessageRegex); + + (new JsonFile($jsonPath))->decode(); + } + + public function invalidTrueValueProvider(): \Generator + { + yield 'Extra property for TrueValue mutator' => [ + <<<'JSON' +{ + "timeout": 25, + "source": {"directories": ["src"]}, + "mutators": { + "TrueValue": { + "EXTRA_KEY": true, + "ignore": [ + "IgnoreClass" + ], + "settings": { + "in_array": false, + "array_search": true + } + } + } +} +JSON + , + '/mutators\.TrueValue : The property EXTRA_KEY is not defined and the definition does not allow additional properties/', + ]; + + yield 'Extra property for TrueValue mutator, settings object' => [ + <<<'JSON' +{ + "timeout": 25, + "source": {"directories": ["src"]}, + "mutators": { + "TrueValue": { + "ignore": [ + "IgnoreClass" + ], + "settings": { + "EXTRA_KEY": true, + "in_array": false, + "array_search": true + } + } + } +} +JSON + , + '/mutators\.TrueValue\.settings : The property EXTRA_KEY is not defined and the definition does not allow additional properties/', + ]; + + yield 'Invalid type for "in_array" setting' => [ + <<<'JSON' +{ + "timeout": 25, + "source": {"directories": ["src"]}, + "mutators": { + "TrueValue": { + "ignore": [ + "IgnoreClass" + ], + "settings": { + "in_array": 123, + "array_search": true + } + } + } +} +JSON + , + '/mutators\.TrueValue\.settings\.in_array : Integer value found, but a boolean is required/', + ]; + + yield 'Invalid type TrueValue' => [ + <<<'JSON' +{ + "timeout": 25, + "source": {"directories": ["src"]}, + "mutators": { + "TrueValue": 123 + } +} +JSON + , + '/mutators\.TrueValue : Failed to match at least one schema/', + ]; + } } diff --git a/tests/Mutator/AbstractMutatorTestCase.php b/tests/Mutator/AbstractMutatorTestCase.php index 8093ad75fb..bdf782aa64 100644 --- a/tests/Mutator/AbstractMutatorTestCase.php +++ b/tests/Mutator/AbstractMutatorTestCase.php @@ -66,7 +66,7 @@ protected function setUp(): void $this->mutator = $this->getMutator(); } - public function doTest(string $inputCode, $expectedCode = null): void + public function doTest(string $inputCode, $expectedCode = null, $settings = []): void { $expectedCodeSamples = (array) $expectedCode; @@ -76,7 +76,7 @@ public function doTest(string $inputCode, $expectedCode = null): void throw new \LogicException('Input code cant be the same as mutated code'); } - $mutants = $this->mutate($inputCode); + $mutants = $this->mutate($inputCode, $settings); $this->assertSame(\count($mutants), \count($expectedCodeSamples), sprintf( 'Failed asserting that the number of code samples (%d) equals the number of mutants (%d) created by the mutator.', @@ -98,12 +98,12 @@ public function doTest(string $inputCode, $expectedCode = null): void } } - protected function getMutator(): Mutator + protected function getMutator(array $settings = []): Mutator { $class = \get_class($this); $mutator = substr(str_replace('\Tests', '', $class), 0, -4); - return new $mutator(new MutatorConfig([])); + return new $mutator(new MutatorConfig($settings)); } protected function getNodes(string $code): array @@ -114,12 +114,12 @@ protected function getNodes(string $code): array return $parser->parse($code); } - protected function mutate(string $code): array + protected function mutate(string $code, array $settings = []): array { $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7, new Lexer\Emulative()); $prettyPrinter = new Standard(); - $mutations = $this->getMutationsFromCode($code, $parser); + $mutations = $this->getMutationsFromCode($code, $parser, $settings); $traverser = new NodeTraverser(); $traverser->addVisitor(new CloneVisitor()); @@ -144,13 +144,13 @@ protected function mutate(string $code): array /** * @return SimpleMutation[] */ - private function getMutationsFromCode(string $code, Parser $parser): array + private function getMutationsFromCode(string $code, Parser $parser, array $settings): array { $initialStatements = $parser->parse($code); $traverser = new NodeTraverser(); - $mutationsCollectorVisitor = new SimpleMutationsCollectorVisitor($this->getMutator(), $initialStatements); + $mutationsCollectorVisitor = new SimpleMutationsCollectorVisitor($this->getMutator($settings), $initialStatements); $traverser->addVisitor($mutationsCollectorVisitor); $traverser->addVisitor(new ParentConnectorVisitor()); diff --git a/tests/Mutator/Boolean/TrueValueTest.php b/tests/Mutator/Boolean/TrueValueTest.php index 36cc47e324..72e5ed3bcd 100644 --- a/tests/Mutator/Boolean/TrueValueTest.php +++ b/tests/Mutator/Boolean/TrueValueTest.php @@ -47,15 +47,14 @@ final class TrueValueTest extends AbstractMutatorTestCase /** * @dataProvider provideMutationCases */ - public function test_mutator($input, $expected = null): void + public function test_mutator($input, $expected = null, $settings = []): void { - $this->doTest($input, $expected); + $this->doTest($input, $expected, $settings); } - public function provideMutationCases(): array + public function provideMutationCases(): \Generator { - return [ - 'It mutates true to false' => [ + yield 'It mutates true to false' => [ <<<'PHP' [ + ]; + + yield 'It does not mutate the string true to false' => [ <<<'PHP' [ + ]; + + yield 'It mutates all caps true to false' => [ <<<'PHP' [ + <<<'PHP' + [ + <<<'PHP' + [ + <<<'PHP' +in_array($b, $c, true); +PHP + , + <<<'PHP' +in_array($b, $c, false); +PHP + , + ]; + + yield 'It mutates when used in "\in_array" function and explicitly enabled in settings' => [ + <<<'PHP' + ['in_array' => true], + ], + ]; + + yield 'It does not mutate when used in "\in_array" function and explicitly disabled' => [ + <<<'PHP' + ['in_array' => false], + ], + ]; + + yield 'It does not mutate when used in "array_search" function by default' => [ + <<<'PHP' + [ + <<<'PHP' + [ + <<<'PHP' +array_search($b, $c, true); +PHP + , + <<<'PHP' +array_search($b, $c, false); +PHP + , + ]; + + yield 'It mutates when used in "\array_search" function and explicitly enabled in settings' => [ + <<<'PHP' + ['array_search' => true], + ], + ]; + + yield 'It does not mutate when used in "\array_search" function and explicitly disabled' => [ + <<<'PHP' + ['array_search' => false], ], ]; }