diff --git a/config/set/dead-code/dead-code.yaml b/config/set/dead-code/dead-code.yaml index 4b87f2f3d1d..5215988676b 100644 --- a/config/set/dead-code/dead-code.yaml +++ b/config/set/dead-code/dead-code.yaml @@ -23,3 +23,4 @@ services: Rector\DeadCode\Rector\Plus\RemoveZeroAndOneBinaryRector: ~ Rector\DeadCode\Rector\ClassMethod\RemoveDelegatingParentCallRector: ~ Rector\DeadCode\Rector\Instanceof_\RemoveDuplicatedInstanceOfRector: ~ + Rector\DeadCode\Rector\Switch_\RemoveDuplicatedCaseInSwitchRector: ~ diff --git a/packages/DeadCode/src/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php b/packages/DeadCode/src/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php new file mode 100644 index 00000000000..b0e593b2cea --- /dev/null +++ b/packages/DeadCode/src/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php @@ -0,0 +1,89 @@ +modifyHeader($node, 'remove'); + case 'clearAllHeaders': + return $this->modifyHeader($node, 'replace'); + case 'clearRawHeaders': + return $this->modifyHeader($node, 'replace'); + case '...': + return 5; + } + } +} +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +class SomeClass +{ + public function run() + { + switch ($name) { + case 'clearHeader': + return $this->modifyHeader($node, 'remove'); + case 'clearAllHeaders': + case 'clearRawHeaders': + return $this->modifyHeader($node, 'replace'); + case '...': + return 5; + } + } +} +CODE_SAMPLE + ), + ]); + } + + /** + * @return string[] + */ + public function getNodeTypes(): array + { + return [Switch_::class]; + } + + /** + * @param Switch_ $node + */ + public function refactor(Node $node): ?Node + { + if (count($node->cases) < 2) { + return null; + } + + /** @var Node\Stmt\Case_|null $previousCase */ + $previousCase = null; + foreach ($node->cases as $case) { + if ($previousCase && $this->areNodesEqual($case->stmts, $previousCase->stmts)) { + $previousCase->stmts = []; + } + + $previousCase = $case; + } + + return $node; + } +} diff --git a/packages/DeadCode/tests/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector/Fixture/fixture.php.inc b/packages/DeadCode/tests/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..6c837b5e9d9 --- /dev/null +++ b/packages/DeadCode/tests/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector/Fixture/fixture.php.inc @@ -0,0 +1,44 @@ +modifyHeader($node, 'remove'); + case 'clearAllHeaders': + return $this->modifyHeader($node, 'replace'); + case 'clearRawHeaders': + return $this->modifyHeader($node, 'replace'); + case '...': + return 5; + } + } +} + +?> +----- +modifyHeader($node, 'remove'); + case 'clearAllHeaders': + case 'clearRawHeaders': + return $this->modifyHeader($node, 'replace'); + case '...': + return 5; + } + } +} + +?> diff --git a/packages/DeadCode/tests/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector/RemoveDuplicatedCaseInSwitchRectorTest.php b/packages/DeadCode/tests/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector/RemoveDuplicatedCaseInSwitchRectorTest.php new file mode 100644 index 00000000000..b9aac439316 --- /dev/null +++ b/packages/DeadCode/tests/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector/RemoveDuplicatedCaseInSwitchRectorTest.php @@ -0,0 +1,19 @@ +doTestFiles([__DIR__ . '/Fixture/fixture.php.inc']); + } + + protected function getRectorClass(): string + { + return RemoveDuplicatedCaseInSwitchRector::class; + } +}