Source for file InlineCommentSniff.php
Documentation is available at InlineCommentSniff.php
* Checks that there is adequate spacing between comments.
* @author Greg Sherwood <gsherwood@squiz.net>
* @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
* @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting;
use PHP_CodeSniffer\Sniffs\Sniff;
use PHP_CodeSniffer\Files\File;
use PHP_CodeSniffer\Util\Tokens;
class InlineCommentSniff implements Sniff
* A list of tokenizers this sniff supports.
public $supportedTokenizers = array (
* Returns an array of tokens this test wants to listen for.
public function register ()
* Processes this test, when one of its tokens is encountered.
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
* @param int $stackPtr The position of the current token in the
* stack passed in $tokens.
public function process (File $phpcsFile, $stackPtr)
$tokens = $phpcsFile->getTokens ();
// If this is a function/class/interface doc block comment, skip it.
// We are only interested in inline doc block comments, which are
$nextToken = $phpcsFile->findNext (
if (in_array($tokens[$nextToken]['code'], $ignore) === true ) {
if ($phpcsFile->tokenizerType === 'JS') {
// We allow block comments if a function or object
// is being assigned to a variable.
$ignore = Tokens ::$emptyTokens;
$ignore[] = T_OBJECT_OPERATOR;
$nextToken = $phpcsFile->findNext ($ignore, ($nextToken + 1 ), null , true );
if ($tokens[$nextToken]['code'] === T_FUNCTION
|| $tokens[$nextToken]['code'] === T_OBJECT
$prevToken = $phpcsFile->findPrevious (
if ($tokens[$prevToken]['code'] === T_OPEN_TAG ) {
if ($tokens[$stackPtr]['content'] === '/**') {
$error = 'Inline doc block comments are not allowed; use "/* Comment */" or "// Comment" instead';
$phpcsFile->addError ($error, $stackPtr, 'DocBlock');
if ($tokens[$stackPtr]['content']{0 } === '#') {
$error = 'Perl-style comments are not allowed; use "// Comment" instead';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'WrongStyle');
$comment = ltrim($tokens[$stackPtr]['content'], "# \t");
$phpcsFile->fixer ->replaceToken ($stackPtr, " // $comment" );
// We don't want end of block comments. If the last comment is a closing
$previousContent = $phpcsFile->findPrevious (T_WHITESPACE , ($stackPtr - 1 ), null , true );
if ($tokens[$previousContent]['line'] === $tokens[$stackPtr]['line']) {
// Special case for JS files.
if ($tokens[$previousContent]['code'] === T_COMMA
$lastContent = $phpcsFile->findPrevious (T_WHITESPACE , ($previousContent - 1 ), null , true );
$comment = rtrim($tokens[$stackPtr]['content']);
// Only want inline comments.
if (substr($comment, 0 , 2 ) !== '//') {
$commentLength = strlen($comment);
for ($i = 2; $i < $commentLength; $i++ ) {
if ($comment[$i] === "\t") {
if ($comment[$i] !== ' ') {
if ($tabFound === true ) {
$error = 'Tab found before comment text; expected "// %s" but found "%s"';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'TabBefore', $data);
} else if ($spaceCount === 0 ) {
$error = 'No space found before comment text; expected "// %s" but found "%s"';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceBefore', $data);
} else if ($spaceCount > 1 ) {
$error = 'Expected 1 space before comment text but found %s; use block comment if you need indentation';
substr($comment, (2 + $spaceCount)),
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingBefore', $data);
$newComment = '// '. ltrim($tokens[$stackPtr]['content'], "/\t ");
$phpcsFile->fixer ->replaceToken ($stackPtr, $newComment);
// The below section determines if a comment block is correctly capitalised,
// and ends in a full-stop. It will find the last comment in a block, and
$nextComment = $phpcsFile->findNext (T_COMMENT , ($stackPtr + 1 ), null , false );
if ($nextComment !== false
&& $tokens[$nextComment]['line'] === ($tokens[$stackPtr]['line'] + 1 )
$nextNonWhitespace = $phpcsFile->findNext (T_WHITESPACE , ($stackPtr + 1 ), $nextComment, true );
if ($nextNonWhitespace === false ) {
$lastComment = $stackPtr;
while (($topComment = $phpcsFile->findPrevious (array (T_COMMENT ), ($lastComment - 1 ), null , false )) !== false ) {
if ($tokens[$topComment]['line'] !== ($tokens[$lastComment]['line'] - 1 )) {
$nextNonWhitespace = $phpcsFile->findNext (T_WHITESPACE , ($topComment + 1 ), $lastComment, true );
if ($nextNonWhitespace !== false ) {
$lastComment = $topComment;
$topComment = $lastComment;
for ($i = $topComment; $i <= $stackPtr; $i++ ) {
if ($tokens[$i]['code'] === T_COMMENT ) {
$commentText .= trim(substr($tokens[$i]['content'], 2 ));
if ($commentText === '') {
$error = 'Blank comments are not allowed';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'Empty');
$phpcsFile->fixer ->replaceToken ($stackPtr, '');
if (preg_match('/^\p{Ll}/u', $commentText) === 1 ) {
$error = 'Inline comments must start with a capital letter';
$phpcsFile->addError ($error, $topComment, 'NotCapital');
// Only check the end of comment character if the start of the comment
// is a letter, indicating that the comment is just standard text.
if (preg_match('/^\p{L}/u', $commentText) === 1 ) {
$commentCloser = $commentText[(strlen($commentText) - 1 )];
$acceptedClosers = array (
'exclamation marks' => '!',
'or question marks' => '?',
if (in_array($commentCloser, $acceptedClosers) === false ) {
$error = 'Inline comments must end in %s';
foreach ($acceptedClosers as $closerName => $symbol) {
$ender .= ' '. $closerName. ',';
$ender = trim($ender, ' ,');
$phpcsFile->addError ($error, $stackPtr, 'InvalidEndChar', $data);
// Finally, the line below the last comment cannot be empty if this inline
// comment is on a line by itself.
if ($tokens[$previousContent]['line'] < $tokens[$stackPtr]['line']) {
$next = $phpcsFile->findNext (T_WHITESPACE , ($stackPtr + 1 ), null , true );
// Ignore if the comment is the last non-whitespace token in a file.
for ($i = ($stackPtr + 1 ); $i < $phpcsFile->numTokens; $i++ ) {
if ($tokens[$i]['line'] === ($tokens[$stackPtr]['line'] + 1 )) {
if ($tokens[$i]['code'] !== T_WHITESPACE ) {
} else if ($tokens[$i]['line'] > ($tokens[$stackPtr]['line'] + 1 )) {
$error = 'There must be no blank line following an inline comment';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingAfter');
$phpcsFile->fixer ->beginChangeset ();
for ($i = ($stackPtr + 1 ); $i < $next; $i++ ) {
if ($tokens[$i]['line'] === $tokens[$next]['line']) {
$phpcsFile->fixer ->replaceToken ($i, '');
$phpcsFile->fixer ->endChangeset ();
Documentation generated on Mon, 11 Mar 2019 15:27:34 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|