public function fix(\SplFileInfo $file, Tokens $tokens)
{
$ternaryLevel = 0;
foreach ($tokens as $index => $token) {
if ($token->isArray()) {
continue;
}
if ($token->equals('?')) {
++$ternaryLevel;
$nextNonWhitespaceIndex = $tokens->getNextNonWhitespace($index);
$nextNonWhitespaceToken = $tokens[$nextNonWhitespaceIndex];
if ($nextNonWhitespaceToken->equals(':')) {
// for `$a ?: $b` remove spaces between `?` and `:`
if ($tokens[$index + 1]->isWhitespace()) {
$tokens[$index + 1]->clear();
}
} else {
// for `$a ? $b : $c` ensure space after `?`
$this->ensureWhitespaceExistence($tokens, $index + 1, true);
}
// for `$a ? $b : $c` ensure space before `?`
$this->ensureWhitespaceExistence($tokens, $index - 1, false);
continue;
}
if ($ternaryLevel && $token->equals(':')) {
// for `$a ? $b : $c` ensure space after `:`
$this->ensureWhitespaceExistence($tokens, $index + 1, true);
$prevNonWhitespaceToken = $tokens[$tokens->getPrevNonWhitespace($index)];
if (!$prevNonWhitespaceToken->equals('?')) {
// for `$a ? $b : $c` ensure space before `:`
$this->ensureWhitespaceExistence($tokens, $index - 1, false);
}
--$ternaryLevel;
}
}
}