diff --git a/devTools/phpstan-src-baseline.neon b/devTools/phpstan-src-baseline.neon index 32d534fd9..821901df1 100644 --- a/devTools/phpstan-src-baseline.neon +++ b/devTools/phpstan-src-baseline.neon @@ -665,6 +665,11 @@ parameters: count: 1 path: ../src/Mutator/ZeroIteration/Foreach_.php + - + message: "#^Parameter \\#1 \\$node \\(PhpParser\\\\Node\\\\Stmt\\\\While_\\) of method Infection\\\\Mutator\\\\ZeroIteration\\\\While_\\:\\:mutate\\(\\) should be contravariant with parameter \\$node \\(PhpParser\\\\Node\\) of method Infection\\\\Mutator\\\\Mutator\\:\\:mutate\\(\\)$#" + count: 1 + path: ../src/Mutator/ZeroIteration/While_.php + - message: "#^Call to static method Webmozart\\\\Assert\\\\Mixin\\:\\:allIsInstanceOf\\(\\) with array\\ and 'PhpParser\\\\\\\\Node' will always evaluate to true\\.$#" count: 1 diff --git a/resources/schema.json b/resources/schema.json index 2382fad33..726780a9a 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -311,6 +311,7 @@ "Spread": { "$ref": "#/definitions/default-mutator-config" }, "Foreach_": { "$ref": "#/definitions/default-mutator-config" }, "For_": { "$ref": "#/definitions/default-mutator-config" }, + "While_": { "$ref": "#/definitions/default-mutator-config" }, "CastArray": { "$ref": "#/definitions/default-mutator-config" }, "CastBool": { "$ref": "#/definitions/default-mutator-config" }, "CastFloat": { "$ref": "#/definitions/default-mutator-config" }, diff --git a/src/Mutator/ProfileList.php b/src/Mutator/ProfileList.php index 9a3b556f7..ae7d8fa45 100644 --- a/src/Mutator/ProfileList.php +++ b/src/Mutator/ProfileList.php @@ -191,6 +191,7 @@ final class ProfileList public const ZERO_ITERATION_PROFILE = [ Mutator\ZeroIteration\For_::class, Mutator\ZeroIteration\Foreach_::class, + Mutator\ZeroIteration\While_::class, ]; public const CAST_PROFILE = [ @@ -381,6 +382,7 @@ final class ProfileList // Zero Iteration 'Foreach_' => Mutator\ZeroIteration\Foreach_::class, 'For_' => Mutator\ZeroIteration\For_::class, + 'While_' => Mutator\ZeroIteration\While_::class, // Cast 'CastArray' => Mutator\Cast\CastArray::class, diff --git a/src/Mutator/ZeroIteration/While_.php b/src/Mutator/ZeroIteration/While_.php new file mode 100644 index 000000000..2e79e9a46 --- /dev/null +++ b/src/Mutator/ZeroIteration/While_.php @@ -0,0 +1,102 @@ + + */ + public function mutate(Node $node): iterable + { + yield new Node\Stmt\While_( + new Node\Expr\ConstFetch(new Node\Name('false')), + $node->stmts, + $node->getAttributes() + ); + } + + public function canMutate(Node $node): bool + { + return $node instanceof Node\Stmt\While_; + } +} diff --git a/tests/phpunit/Mutator/ZeroIteration/While_Test.php b/tests/phpunit/Mutator/ZeroIteration/While_Test.php new file mode 100644 index 000000000..5903c06a8 --- /dev/null +++ b/tests/phpunit/Mutator/ZeroIteration/While_Test.php @@ -0,0 +1,102 @@ +doTest($input, $expected); + } + + public function mutationsProvider(): iterable + { + yield 'It mutates expression part from variable to false' => [ + <<<'PHP' + [ + <<<'PHP' + [ + <<<'PHP' +