Source for file OperatorSpacingSniff.php
Documentation is available at OperatorSpacingSniff.php
* Verifies that operators have valid spacing surrounding them.
* @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\WhiteSpace;
use PHP_CodeSniffer\Sniffs\Sniff;
use PHP_CodeSniffer\Files\File;
use PHP_CodeSniffer\Util\Tokens;
class OperatorSpacingSniff implements Sniff
* A list of tokenizers this sniff supports.
public $supportedTokenizers = array (
* Allow newlines instead of spaces.
public $ignoreNewlines = false;
* Returns an array of tokens this test wants to listen for.
public function register ()
$comparison = Tokens ::$comparisonTokens;
$operators = Tokens ::$operators;
$assignment = Tokens ::$assignmentTokens;
array_merge($comparison, $operators, $assignment, $inlineIf)
* Processes this sniff, when one of its tokens is encountered.
* @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked.
* @param int $stackPtr The position of the current token in
* the stack passed in $tokens.
public function process (File $phpcsFile, $stackPtr)
$tokens = $phpcsFile->getTokens ();
// Skip default values in function declarations.
// Skip declare statements.
if ($tokens[$stackPtr]['code'] === T_EQUAL
|| $tokens[$stackPtr]['code'] === T_MINUS
if (isset ($tokens[$stackPtr]['nested_parenthesis']) === true ) {
$parenthesis = array_keys($tokens[$stackPtr]['nested_parenthesis']);
if (isset ($tokens[$bracket]['parenthesis_owner']) === true ) {
$function = $tokens[$bracket]['parenthesis_owner'];
if ($tokens[$function]['code'] === T_FUNCTION
|| $tokens[$function]['code'] === T_DECLARE
if ($tokens[$stackPtr]['code'] === T_EQUAL) {
if (isset ($tokens[($stackPtr + 1 )]) === true
// If it's not a reference, then we expect one space either side of the
if ($phpcsFile->isReference ($stackPtr) === true ) {
// Check there is one space before the & operator.
if ($tokens[($stackPtr - 1 )]['code'] !== T_WHITESPACE ) {
$error = 'Expected 1 space before "&" operator; 0 found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceBeforeAmp');
$phpcsFile->fixer ->addContentBefore ($stackPtr, ' ');
$phpcsFile->recordMetric ($stackPtr, 'Space before operator', 0 );
if ($tokens[($stackPtr - 2 )]['line'] !== $tokens[$stackPtr]['line']) {
$found = $tokens[($stackPtr - 1 )]['length'];
$phpcsFile->recordMetric ($stackPtr, 'Space before operator', $found);
&& ($found !== 'newline' || $this->ignoreNewlines === false )
$error = 'Expected 1 space before "&" operator; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingBeforeAmp', $data);
$phpcsFile->fixer ->replaceToken (($stackPtr - 1 ), ' ');
// Check there is one space after the & operator.
if ($tokens[($stackPtr + 1 )]['code'] !== T_WHITESPACE ) {
$error = 'Expected 1 space after "&" operator; 0 found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceAfterAmp');
$phpcsFile->fixer ->addContent ($stackPtr, ' ');
$phpcsFile->recordMetric ($stackPtr, 'Space after operator', 0 );
if ($tokens[($stackPtr + 2 )]['line'] !== $tokens[$stackPtr]['line']) {
$found = $tokens[($stackPtr + 1 )]['length'];
$phpcsFile->recordMetric ($stackPtr, 'Space after operator', $found);
&& ($found !== 'newline' || $this->ignoreNewlines === false )
$error = 'Expected 1 space after "&" operator; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingAfterAmp', $data);
$phpcsFile->fixer ->replaceToken (($stackPtr + 1 ), ' ');
if ($tokens[$stackPtr]['code'] === T_MINUS || $tokens[$stackPtr]['code'] === T_PLUS) {
// Check minus spacing, but make sure we aren't just assigning
// a minus value or returning one.
$prev = $phpcsFile->findPrevious (Tokens ::$emptyTokens, ($stackPtr - 1 ), null , true );
if ($tokens[$prev]['code'] === T_RETURN ) {
// Just returning a negative value; eg. (return -1).
if (isset (Tokens ::$operators[$tokens[$prev]['code']]) === true ) {
// Just trying to operate on a negative value; eg. ($var * -1).
if (isset (Tokens ::$comparisonTokens[$tokens[$prev]['code']]) === true ) {
// Just trying to compare a negative value; eg. ($var === -1).
if (isset (Tokens ::$booleanOperators[$tokens[$prev]['code']]) === true ) {
// Just trying to compare a negative value; eg. ($var || -1 === $b).
if (isset (Tokens ::$assignmentTokens[$tokens[$prev]['code']]) === true ) {
// Just trying to assign a negative value; eg. ($var = -1).
// A list of tokens that indicate that the token is not
// part of an arithmetic operation.
if (isset ($invalidTokens[$tokens[$prev]['code']]) === true ) {
// Just trying to use a negative value; eg. myFunction($var, -2).
$operator = $tokens[$stackPtr]['content'];
if ($tokens[($stackPtr - 1 )]['code'] !== T_WHITESPACE
$error = " Expected 1 space before \"$operator\"; 0 found";
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceBefore');
$phpcsFile->fixer ->addContentBefore ($stackPtr, ' ');
$phpcsFile->recordMetric ($stackPtr, 'Space before operator', 0 );
} else if (isset (Tokens ::$assignmentTokens[$tokens[$stackPtr]['code']]) === false ) {
// Don't throw an error for assignments, because other standards allow
// multiple spaces there to align multiple assignments.
if ($tokens[($stackPtr - 2 )]['line'] !== $tokens[$stackPtr]['line']) {
$found = $tokens[($stackPtr - 1 )]['length'];
$phpcsFile->recordMetric ($stackPtr, 'Space before operator', $found);
&& ($found !== 'newline' || $this->ignoreNewlines === false )
$error = 'Expected 1 space before "%s"; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingBefore', $data);
$phpcsFile->fixer ->beginChangeset ();
if ($found === 'newline') {
while ($tokens[$i]['code'] === T_WHITESPACE ) {
$phpcsFile->fixer ->replaceToken ($i, '');
$phpcsFile->fixer ->replaceToken (($stackPtr - 1 ), ' ');
$phpcsFile->fixer ->endChangeset ();
if (isset ($tokens[($stackPtr + 1 )]) === false ) {
if ($tokens[($stackPtr + 1 )]['code'] !== T_WHITESPACE ) {
// Skip short ternary such as: "$foo = $bar ?: true;".
$error = " Expected 1 space after \"$operator\"; 0 found";
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'NoSpaceAfter');
$phpcsFile->fixer ->addContent ($stackPtr, ' ');
$phpcsFile->recordMetric ($stackPtr, 'Space after operator', 0 );
if (isset ($tokens[($stackPtr + 2 )]) === true
&& $tokens[($stackPtr + 2 )]['line'] !== $tokens[$stackPtr]['line']
$found = $tokens[($stackPtr + 1 )]['length'];
$phpcsFile->recordMetric ($stackPtr, 'Space after operator', $found);
&& ($found !== 'newline' || $this->ignoreNewlines === false )
$error = 'Expected 1 space after "%s"; %s found';
$fix = $phpcsFile->addFixableError ($error, $stackPtr, 'SpacingAfter', $data);
$phpcsFile->fixer ->replaceToken (($stackPtr + 1 ), ' ');
Documentation generated on Mon, 11 Mar 2019 15:27:40 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|