getTokens(); // Skip default values in function declarations. // and 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']); $bracket = array_pop($parenthesis); if (isset($tokens[$bracket]['parenthesis_owner']) === true) { $function = $tokens[$bracket]['parenthesis_owner']; if ( $tokens[$function]['code'] === T_FUNCTION || $tokens[$function]['code'] === T_DECLARE ) { return; } } } } if ($tokens[$stackPtr]['code'] === T_EQUAL) { // Skip for '=&' case. if (isset($tokens[($stackPtr + 1)]) === true && $tokens[($stackPtr + 1)]['code'] === T_BITWISE_AND) { return; } } if ($tokens[$stackPtr]['code'] === T_BITWISE_AND) { // If its not a reference, then we expect one space either side of the // bitwise operator. if (!$phpcsFile->isReference($stackPtr) && !$this->_isVariable($stackPtr, $tokens, $phpcsFile)) { // 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'); if ($fix === true) { $phpcsFile->fixer->addContentBefore($stackPtr, ' '); } } // 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'); if ($fix === true) { $phpcsFile->fixer->addContent($stackPtr, ' '); } } } } else { if ($tokens[$stackPtr]['code'] === T_MINUS) { // Skip declaration of negative value in new array format; eg. $arr = [-1]. if ($tokens[($stackPtr - 1)]['code'] === T_OPEN_SHORT_ARRAY) { return; } // Check minus spacing, but make sure we aren't just assigning // a minus value or returning one. $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); if ($tokens[$prev]['code'] === T_RETURN) { // Just returning a negative value; eg. return -1. return; } if (in_array($tokens[$prev]['code'], Tokens::$operators) === true) { // Just trying to operate on a negative value; eg. ($var * -1). return; } if (in_array($tokens[$prev]['code'], Tokens::$comparisonTokens) === true) { // Just trying to compare a negative value; eg. ($var === -1). return; } // A list of tokens that indicate that the token is not // part of an arithmetic operation. $invalidTokens = [ T_COMMA, T_OPEN_PARENTHESIS, T_OPEN_SQUARE_BRACKET, T_DOUBLE_ARROW, T_COLON, T_INLINE_THEN, T_INLINE_ELSE, T_CASE, ]; if (in_array($tokens[$prev]['code'], $invalidTokens) === true) { // Just trying to use a negative value; eg. myFunction($var, -2). return; } if (in_array($tokens[$prev]['code'], Tokens::$assignmentTokens) === true) { // Just trying to assign a negative value; eg. ($var = -1). return; } } $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'); if ($fix === true) { $phpcsFile->fixer->addContentBefore($stackPtr, ' '); } } if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { $error = "Expected 1 space after \"$operator\"; 0 found"; $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfter'); if ($fix === true) { $phpcsFile->fixer->addContent($stackPtr, ' '); } } } } /** * Check if the current token is inside an array. * * @param int $stackPtr The current token offset. * @param array $tokens The current token list. * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. * @return bool */ protected function _isVariable($stackPtr, $tokens, $phpcsFile) { $tokenAfter = $phpcsFile->findNext( Tokens::$emptyTokens, ($stackPtr + 1), null, true ); $tokenBefore = $phpcsFile->findNext( Tokens::$emptyTokens, ($stackPtr - 1), null, true ); return ($tokens[$tokenAfter]['code'] === T_VARIABLE && ( $tokens[$tokenBefore]['code'] === T_OPEN_PARENTHESIS || $tokens[$tokenBefore]['code'] === T_COMMA || $tokens[$tokenBefore]['code'] === T_OPEN_SHORT_ARRAY ) ); } }