View source
<?php
class Drupal_Sniffs_Commenting_DocCommentAlignmentSniff implements PHP_CodeSniffer_Sniff {
public function register() {
return array(
T_DOC_COMMENT,
);
}
public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
$tokens = $phpcsFile
->getTokens();
$nextToken = $phpcsFile
->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, $stackPtr + 1, null, true);
$ignore = array(
T_CLASS,
T_INTERFACE,
T_FUNCTION,
T_PUBLIC,
T_PRIVATE,
T_PROTECTED,
T_STATIC,
T_ABSTRACT,
);
if (in_array($tokens[$nextToken]['code'], $ignore) === false) {
$prevToken = $phpcsFile
->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, $stackPtr - 1, null, true);
if ($tokens[$prevToken]['code'] !== T_OPEN_TAG) {
return;
}
}
$docComment = $phpcsFile
->findPrevious(T_DOC_COMMENT, $stackPtr - 1);
if ($docComment !== false) {
if ($tokens[$docComment]['line'] === $tokens[$stackPtr]['line'] - 1) {
return;
}
}
$comments = array(
$stackPtr,
);
$currentComment = $stackPtr;
$lastComment = $stackPtr;
while (($currentComment = $phpcsFile
->findNext(T_DOC_COMMENT, $currentComment + 1)) !== false) {
if ($tokens[$lastComment]['line'] === $tokens[$currentComment]['line'] - 1) {
$comments[] = $currentComment;
$lastComment = $currentComment;
}
else {
break;
}
}
$requiredColumn = strpos($tokens[$stackPtr]['content'], '*');
$requiredColumn += $tokens[$stackPtr]['column'];
foreach ($comments as $commentPointer) {
$content = $tokens[$commentPointer]['content'];
$firstChar = substr($content, 0, 1);
$lastChar = substr($content, -1);
if ($firstChar !== '/' && $lastChar !== '/') {
$matches = array();
preg_match('|^(\\s+)?\\*(\\s+)?@|', $content, $matches);
if (empty($matches) === false) {
if (isset($matches[2]) === false) {
$error = 'Expected 1 space between asterisk and tag; 0 found';
$phpcsFile
->addError($error, $commentPointer, 'NoSpaceBeforeTag');
}
else {
$length = strlen($matches[2]);
if ($length !== 1) {
$error = 'Expected 1 space between asterisk and tag; %s found';
$data = array(
$length,
);
$phpcsFile
->addError($error, $commentPointer, 'SpaceBeforeTag', $data);
}
}
}
}
$currentColumn = strpos($content, '*');
$currentColumn += $tokens[$commentPointer]['column'];
if ($currentColumn === $requiredColumn) {
continue;
}
$error = 'Expected %s space(s) before asterisk; %s found';
$data = array(
$requiredColumn - 1,
$currentColumn - 1,
);
$phpcsFile
->addError($error, $commentPointer, 'SpaceBeforeAsterisk', $data);
}
if (trim($tokens[$lastComment - 1]['content']) === '*') {
$error = 'Additional blank line found at the end of doc comment';
$phpcsFile
->addError($error, $lastComment - 1, 'BlankLine');
}
}
}