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

Breadcrumb

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

function FileHeaderSniff::getHeaderLines

Gather information about the statements inside a possible file header.

Parameters

\PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.:

int $stackPtr The position of the current: token in the stack.

Return value

array

1 call to FileHeaderSniff::getHeaderLines()
FileHeaderSniff::process in vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php
Processes this sniff when one of its tokens is encountered.

File

vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php, line 131

Class

FileHeaderSniff

Namespace

PHP_CodeSniffer\Standards\PSR12\Sniffs\Files

Code

public function getHeaderLines(File $phpcsFile, $stackPtr) {
    $tokens = $phpcsFile->getTokens();
    $next = $phpcsFile->findNext(T_WHITESPACE, $stackPtr + 1, null, true);
    if ($next === false) {
        return [];
    }
    $headerLines = [];
    $headerLines[] = [
        'type' => 'tag',
        'start' => $stackPtr,
        'end' => $stackPtr,
    ];
    $foundDocblock = false;
    $commentOpeners = Tokens::$scopeOpeners;
    unset($commentOpeners[T_NAMESPACE]);
    unset($commentOpeners[T_DECLARE]);
    unset($commentOpeners[T_USE]);
    unset($commentOpeners[T_IF]);
    unset($commentOpeners[T_WHILE]);
    unset($commentOpeners[T_FOR]);
    unset($commentOpeners[T_FOREACH]);
    unset($commentOpeners[T_DO]);
    unset($commentOpeners[T_TRY]);
    do {
        switch ($tokens[$next]['code']) {
            case T_DOC_COMMENT_OPEN_TAG:
                if ($foundDocblock === true) {
                    // Found a second docblock, so start of code.
                    break 2;
                }
                // Make sure this is not a code-level docblock.
                $end = $tokens[$next]['comment_closer'];
                for ($docToken = $end + 1; $docToken < $phpcsFile->numTokens; $docToken++) {
                    if (isset(Tokens::$emptyTokens[$tokens[$docToken]['code']]) === true) {
                        continue;
                    }
                    if ($tokens[$docToken]['code'] === T_ATTRIBUTE && isset($tokens[$docToken]['attribute_closer']) === true) {
                        $docToken = $tokens[$docToken]['attribute_closer'];
                        continue;
                    }
                    break;
                }
                if ($docToken === $phpcsFile->numTokens) {
                    $docToken--;
                }
                if (isset($commentOpeners[$tokens[$docToken]['code']]) === false && isset(Tokens::$methodPrefixes[$tokens[$docToken]['code']]) === false && $tokens[$docToken]['code'] !== T_READONLY) {
                    // Check for an @var annotation.
                    $annotation = false;
                    for ($i = $next; $i < $end; $i++) {
                        if ($tokens[$i]['code'] === T_DOC_COMMENT_TAG && strtolower($tokens[$i]['content']) === '@var') {
                            $annotation = true;
                            break;
                        }
                    }
                    if ($annotation === false) {
                        $foundDocblock = true;
                        $headerLines[] = [
                            'type' => 'docblock',
                            'start' => $next,
                            'end' => $end,
                        ];
                    }
                }
                
                //end if
                $next = $end;
                break;
            case T_DECLARE:
            case T_NAMESPACE:
                if (isset($tokens[$next]['scope_opener']) === true) {
                    // If this statement is using bracketed syntax, it doesn't
                    // apply to the entire files and so is not part of header.
                    // The header has now ended and the main code block begins.
                    break 2;
                }
                $end = $phpcsFile->findEndOfStatement($next);
                $headerLines[] = [
                    'type' => substr(strtolower($tokens[$next]['type']), 2),
                    'start' => $next,
                    'end' => $end,
                ];
                $next = $end;
                break;
            case T_USE:
                $type = 'use';
                $useType = $phpcsFile->findNext(Tokens::$emptyTokens, $next + 1, null, true);
                if ($useType !== false && $tokens[$useType]['code'] === T_STRING) {
                    $content = strtolower($tokens[$useType]['content']);
                    if ($content === 'function' || $content === 'const') {
                        $type .= ' ' . $content;
                    }
                }
                $end = $phpcsFile->findEndOfStatement($next);
                $headerLines[] = [
                    'type' => $type,
                    'start' => $next,
                    'end' => $end,
                ];
                $next = $end;
                break;
            default:
                // Skip comments as PSR-12 doesn't say if these are allowed or not.
                if (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true) {
                    $next = $phpcsFile->findNext(Tokens::$commentTokens, $next + 1, null, true);
                    if ($next === false) {
                        // We reached the end of the file.
                        break 2;
                    }
                    $next--;
                    break;
                }
                // We found the start of the main code block.
                break 2;
        }
        
        //end switch
        $next = $phpcsFile->findNext(T_WHITESPACE, $next + 1, null, true);
    } while ($next !== false);
    return $headerLines;
}
RSS feed
Powered by Drupal