Source for file ControlSignatureSniff.php
Documentation is available at ControlSignatureSniff.php
* Verifies that control statements conform to their coding standards.
* @author Greg Sherwood <gsherwood@squiz.net>
* @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
* @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures;
use PHP_CodeSniffer\Sniffs\Sniff;
use PHP_CodeSniffer\Files\File;
use PHP_CodeSniffer\Util\Tokens;
class ControlSignatureSniff implements Sniff
* A list of tokenizers this sniff supports.
public $supportedTokenizers = array (
* Returns an array of tokens this test wants to listen for.
public function register ()
* Processes this test, when one of its tokens is encountered.
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
* @param int $stackPtr The position of the current token in the
* stack passed in $tokens.
public function process (File $phpcsFile, $stackPtr)
$tokens = $phpcsFile->getTokens ();
if (isset ($tokens[($stackPtr + 1 )]) === false ) {
// Single space after the keyword.
if ($tokens[($stackPtr + 1 )]['code'] !== T_WHITESPACE ) {
} else if ($tokens[($stackPtr + 1 )]['content'] !== ' ') {
if (strpos($tokens[($stackPtr + 1 )]['content'], $phpcsFile->eolChar ) !== false ) {
$found = strlen($tokens[($stackPtr + 1 )]['content']);
$error = 'Expected 1 space after %s keyword; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpaceAfterKeyword', $data);
$phpcsFile->fixer ->addContent ($stackPtr, ' ');
$phpcsFile->fixer ->replaceToken (($stackPtr + 1 ), ' ');
// Single space after closing parenthesis.
if (isset ($tokens[$stackPtr]['parenthesis_closer']) === true
&& isset ($tokens[$stackPtr]['scope_opener']) === true
$closer = $tokens[$stackPtr]['parenthesis_closer'];
$opener = $tokens[$stackPtr]['scope_opener'];
$content = $phpcsFile->getTokensAsString (($closer + 1 ), ($opener - $closer - 1 ));
$error = 'Expected 1 space after closing parenthesis; found %s';
if ($tokens[$closer]['line'] !== $tokens[$opener]['line']) {
} else if (trim($content) === '') {
$found = '"'. str_replace($phpcsFile->eolChar , '\n', $content). '"';
$fix = $phpcsFile->addFixableError ($error, $closer, 'SpaceAfterCloseParenthesis', array ($found));
if ($closer === ($opener - 1 )) {
$phpcsFile->fixer ->addContent ($closer, ' ');
$phpcsFile->fixer ->beginChangeset ();
if (trim($content) === '') {
$phpcsFile->fixer ->addContent ($closer, ' ');
for ($i = ($closer + 1 ); $i < $opener; $i++ ) {
$phpcsFile->fixer ->replaceToken ($i, '');
$phpcsFile->fixer ->addContent ($closer, ' '. $tokens[$opener]['content']);
$phpcsFile->fixer ->replaceToken ($opener, '');
if ($tokens[$opener]['line'] !== $tokens[$closer]['line']) {
$next = $phpcsFile->findNext (T_WHITESPACE , ($opener + 1 ), null , true );
if ($tokens[$next]['line'] !== $tokens[$opener]['line']) {
for ($i = ($opener + 1 ); $i < $next; $i++ ) {
$phpcsFile->fixer ->replaceToken ($i, '');
$phpcsFile->fixer ->endChangeset ();
// Single newline after opening brace.
if (isset ($tokens[$stackPtr]['scope_opener']) === true ) {
$opener = $tokens[$stackPtr]['scope_opener'];
for ($next = ($opener + 1 ); $next < $phpcsFile->numTokens; $next++ ) {
$code = $tokens[$next]['code'];
if ($code === T_WHITESPACE
|| ($code === T_INLINE_HTML
&& trim($tokens[$next]['content']) === '')
// Skip all empty tokens on the same line as the opener.
if ($tokens[$next]['line'] === $tokens[$opener]['line']
&& (isset (Tokens ::$emptyTokens[$code]) === true
|| $code === T_CLOSE_TAG )
// We found the first bit of a code, or a comment on the
if ($tokens[$next]['line'] === $tokens[$opener]['line']) {
$error = 'Newline required after opening brace';
$fix = $phpcsFile->addFixableError ($error, $opener, 'NewlineAfterOpenBrace');
$phpcsFile->fixer ->beginChangeset ();
for ($i = ($opener + 1 ); $i < $next; $i++ ) {
if (trim($tokens[$i]['content']) !== '') {
$phpcsFile->fixer ->replaceToken ($i, '');
$phpcsFile->fixer ->addContent ($opener, $phpcsFile->eolChar );
$phpcsFile->fixer ->endChangeset ();
} else if ($tokens[$stackPtr]['code'] === T_WHILE ) {
// Zero spaces after parenthesis closer.
$closer = $tokens[$stackPtr]['parenthesis_closer'];
if ($tokens[($closer + 1 )]['code'] === T_WHITESPACE ) {
if (strpos($tokens[($closer + 1 )]['content'], $phpcsFile->eolChar ) !== false ) {
$found = strlen($tokens[($closer + 1 )]['content']);
$error = 'Expected 0 spaces before semicolon; %s found';
$fix = $phpcsFile->addFixableError ($error, $closer, 'SpaceBeforeSemicolon', $data);
$phpcsFile->fixer ->replaceToken (($closer + 1 ), '');
// Only want to check multi-keyword structures from here on.
if ($tokens[$stackPtr]['code'] === T_DO ) {
if (isset ($tokens[$stackPtr]['scope_closer']) === false ) {
$closer = $tokens[$stackPtr]['scope_closer'];
} else if ($tokens[$stackPtr]['code'] === T_ELSE
|| $tokens[$stackPtr]['code'] === T_ELSEIF
|| $tokens[$stackPtr]['code'] === T_CATCH
if (isset ($tokens[$stackPtr]['scope_opener']) === true
&& $tokens[$tokens[$stackPtr]['scope_opener']]['code'] === T_COLON
// Special case for alternate syntax, where this token is actually
// the closer for the previous block, so there is no spacing to check.
$closer = $phpcsFile->findPrevious (Tokens ::$emptyTokens, ($stackPtr - 1 ), null , true );
// Single space after closing brace.
if ($tokens[($closer + 1 )]['code'] !== T_WHITESPACE ) {
} else if ($tokens[($closer + 1 )]['content'] !== ' ') {
if (strpos($tokens[($closer + 1 )]['content'], $phpcsFile->eolChar ) !== false ) {
$found = strlen($tokens[($closer + 1 )]['content']);
$error = 'Expected 1 space after closing brace; %s found';
$fix = $phpcsFile->addFixableError ($error, $closer, 'SpaceAfterCloseBrace', $data);
$phpcsFile->fixer ->addContent ($closer, ' ');
$phpcsFile->fixer ->replaceToken (($closer + 1 ), ' ');
Documentation generated on Mon, 11 Mar 2019 15:27:21 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|