Chris@0: getTokens(); Chris@0: Chris@0: // We are only interested in function/class/interface doc block comments. Chris@17: $ignore = Tokens::$emptyTokens; Chris@0: if ($phpcsFile->tokenizerType === 'JS') { Chris@0: $ignore[] = T_EQUAL; Chris@0: $ignore[] = T_STRING; Chris@0: $ignore[] = T_OBJECT_OPERATOR; Chris@0: } Chris@0: Chris@0: $nextToken = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); Chris@0: $ignore = array( Chris@0: T_CLASS => true, Chris@0: T_INTERFACE => true, Chris@0: T_FUNCTION => true, Chris@0: T_PUBLIC => true, Chris@0: T_PRIVATE => true, Chris@0: T_PROTECTED => true, Chris@0: T_STATIC => true, Chris@0: T_ABSTRACT => true, Chris@0: T_PROPERTY => true, Chris@0: T_OBJECT => true, Chris@0: T_PROTOTYPE => true, Chris@0: T_VAR => true, Chris@0: ); Chris@0: Chris@0: if (isset($ignore[$tokens[$nextToken]['code']]) === false) { Chris@0: // Could be a file comment. Chris@17: $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); Chris@0: if ($tokens[$prevToken]['code'] !== T_OPEN_TAG) { Chris@0: return; Chris@0: } Chris@0: } Chris@0: Chris@0: // There must be one space after each star (unless it is an empty comment line) Chris@0: // and all the stars must be aligned correctly. Chris@0: $requiredColumn = ($tokens[$stackPtr]['column'] + 1); Chris@0: $endComment = $tokens[$stackPtr]['comment_closer']; Chris@0: for ($i = ($stackPtr + 1); $i <= $endComment; $i++) { Chris@0: if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR Chris@0: && $tokens[$i]['code'] !== T_DOC_COMMENT_CLOSE_TAG Chris@0: ) { Chris@0: continue; Chris@0: } Chris@0: Chris@0: if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) { Chris@0: // Can't process the close tag if it is not the first thing on the line. Chris@0: $prev = $phpcsFile->findPrevious(T_DOC_COMMENT_WHITESPACE, ($i - 1), $stackPtr, true); Chris@0: if ($tokens[$prev]['line'] === $tokens[$i]['line']) { Chris@0: continue; Chris@0: } Chris@0: } Chris@0: Chris@0: if ($tokens[$i]['column'] !== $requiredColumn) { Chris@0: $error = 'Expected %s space(s) before asterisk; %s found'; Chris@0: $data = array( Chris@0: ($requiredColumn - 1), Chris@0: ($tokens[$i]['column'] - 1), Chris@0: ); Chris@0: $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeStar', $data); Chris@0: if ($fix === true) { Chris@0: $padding = str_repeat(' ', ($requiredColumn - 1)); Chris@0: if ($tokens[$i]['column'] === 1) { Chris@0: $phpcsFile->fixer->addContentBefore($i, $padding); Chris@0: } else { Chris@0: $phpcsFile->fixer->replaceToken(($i - 1), $padding); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR) { Chris@0: continue; Chris@0: } Chris@0: Chris@0: if ($tokens[($i + 2)]['line'] !== $tokens[$i]['line']) { Chris@0: // Line is empty. Chris@0: continue; Chris@0: } Chris@0: Chris@0: if ($tokens[($i + 1)]['code'] !== T_DOC_COMMENT_WHITESPACE) { Chris@0: $error = 'Expected 1 space after asterisk; 0 found'; Chris@0: $fix = $phpcsFile->addFixableError($error, $i, 'NoSpaceAfterStar'); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->addContent($i, ' '); Chris@0: } Chris@0: } else if ($tokens[($i + 2)]['code'] === T_DOC_COMMENT_TAG Chris@0: && $tokens[($i + 1)]['content'] !== ' ' Chris@0: ) { Chris@0: $error = 'Expected 1 space after asterisk; %s found'; Chris@0: $data = array(strlen($tokens[($i + 1)]['content'])); Chris@0: $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterStar', $data); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->replaceToken(($i + 1), ' '); Chris@0: } Chris@0: } Chris@0: }//end for Chris@0: Chris@0: }//end process() Chris@0: Chris@0: Chris@0: }//end class