|
@@ -18,6 +18,8 @@ use PhpCsFixer\AbstractFixer;
|
|
|
use PhpCsFixer\FixerDefinition\CodeSample;
|
|
|
use PhpCsFixer\FixerDefinition\FixerDefinition;
|
|
|
use PhpCsFixer\FixerDefinition\FixerDefinitionInterface;
|
|
|
+use PhpCsFixer\Tokenizer\Analyzer\Analysis\SwitchAnalysis;
|
|
|
+use PhpCsFixer\Tokenizer\Analyzer\ControlCaseStructuresAnalyzer;
|
|
|
use PhpCsFixer\Tokenizer\Token;
|
|
|
use PhpCsFixer\Tokenizer\Tokens;
|
|
|
|
|
@@ -71,55 +73,22 @@ final class SwitchCaseSemicolonToColonFixer extends AbstractFixer
|
|
|
*/
|
|
|
protected function applyFix(\SplFileInfo $file, Tokens $tokens): void
|
|
|
{
|
|
|
- foreach ($tokens as $index => $token) {
|
|
|
- if ($token->isGivenKind(T_CASE)) {
|
|
|
- $this->fixSwitchCase($tokens, $index);
|
|
|
- }
|
|
|
- if ($token->isGivenKind(T_DEFAULT)) {
|
|
|
- $this->fixSwitchDefault($tokens, $index);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ /** @var SwitchAnalysis $analysis */
|
|
|
+ foreach (ControlCaseStructuresAnalyzer::findControlStructures($tokens, [T_SWITCH]) as $analysis) {
|
|
|
+ $default = $analysis->getDefaultAnalysis();
|
|
|
|
|
|
- private function fixSwitchCase(Tokens $tokens, int $index): void
|
|
|
- {
|
|
|
- $ternariesCount = 0;
|
|
|
- do {
|
|
|
- if ($tokens[$index]->equalsAny(['(', '{'])) { // skip constructs
|
|
|
- $type = Tokens::detectBlockType($tokens[$index]);
|
|
|
- $index = $tokens->findBlockEnd($type['type'], $index);
|
|
|
-
|
|
|
- continue;
|
|
|
+ if (null !== $default) {
|
|
|
+ $this->fixTokenIfNeeded($tokens, $default->getColonIndex());
|
|
|
}
|
|
|
|
|
|
- if ($tokens[$index]->equals('?')) {
|
|
|
- ++$ternariesCount;
|
|
|
-
|
|
|
- continue;
|
|
|
+ foreach ($analysis->getCases() as $caseAnalysis) {
|
|
|
+ $this->fixTokenIfNeeded($tokens, $caseAnalysis->getColonIndex());
|
|
|
}
|
|
|
-
|
|
|
- if ($tokens[$index]->equalsAny([':', ';'])) {
|
|
|
- if (0 === $ternariesCount) {
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- --$ternariesCount;
|
|
|
- }
|
|
|
- } while (++$index);
|
|
|
-
|
|
|
- if ($tokens[$index]->equals(';')) {
|
|
|
- $tokens[$index] = new Token(':');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private function fixSwitchDefault(Tokens $tokens, int $index): void
|
|
|
+ private function fixTokenIfNeeded(Tokens $tokens, int $index): void
|
|
|
{
|
|
|
- do {
|
|
|
- if ($tokens[$index]->equalsAny([':', ';', [T_DOUBLE_ARROW]])) {
|
|
|
- break;
|
|
|
- }
|
|
|
- } while (++$index);
|
|
|
-
|
|
|
if ($tokens[$index]->equals(';')) {
|
|
|
$tokens[$index] = new Token(':');
|
|
|
}
|