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
Namespace
PHP_CodeSniffer\Standards\PSR12\Sniffs\FilesCode
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;
}