Chris@0: getTokens(); Chris@0: Chris@0: if (isset($tokens[($stackPtr + 1)]) === false) { Chris@0: return; Chris@0: } Chris@0: Chris@0: // Single space after the keyword. Chris@0: $found = 1; Chris@0: if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { Chris@0: $found = 0; Chris@0: } else if ($tokens[($stackPtr + 1)]['content'] !== ' ') { Chris@0: if (strpos($tokens[($stackPtr + 1)]['content'], $phpcsFile->eolChar) !== false) { Chris@0: $found = 'newline'; Chris@0: } else { Chris@0: $found = strlen($tokens[($stackPtr + 1)]['content']); Chris@0: } Chris@0: } Chris@0: Chris@0: if ($found !== 1) { Chris@0: $error = 'Expected 1 space after %s keyword; %s found'; Chris@0: $data = array( Chris@0: strtoupper($tokens[$stackPtr]['content']), Chris@0: $found, Chris@0: ); Chris@0: Chris@0: $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterKeyword', $data); Chris@0: if ($fix === true) { Chris@0: if ($found === 0) { Chris@0: $phpcsFile->fixer->addContent($stackPtr, ' '); Chris@0: } else { Chris@0: $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: // Single space after closing parenthesis. Chris@0: if (isset($tokens[$stackPtr]['parenthesis_closer']) === true Chris@0: && isset($tokens[$stackPtr]['scope_opener']) === true Chris@0: ) { Chris@0: $closer = $tokens[$stackPtr]['parenthesis_closer']; Chris@0: $opener = $tokens[$stackPtr]['scope_opener']; Chris@0: $content = $phpcsFile->getTokensAsString(($closer + 1), ($opener - $closer - 1)); Chris@0: Chris@0: if ($content !== ' ') { Chris@0: $error = 'Expected 1 space after closing parenthesis; found %s'; Chris@0: if (trim($content) === '') { Chris@0: $found = strlen($content); Chris@0: } else { Chris@0: $found = '"'.str_replace($phpcsFile->eolChar, '\n', $content).'"'; Chris@0: } Chris@0: Chris@0: $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceAfterCloseParenthesis', array($found)); Chris@0: if ($fix === true) { Chris@0: if ($closer === ($opener - 1)) { Chris@0: $phpcsFile->fixer->addContent($closer, ' '); Chris@0: } else { Chris@0: $phpcsFile->fixer->beginChangeset(); Chris@0: $phpcsFile->fixer->addContent($closer, ' '.$tokens[$opener]['content']); Chris@0: $phpcsFile->fixer->replaceToken($opener, ''); Chris@0: Chris@0: if ($tokens[$opener]['line'] !== $tokens[$closer]['line']) { Chris@0: $next = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), null, true); Chris@0: if ($tokens[$next]['line'] !== $tokens[$opener]['line']) { Chris@0: for ($i = ($opener + 1); $i < $next; $i++) { Chris@0: $phpcsFile->fixer->replaceToken($i, ''); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: $phpcsFile->fixer->endChangeset(); Chris@0: } Chris@0: } Chris@0: }//end if Chris@0: }//end if Chris@0: Chris@0: // Single newline after opening brace. Chris@0: if (isset($tokens[$stackPtr]['scope_opener']) === true) { Chris@0: $opener = $tokens[$stackPtr]['scope_opener']; Chris@0: for ($next = ($opener + 1); $next < $phpcsFile->numTokens; $next++) { Chris@0: $code = $tokens[$next]['code']; Chris@0: Chris@0: if ($code === T_WHITESPACE Chris@0: || ($code === T_INLINE_HTML Chris@0: && trim($tokens[$next]['content']) === '') Chris@0: ) { Chris@0: continue; Chris@0: } Chris@0: Chris@0: // Skip all empty tokens on the same line as the opener. Chris@0: if ($tokens[$next]['line'] === $tokens[$opener]['line'] Chris@17: && (isset(Tokens::$emptyTokens[$code]) === true Chris@0: || $code === T_CLOSE_TAG) Chris@0: ) { Chris@0: continue; Chris@0: } Chris@0: Chris@0: // We found the first bit of a code, or a comment on the Chris@0: // following line. Chris@0: break; Chris@0: }//end for Chris@0: Chris@0: if ($tokens[$next]['line'] === $tokens[$opener]['line']) { Chris@0: $error = 'Newline required after opening brace'; Chris@0: $fix = $phpcsFile->addFixableError($error, $opener, 'NewlineAfterOpenBrace'); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->beginChangeset(); Chris@0: for ($i = ($opener + 1); $i < $next; $i++) { Chris@0: if (trim($tokens[$i]['content']) !== '') { Chris@0: break; Chris@0: } Chris@0: Chris@0: // Remove whitespace. Chris@0: $phpcsFile->fixer->replaceToken($i, ''); Chris@0: } Chris@0: Chris@0: $phpcsFile->fixer->addContent($opener, $phpcsFile->eolChar); Chris@0: $phpcsFile->fixer->endChangeset(); Chris@0: } Chris@0: }//end if Chris@0: } else if ($tokens[$stackPtr]['code'] === T_WHILE) { Chris@0: // Zero spaces after parenthesis closer. Chris@0: $closer = $tokens[$stackPtr]['parenthesis_closer']; Chris@0: $found = 0; Chris@0: if ($tokens[($closer + 1)]['code'] === T_WHITESPACE) { Chris@0: if (strpos($tokens[($closer + 1)]['content'], $phpcsFile->eolChar) !== false) { Chris@0: $found = 'newline'; Chris@0: } else { Chris@0: $found = strlen($tokens[($closer + 1)]['content']); Chris@0: } Chris@0: } Chris@0: Chris@0: if ($found !== 0) { Chris@0: $error = 'Expected 0 spaces before semicolon; %s found'; Chris@0: $data = array($found); Chris@0: $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeSemicolon', $data); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->replaceToken(($closer + 1), ''); Chris@0: } Chris@0: } Chris@0: }//end if Chris@0: Chris@0: // Only want to check multi-keyword structures from here on. Chris@0: if ($tokens[$stackPtr]['code'] === T_DO) { Chris@0: $closer = false; Chris@0: if (isset($tokens[$stackPtr]['scope_closer']) === true) { Chris@0: $closer = $tokens[$stackPtr]['scope_closer']; Chris@0: } Chris@0: Chris@0: // Do-while loops should have curly braces. This is optional in Chris@0: // Javascript. Chris@0: if ($closer === false && $tokens[$stackPtr]['code'] === T_DO && $phpcsFile->tokenizerType === 'JS') { Chris@0: $error = 'The code block in a do-while loop should be surrounded by curly braces'; Chris@0: $fix = $phpcsFile->addFixableError($error, $stackPtr, 'DoWhileCurlyBraces'); Chris@0: $closer = $phpcsFile->findNext(T_WHILE, $stackPtr); Chris@0: if ($fix === true) { Chris@0: $phpcsFile->fixer->beginChangeset(); Chris@0: // Append an opening curly brace followed by a newline after Chris@0: // the DO. Chris@0: $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); Chris@0: if ($next !== ($stackPtr + 1)) { Chris@0: $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); Chris@0: } Chris@0: Chris@0: $phpcsFile->fixer->addContent($stackPtr, ' {'.$phpcsFile->eolChar); Chris@0: Chris@0: // Prepend a closing curly brace before the WHILE and ensure Chris@0: // it is on a new line. Chris@0: $prepend = $phpcsFile->eolChar; Chris@0: if ($tokens[($closer - 1)]['code'] === T_WHITESPACE) { Chris@0: $prepend = ''; Chris@0: if ($tokens[($closer - 1)]['content'] !== $phpcsFile->eolChar) { Chris@0: $phpcsFile->fixer->replaceToken(($closer - 1), $phpcsFile->eolChar); Chris@0: } Chris@0: } Chris@0: Chris@0: $phpcsFile->fixer->addContentBefore($closer, $prepend.'} '); Chris@0: $phpcsFile->fixer->endChangeset(); Chris@0: }//end if Chris@0: }//end if Chris@0: } else if ($tokens[$stackPtr]['code'] === T_ELSE Chris@0: || $tokens[$stackPtr]['code'] === T_ELSEIF Chris@0: || $tokens[$stackPtr]['code'] === T_CATCH Chris@0: ) { Chris@17: $closer = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); Chris@0: if ($closer === false || $tokens[$closer]['code'] !== T_CLOSE_CURLY_BRACKET) { Chris@0: return; Chris@0: } Chris@0: } else { Chris@0: return; Chris@0: }//end if Chris@0: Chris@0: if ($tokens[$stackPtr]['code'] === T_DO) { Chris@0: // Single space after closing brace. Chris@0: $found = 1; Chris@0: if ($tokens[($closer + 1)]['code'] !== T_WHITESPACE) { Chris@0: $found = 0; Chris@0: } else if ($tokens[($closer + 1)]['content'] !== ' ') { Chris@0: if (strpos($tokens[($closer + 1)]['content'], $phpcsFile->eolChar) !== false) { Chris@0: $found = 'newline'; Chris@0: } else { Chris@0: $found = strlen($tokens[($closer + 1)]['content']); Chris@0: } Chris@0: } Chris@0: Chris@0: if ($found !== 1) { Chris@0: $error = 'Expected 1 space after closing brace; %s found'; Chris@0: $data = array($found); Chris@0: $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceAfterCloseBrace', $data); Chris@0: if ($fix === true) { Chris@0: if ($found === 0) { Chris@0: $phpcsFile->fixer->addContent($closer, ' '); Chris@0: } else { Chris@0: $phpcsFile->fixer->replaceToken(($closer + 1), ' '); Chris@0: } Chris@0: } Chris@0: } Chris@0: } else { Chris@0: // New line after closing brace. Chris@0: $found = 'newline'; Chris@0: if ($tokens[($closer + 1)]['code'] !== T_WHITESPACE) { Chris@0: $found = 'none'; Chris@0: } else if (strpos($tokens[($closer + 1)]['content'], "\n") === false) { Chris@0: $found = 'spaces'; Chris@0: } Chris@0: Chris@0: if ($found !== 'newline') { Chris@0: $error = 'Expected newline after closing brace'; Chris@0: $fix = $phpcsFile->addFixableError($error, $closer, 'NewlineAfterCloseBrace'); Chris@0: if ($fix === true) { Chris@0: if ($found === 'none') { Chris@0: $phpcsFile->fixer->addContent($closer, "\n"); Chris@0: } else { Chris@0: $phpcsFile->fixer->replaceToken(($closer + 1), "\n"); Chris@0: } Chris@0: } Chris@0: } Chris@0: }//end if Chris@0: Chris@0: }//end process() Chris@0: Chris@0: Chris@0: }//end class