Chris@0: getTokens(); Chris@0: if ($phpcsFile->tokenizerType === 'PHP') { Chris@0: $lastToken = ($phpcsFile->numTokens - 1); Chris@0: } else { Chris@0: // JS and CSS have an artificial token at the end which we have to Chris@0: // ignore. Chris@0: $lastToken = ($phpcsFile->numTokens - 2); Chris@0: } Chris@0: Chris@0: // Hard-coding the expected \n in this sniff as it is PSR-2 specific and Chris@0: // PSR-2 enforces the use of unix style newlines. Chris@0: if (substr($tokens[$lastToken]['content'], -1) !== "\n") { Chris@0: $error = 'Expected 1 newline at end of file; 0 found'; Chris@0: $fix = $phpcsFile->addFixableError($error, $lastToken, 'NoneFound'); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->addNewline($lastToken); Chris@0: } Chris@0: Chris@0: $phpcsFile->recordMetric($stackPtr, 'Number of newlines at EOF', '0'); Chris@0: return ($phpcsFile->numTokens + 1); Chris@0: } Chris@0: Chris@0: // Go looking for the last non-empty line. Chris@0: $lastLine = $tokens[$lastToken]['line']; Chris@0: if ($tokens[$lastToken]['code'] === T_WHITESPACE) { Chris@0: $lastCode = $phpcsFile->findPrevious(T_WHITESPACE, ($lastToken - 1), null, true); Chris@0: } else if ($tokens[$lastToken]['code'] === T_INLINE_HTML) { Chris@0: $lastCode = $lastToken; Chris@0: while ($lastCode > 0 && trim($tokens[$lastCode]['content']) === '') { Chris@0: $lastCode--; Chris@0: } Chris@0: } else { Chris@0: $lastCode = $lastToken; Chris@0: } Chris@0: Chris@0: $lastCodeLine = $tokens[$lastCode]['line']; Chris@0: $blankLines = ($lastLine - $lastCodeLine + 1); Chris@0: $phpcsFile->recordMetric($stackPtr, 'Number of newlines at EOF', $blankLines); Chris@0: Chris@0: if ($blankLines > 1) { Chris@0: $error = 'Expected 1 newline at end of file; %s found'; Chris@0: $data = array($blankLines); Chris@0: $fix = $phpcsFile->addFixableError($error, $lastCode, 'TooMany', $data); Chris@0: Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->beginChangeset(); Chris@0: $phpcsFile->fixer->replaceToken($lastCode, rtrim($tokens[$lastCode]['content'])); Chris@0: for ($i = ($lastCode + 1); $i < $lastToken; $i++) { Chris@0: $phpcsFile->fixer->replaceToken($i, ''); Chris@0: } Chris@0: Chris@0: $phpcsFile->fixer->replaceToken($lastToken, $phpcsFile->eolChar); Chris@0: $phpcsFile->fixer->endChangeset(); Chris@0: } Chris@0: } Chris@0: Chris@0: // Skip the rest of the file. Chris@0: return ($phpcsFile->numTokens + 1); Chris@0: Chris@0: }//end process() Chris@0: Chris@0: Chris@0: }//end class