From bb523e60cb5e3798399d25abe8d26d08ffc54d87 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 23 Jul 2019 10:50:43 +0200 Subject: [PATCH] [DeadCode] Add RemoveDuplicatedCaseInSwitchRector --- config/set/dead-code/dead-code.yaml | 1 + .../RemoveDuplicatedCaseInSwitchRector.php | 89 +++++++++++++++++++ .../Fixture/fixture.php.inc | 44 +++++++++ ...RemoveDuplicatedCaseInSwitchRectorTest.php | 19 ++++ 4 files changed, 153 insertions(+) create mode 100644 packages/DeadCode/src/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php create mode 100644 packages/DeadCode/tests/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector/Fixture/fixture.php.inc create mode 100644 packages/DeadCode/tests/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector/RemoveDuplicatedCaseInSwitchRectorTest.php diff --git a/config/set/dead-code/dead-code.yaml b/config/set/dead-code/dead-code.yaml index 4b87f2f3d1d4..5215988676b7 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 000000000000..b0e593b2cea8 --- /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 000000000000..6c837b5e9d97 --- /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 000000000000..b9aac4393166 --- /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; + } +}