Chris@0: Chris@0: * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) Chris@0: * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence Chris@0: * @version Release: @package_version@ Chris@0: * @link http://pear.php.net/package/PHP_CodeSniffer Chris@0: */ Chris@17: class ClassCommentSniff implements Sniff Chris@0: { Chris@0: Chris@0: Chris@0: /** Chris@0: * Returns an array of tokens this test wants to listen for. Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public function register() Chris@0: { Chris@0: return array( Chris@0: T_CLASS, Chris@0: T_INTERFACE, Chris@0: T_TRAIT, Chris@0: ); Chris@0: Chris@0: }//end register() Chris@0: Chris@0: Chris@0: /** Chris@0: * Processes this test, when one of its tokens is encountered. Chris@0: * Chris@17: * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. Chris@17: * @param int $stackPtr The position of the current token Chris@17: * in the stack passed in $tokens. Chris@0: * Chris@0: * @return void Chris@0: */ Chris@17: public function process(File $phpcsFile, $stackPtr) Chris@0: { Chris@0: $tokens = $phpcsFile->getTokens(); Chris@17: $find = Tokens::$methodPrefixes; Chris@0: $find[] = T_WHITESPACE; Chris@0: $name = $tokens[$stackPtr]['content']; Chris@0: Chris@0: $commentEnd = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); Chris@0: if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG Chris@0: && $tokens[$commentEnd]['code'] !== T_COMMENT Chris@0: ) { Chris@0: $fix = $phpcsFile->addFixableError('Missing %s doc comment', $stackPtr, 'Missing', array($name)); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->addContent($commentEnd, "\n/**\n *\n */"); Chris@0: } Chris@0: Chris@0: return; Chris@0: } Chris@0: Chris@0: // Try and determine if this is a file comment instead of a class comment. Chris@0: if ($tokens[$commentEnd]['code'] === T_DOC_COMMENT_CLOSE_TAG) { Chris@0: $start = ($tokens[$commentEnd]['comment_opener'] - 1); Chris@0: } else { Chris@0: $start = ($commentEnd - 1); Chris@0: } Chris@0: Chris@0: $fileTag = $phpcsFile->findNext(T_DOC_COMMENT_TAG, ($start + 1), $commentEnd, false, '@file'); Chris@0: if ($fileTag !== false) { Chris@0: // This is a file comment. Chris@0: $fix = $phpcsFile->addFixableError('Missing %s doc comment', $stackPtr, 'Missing', array($name)); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->addContent($commentEnd, "\n/**\n *\n */"); Chris@0: } Chris@0: Chris@0: return; Chris@0: } Chris@0: Chris@0: if ($tokens[$commentEnd]['code'] === T_COMMENT) { Chris@0: $fix = $phpcsFile->addFixableError('You must use "/**" style comments for a %s comment', $stackPtr, 'WrongStyle', array($name)); Chris@0: if ($fix === true) { Chris@0: // Convert the comment into a doc comment. Chris@0: $phpcsFile->fixer->beginChangeset(); Chris@0: $comment = ''; Chris@0: for ($i = $commentEnd; $tokens[$i]['code'] === T_COMMENT; $i--) { Chris@0: $comment = ' *'.ltrim($tokens[$i]['content'], '/* ').$comment; Chris@0: $phpcsFile->fixer->replaceToken($i, ''); Chris@0: } Chris@0: Chris@0: $phpcsFile->fixer->replaceToken($commentEnd, "/**\n".rtrim($comment, "*/\n")."\n */"); Chris@0: $phpcsFile->fixer->endChangeset(); Chris@0: } Chris@0: Chris@0: return; Chris@0: } Chris@0: Chris@0: if ($tokens[$commentEnd]['line'] !== ($tokens[$stackPtr]['line'] - 1)) { Chris@0: $error = 'There must be exactly one newline after the %s comment'; Chris@0: $fix = $phpcsFile->addFixableError($error, $commentEnd, 'SpacingAfter', array($name)); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->beginChangeset(); Chris@0: for ($i = ($commentEnd + 1); $tokens[$i]['code'] === T_WHITESPACE && $i < $stackPtr; $i++) { Chris@0: $phpcsFile->fixer->replaceToken($i, ''); Chris@0: } Chris@0: Chris@0: $phpcsFile->fixer->addContent($commentEnd, "\n"); Chris@0: $phpcsFile->fixer->endChangeset(); Chris@0: } Chris@0: } Chris@0: Chris@0: }//end process() Chris@0: Chris@0: Chris@0: }//end class