Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. AbstractControlStructureSpacing.php

function AbstractControlStructureSpacing::findControlStructureEnd

1 call to AbstractControlStructureSpacing::findControlStructureEnd()
AbstractControlStructureSpacing::checkLinesAfter in vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.php

File

vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.php, line 386

Class

AbstractControlStructureSpacing
@internal

Namespace

SlevomatCodingStandard\Sniffs\ControlStructures

Code

private function findControlStructureEnd(File $phpcsFile, int $controlStructurePointer) : int {
    $tokens = $phpcsFile->getTokens();
    if ($tokens[$controlStructurePointer]['code'] === T_IF) {
        if (!array_key_exists('scope_closer', $tokens[$controlStructurePointer])) {
            throw new Exception('"if" without curly braces is not supported.');
        }
        $pointerAfterParenthesisCloser = TokenHelper::findNextEffective($phpcsFile, $tokens[$controlStructurePointer]['parenthesis_closer'] + 1);
        if ($pointerAfterParenthesisCloser !== null && $tokens[$pointerAfterParenthesisCloser]['code'] === T_COLON) {
            throw new Exception('"if" without curly braces is not supported.');
        }
        $controlStructureEndPointer = $tokens[$controlStructurePointer]['scope_closer'];
        do {
            $nextPointer = TokenHelper::findNextEffective($phpcsFile, $controlStructureEndPointer + 1);
            if ($nextPointer === null) {
                return $controlStructureEndPointer;
            }
            if ($tokens[$nextPointer]['code'] === T_ELSE) {
                if (!array_key_exists('scope_closer', $tokens[$nextPointer])) {
                    throw new Exception('"else" without curly braces is not supported.');
                }
                return $tokens[$nextPointer]['scope_closer'];
            }
            if ($tokens[$nextPointer]['code'] !== T_ELSEIF) {
                return $controlStructureEndPointer;
            }
            $controlStructureEndPointer = $tokens[$nextPointer]['scope_closer'];
        } while (true);
    }
    if ($tokens[$controlStructurePointer]['code'] === T_DO) {
        $whilePointer = TokenHelper::findNext($phpcsFile, T_WHILE, $tokens[$controlStructurePointer]['scope_closer'] + 1);
        return (int) TokenHelper::findNext($phpcsFile, T_SEMICOLON, $tokens[$whilePointer]['parenthesis_closer'] + 1);
    }
    if ($tokens[$controlStructurePointer]['code'] === T_TRY) {
        $controlStructureEndPointer = $tokens[$controlStructurePointer]['scope_closer'];
        do {
            $nextPointer = TokenHelper::findNextEffective($phpcsFile, $controlStructureEndPointer + 1);
            if ($nextPointer === null) {
                return $controlStructureEndPointer;
            }
            if (!in_array($tokens[$nextPointer]['code'], [
                T_CATCH,
                T_FINALLY,
            ], true)) {
                return $controlStructureEndPointer;
            }
            $controlStructureEndPointer = $tokens[$nextPointer]['scope_closer'];
        } while (true);
    }
    if (in_array($tokens[$controlStructurePointer]['code'], [
        T_WHILE,
        T_FOR,
        T_FOREACH,
        T_SWITCH,
    ], true)) {
        return $tokens[$controlStructurePointer]['scope_closer'];
    }
    if (in_array($tokens[$controlStructurePointer]['code'], [
        T_CASE,
        T_DEFAULT,
    ], true)) {
        $switchPointer = TokenHelper::findPrevious($phpcsFile, T_SWITCH, $controlStructurePointer - 1);
        $pointers = TokenHelper::findNextAll($phpcsFile, [
            T_CASE,
            T_DEFAULT,
        ], $controlStructurePointer + 1, $tokens[$switchPointer]['scope_closer']);
        foreach ($pointers as $pointer) {
            if (TokenHelper::findPrevious($phpcsFile, T_SWITCH, $pointer - 1) === $switchPointer) {
                $pointerBeforeCaseOrDefault = TokenHelper::findPreviousNonWhitespace($phpcsFile, $pointer - 1);
                if (in_array($tokens[$pointerBeforeCaseOrDefault]['code'], Tokens::$commentTokens, true) && $tokens[$pointerBeforeCaseOrDefault]['line'] + 1 === $tokens[$pointer]['line']) {
                    $pointerBeforeCaseOrDefault = TokenHelper::findPreviousExcluding($phpcsFile, T_WHITESPACE, $pointerBeforeCaseOrDefault - 1);
                }
                return $pointerBeforeCaseOrDefault;
            }
        }
        return TokenHelper::findPreviousNonWhitespace($phpcsFile, $tokens[$switchPointer]['scope_closer'] - 1);
    }
    $nextPointer = TokenHelper::findNext($phpcsFile, [
        T_SEMICOLON,
        T_ANON_CLASS,
        T_CLOSURE,
        T_FN,
        T_OPEN_SHORT_ARRAY,
    ], $controlStructurePointer + 1);
    if ($tokens[$nextPointer]['code'] === T_SEMICOLON) {
        return $nextPointer;
    }
    $scopeCloserPointer = $tokens[$nextPointer]['code'] === T_OPEN_SHORT_ARRAY ? $tokens[$nextPointer]['bracket_closer'] : $tokens[$nextPointer]['scope_closer'];
    if ($tokens[$scopeCloserPointer]['code'] === T_SEMICOLON) {
        return $scopeCloserPointer;
    }
    $nextPointer = TokenHelper::findNext($phpcsFile, T_SEMICOLON, $scopeCloserPointer + 1);
    $level = $tokens[$controlStructurePointer]['level'];
    while ($level !== $tokens[$nextPointer]['level']) {
        $nextPointer = (int) TokenHelper::findNext($phpcsFile, T_SEMICOLON, $nextPointer + 1);
    }
    return $nextPointer;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal