* Dariusz RumiƄski * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace PhpCsFixer\Fixer\ControlStructure; use PhpCsFixer\AbstractNoUselessElseFixer; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Tokenizer\Tokens; final class NoUselessElseFixer extends AbstractNoUselessElseFixer { public function isCandidate(Tokens $tokens): bool { return $tokens->isTokenKindFound(T_ELSE); } public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( 'There should not be useless `else` cases.', [ new CodeSample(" $token) { if (!$token->isGivenKind(T_ELSE)) { continue; } // `else if` vs. `else` and alternative syntax `else:` checks if ($tokens[$tokens->getNextMeaningfulToken($index)]->equalsAny([':', [T_IF]])) { continue; } // clean up `else` if it is an empty statement $this->fixEmptyElse($tokens, $index); if ($tokens->isEmptyAt($index)) { continue; } // clean up `else` if possible if ($this->isSuperfluousElse($tokens, $index)) { $this->clearElse($tokens, $index); } } } /** * Remove tokens part of an `else` statement if not empty (i.e. no meaningful tokens inside). * * @param int $index T_ELSE index */ private function fixEmptyElse(Tokens $tokens, int $index): void { $next = $tokens->getNextMeaningfulToken($index); if ($tokens[$next]->equals('{')) { $close = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $next); if (1 === $close - $next) { // '{}' $this->clearElse($tokens, $index); } elseif ($tokens->getNextMeaningfulToken($next) === $close) { // '{/**/}' $this->clearElse($tokens, $index); } return; } // short `else` $end = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); if ($next === $end) { $this->clearElse($tokens, $index); } } /** * @param int $index index of T_ELSE */ private function clearElse(Tokens $tokens, int $index): void { $tokens->clearTokenAndMergeSurroundingWhitespace($index); // clear T_ELSE and the '{' '}' if there are any $next = $tokens->getNextMeaningfulToken($index); if (!$tokens[$next]->equals('{')) { return; } $tokens->clearTokenAndMergeSurroundingWhitespace($tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $next)); $tokens->clearTokenAndMergeSurroundingWhitespace($next); } }