TernaryOperatorHelper.php
Namespace
SlevomatCodingStandard\HelpersFile
-
vendor/
slevomat/ coding-standard/ SlevomatCodingStandard/ Helpers/ TernaryOperatorHelper.php
View source
<?php
declare (strict_types=1);
namespace SlevomatCodingStandard\Helpers;
use PHP_CodeSniffer\Files\File;
use function count;
use function in_array;
use const T_CASE;
use const T_CLOSE_PARENTHESIS;
use const T_CLOSE_SHORT_ARRAY;
use const T_CLOSE_SQUARE_BRACKET;
use const T_COALESCE;
use const T_COLON;
use const T_COMMA;
use const T_DOUBLE_ARROW;
use const T_EQUAL;
use const T_INLINE_ELSE;
use const T_INLINE_THEN;
use const T_OPEN_PARENTHESIS;
use const T_OPEN_SHORT_ARRAY;
use const T_OPEN_SQUARE_BRACKET;
use const T_OPEN_TAG;
use const T_OPEN_TAG_WITH_ECHO;
use const T_RETURN;
use const T_SEMICOLON;
use const T_THROW;
/**
* @internal
*/
class TernaryOperatorHelper {
public static function isConditionOfTernaryOperator(File $phpcsFile, int $pointer) : bool {
$inlineThenPointer = TokenHelper::findNext($phpcsFile, T_INLINE_THEN, $pointer + 1);
if ($inlineThenPointer === null) {
return false;
}
$startPointer = self::getStartPointer($phpcsFile, $inlineThenPointer);
return $startPointer <= $pointer;
}
public static function getElsePointer(File $phpcsFile, int $inlineThenPointer) : int {
$tokens = $phpcsFile->getTokens();
$pointer = $inlineThenPointer;
do {
$pointer = TokenHelper::findNext($phpcsFile, [
T_INLINE_ELSE,
T_OPEN_PARENTHESIS,
T_OPEN_SHORT_ARRAY,
T_OPEN_SQUARE_BRACKET,
], $pointer + 1);
if ($tokens[$pointer]['code'] === T_OPEN_PARENTHESIS) {
$pointer = $tokens[$pointer]['parenthesis_closer'];
continue;
}
if (in_array($tokens[$pointer]['code'], [
T_OPEN_SHORT_ARRAY,
T_OPEN_SQUARE_BRACKET,
], true)) {
$pointer = $tokens[$pointer]['bracket_closer'];
continue;
}
if (ScopeHelper::isInSameScope($phpcsFile, $inlineThenPointer, $pointer)) {
break;
}
} while ($pointer !== null);
return $pointer;
}
public static function getStartPointer(File $phpcsFile, int $inlineThenPointer) : int {
$tokens = $phpcsFile->getTokens();
$pointerBeforeCondition = $inlineThenPointer;
do {
$pointerBeforeCondition = TokenHelper::findPrevious($phpcsFile, [
T_EQUAL,
T_DOUBLE_ARROW,
T_COMMA,
T_RETURN,
T_THROW,
T_CASE,
T_OPEN_TAG,
T_OPEN_TAG_WITH_ECHO,
T_OPEN_SQUARE_BRACKET,
T_OPEN_SHORT_ARRAY,
T_OPEN_PARENTHESIS,
], $pointerBeforeCondition - 1);
if (in_array($tokens[$pointerBeforeCondition]['code'], [
T_OPEN_SQUARE_BRACKET,
T_OPEN_SHORT_ARRAY,
], true) && $tokens[$pointerBeforeCondition]['bracket_closer'] < $inlineThenPointer) {
continue;
}
if ($tokens[$pointerBeforeCondition]['code'] === T_OPEN_PARENTHESIS && $tokens[$pointerBeforeCondition]['parenthesis_closer'] < $inlineThenPointer) {
continue;
}
break;
} while (true);
return TokenHelper::findNextEffective($phpcsFile, $pointerBeforeCondition + 1);
}
public static function getEndPointer(File $phpcsFile, int $inlineThenPointer, int $inlineElsePointer) : int {
$tokens = $phpcsFile->getTokens();
$pointerAfterInlineElseEnd = $inlineElsePointer;
do {
$pointerAfterInlineElseEnd = TokenHelper::findNext($phpcsFile, [
T_SEMICOLON,
T_COLON,
T_COMMA,
T_DOUBLE_ARROW,
T_CLOSE_PARENTHESIS,
T_CLOSE_SHORT_ARRAY,
T_CLOSE_SQUARE_BRACKET,
T_COALESCE,
], $pointerAfterInlineElseEnd + 1);
if ($pointerAfterInlineElseEnd === null) {
continue;
}
if ($tokens[$pointerAfterInlineElseEnd]['code'] === T_CLOSE_PARENTHESIS) {
if ($tokens[$pointerAfterInlineElseEnd]['parenthesis_opener'] < $inlineThenPointer) {
break;
}
}
elseif (in_array($tokens[$pointerAfterInlineElseEnd]['code'], [
T_CLOSE_SHORT_ARRAY,
T_CLOSE_SQUARE_BRACKET,
], true)) {
if ($tokens[$pointerAfterInlineElseEnd]['bracket_opener'] < $inlineThenPointer) {
break;
}
}
elseif ($tokens[$pointerAfterInlineElseEnd]['code'] === T_COMMA) {
$previousPointer = TokenHelper::findPrevious($phpcsFile, [
T_OPEN_PARENTHESIS,
T_OPEN_SHORT_ARRAY,
], $pointerAfterInlineElseEnd - 1, $inlineThenPointer);
if ($previousPointer === null) {
break;
}
if ($tokens[$previousPointer]['code'] === T_OPEN_PARENTHESIS && $tokens[$previousPointer]['parenthesis_closer'] < $pointerAfterInlineElseEnd) {
break;
}
if ($tokens[$previousPointer]['code'] === T_OPEN_SHORT_ARRAY && $tokens[$previousPointer]['bracket_closer'] < $pointerAfterInlineElseEnd) {
break;
}
}
elseif ($tokens[$pointerAfterInlineElseEnd]['code'] === T_DOUBLE_ARROW) {
$previousPointer = TokenHelper::findPrevious($phpcsFile, T_OPEN_SHORT_ARRAY, $pointerAfterInlineElseEnd - 1, $inlineThenPointer);
if ($previousPointer === null) {
break;
}
}
elseif (ScopeHelper::isInSameScope($phpcsFile, $inlineElsePointer, $pointerAfterInlineElseEnd)) {
break;
}
} while ($pointerAfterInlineElseEnd !== null);
if ($pointerAfterInlineElseEnd !== null) {
return TokenHelper::findPreviousEffective($phpcsFile, $pointerAfterInlineElseEnd - 1);
}
return TokenHelper::findPreviousEffective($phpcsFile, count($tokens) - 1);
}
}
Classes
Title | Deprecated | Summary |
---|---|---|
TernaryOperatorHelper | @internal |