Viewing file: InlineCommentSniff.php (9.15 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php /** * Squiz_Sniffs_Commenting_InlineCommentSniff. * * PHP version 5 * * @category PHP * @package PHP_CodeSniffer * @author Greg Sherwood <gsherwood@squiz.net> * @author Marc McIntyre <mmcintyre@squiz.net> * @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600) * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence * @link http://pear.php.net/package/PHP_CodeSniffer */
/** * Squiz_Sniffs_Commenting_InlineCommentSniff. * * Checks that there is adequate spacing between comments. * * @category PHP * @package PHP_CodeSniffer * @author Greg Sherwood <gsherwood@squiz.net> * @author Marc McIntyre <mmcintyre@squiz.net> * @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600) * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence * @version Release: 1.3.3 * @link http://pear.php.net/package/PHP_CodeSniffer */ class Squiz_Sniffs_Commenting_InlineCommentSniff implements PHP_CodeSniffer_Sniff {
/** * A list of tokenizers this sniff supports. * * @var array */ public $supportedTokenizers = array( 'PHP', 'JS', );
/** * Returns an array of tokens this test wants to listen for. * * @return array */ public function register() { return array( T_COMMENT, T_DOC_COMMENT, );
}//end register()
/** * Processes this test, when one of its tokens is encountered. * * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. * @param int $stackPtr The position of the current token in the * stack passed in $tokens. * * @return void */ public function process(PHP_CodeSniffer_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 // not allowed. if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT) { $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_FINAL, T_STATIC, T_ABSTRACT, T_CONST, T_OBJECT, T_PROPERTY, );
if (in_array($tokens[$nextToken]['code'], $ignore) === true) { return; } else { if ($phpcsFile->tokenizerType === 'JS') { // We allow block comments if a function is being assigned // to a variable. $ignore = PHP_CodeSniffer_Tokens::$emptyTokens; $ignore[] = T_EQUAL; $ignore[] = T_STRING; $ignore[] = T_OBJECT_OPERATOR; $nextToken = $phpcsFile->findNext($ignore, ($nextToken + 1), null, true); if ($tokens[$nextToken]['code'] === T_FUNCTION) { return; } }
$prevToken = $phpcsFile->findPrevious( PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr - 1), null, true );
if ($tokens[$prevToken]['code'] === T_OPEN_TAG) { return; }
// Only error once per comment. if (substr($tokens[$stackPtr]['content'], 0, 3) === '/**') { $error = 'Inline doc block comments are not allowed; use "/* Comment */" or "// Comment" instead'; $phpcsFile->addError($error, $stackPtr, 'DocBlock'); } }//end if }//end if
if ($tokens[$stackPtr]['content']{0} === '#') { $error = 'Perl-style comments are not allowed; use "// Comment" instead'; $phpcsFile->addError($error, $stackPtr, 'WrongStyle'); }
// We don't want end of block comments. If the last comment is a closing // curly brace. $previousContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); if ($tokens[$previousContent]['line'] === $tokens[$stackPtr]['line']) { if ($tokens[$previousContent]['code'] === T_CLOSE_CURLY_BRACKET) { return; }
// Special case for JS files. if ($tokens[$previousContent]['code'] === T_COMMA || $tokens[$previousContent]['code'] === T_SEMICOLON ) { $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($previousContent - 1), null, true); if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { return; } } }
$comment = rtrim($tokens[$stackPtr]['content']);
// Only want inline comments. if (substr($comment, 0, 2) !== '//') { return; }
$spaceCount = 0; for ($i = 2; $i < strlen($comment); $i++) { if ($comment[$i] !== ' ') { break; }
$spaceCount++; }
if ($spaceCount === 0) { $error = 'No space before comment text; expected "// %s" but found "%s"'; $data = array( substr($comment, 2), $comment, ); $phpcsFile->addError($error, $stackPtr, 'NoSpaceBefore', $data); }
if ($spaceCount > 1) { $error = '%s spaces found before inline comment; expected "// %s" but found "%s"'; $data = array( $spaceCount, substr($comment, (2 + $spaceCount)), $comment, ); $phpcsFile->addError($error, $stackPtr, 'SpacingBefore', $data); }
// 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 // work its way up. $nextComment = $phpcsFile->findNext(array(T_COMMENT), ($stackPtr + 1), null, false);
if (($nextComment !== false) && (($tokens[$nextComment]['line']) === ($tokens[$stackPtr]['line'] + 1))) { return; }
$topComment = $stackPtr; $lastComment = $stackPtr; while (($topComment = $phpcsFile->findPrevious(array(T_COMMENT), ($lastComment - 1), null, false)) !== false) { if ($tokens[$topComment]['line'] !== ($tokens[$lastComment]['line'] - 1)) { break; }
$lastComment = $topComment; }
$topComment = $lastComment; $commentText = '';
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'; $phpcsFile->addError($error, $stackPtr, 'Empty'); return; }
if (preg_match('|[A-Z]|', $commentText[0]) === 0) { $error = 'Inline comments must start with a capital letter'; $phpcsFile->addError($error, $topComment, 'NotCapital'); }
$commentCloser = $commentText[(strlen($commentText) - 1)]; $acceptedClosers = array( 'full-stops' => '.', 'exclamation marks' => '!', 'or question marks' => '?', );
if (in_array($commentCloser, $acceptedClosers) === false) { $error = 'Inline comments must end in %s'; $ender = ''; foreach ($acceptedClosers as $closerName => $symbol) { $ender .= ' '.$closerName.','; }
$ender = rtrim($ender, ','); $data = array($ender); $phpcsFile->addError($error, $stackPtr, 'InvalidEndChar', $data); }
// Finally, the line below the last comment cannot be empty. $start = false; for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { if ($tokens[$i]['line'] === ($tokens[$stackPtr]['line'] + 1)) { if ($tokens[$i]['code'] !== T_WHITESPACE) { return; } } else if ($tokens[$i]['line'] > ($tokens[$stackPtr]['line'] + 1)) { break; } }
$error = 'There must be no blank line following an inline comment'; $phpcsFile->addError($error, $stackPtr, 'SpacingAfter');
}//end process()
}//end class
?>
|