Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. IncrementDecrementUsageSniff.php

function IncrementDecrementUsageSniff::processAssignment

Checks to ensure increment and decrement operators are used.

Parameters

\PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.:

int $stackPtr The position of the current token: in the stack passed in $tokens.

Return value

void

1 call to IncrementDecrementUsageSniff::processAssignment()
IncrementDecrementUsageSniff::process in vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php
Processes this test, when one of its tokens is encountered.

File

vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php, line 119

Class

IncrementDecrementUsageSniff

Namespace

PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators

Code

protected function processAssignment($phpcsFile, $stackPtr) {
    $tokens = $phpcsFile->getTokens();
    $assignedVar = $phpcsFile->findPrevious(Tokens::$emptyTokens, $stackPtr - 1, null, true);
    // Not an assignment, return.
    if ($tokens[$assignedVar]['code'] !== T_VARIABLE) {
        return;
    }
    $statementEnd = $phpcsFile->findNext([
        T_SEMICOLON,
        T_CLOSE_PARENTHESIS,
        T_CLOSE_SQUARE_BRACKET,
        T_CLOSE_CURLY_BRACKET,
    ], $stackPtr);
    // If there is anything other than variables, numbers, spaces or operators we need to return.
    $find = Tokens::$emptyTokens;
    $find[] = T_LNUMBER;
    $find[] = T_VARIABLE;
    $find[] = T_PLUS;
    $find[] = T_MINUS;
    $find[] = T_OPEN_PARENTHESIS;
    $noiseTokens = $phpcsFile->findNext($find, $stackPtr + 1, $statementEnd, true);
    if ($noiseTokens !== false) {
        return;
    }
    // If we are already using += or -=, we need to ignore
    // the statement if a variable is being used.
    if ($tokens[$stackPtr]['code'] !== T_EQUAL) {
        $nextVar = $phpcsFile->findNext(T_VARIABLE, $stackPtr + 1, $statementEnd);
        if ($nextVar !== false) {
            return;
        }
    }
    if ($tokens[$stackPtr]['code'] === T_EQUAL) {
        $nextVar = $stackPtr;
        $previousVariable = $stackPtr;
        $variableCount = 0;
        while (($nextVar = $phpcsFile->findNext(T_VARIABLE, $nextVar + 1, $statementEnd)) !== false) {
            $previousVariable = $nextVar;
            $variableCount++;
        }
        if ($variableCount !== 1) {
            return;
        }
        $nextVar = $previousVariable;
        if ($tokens[$nextVar]['content'] !== $tokens[$assignedVar]['content']) {
            return;
        }
    }
    // We have only one variable, and it's the same as what is being assigned,
    // so we need to check what is being added or subtracted.
    $nextNumber = $stackPtr;
    $previousNumber = $stackPtr;
    $numberCount = 0;
    while (($nextNumber = $phpcsFile->findNext([
        T_LNUMBER,
    ], $nextNumber + 1, $statementEnd, false)) !== false) {
        $previousNumber = $nextNumber;
        $numberCount++;
    }
    if ($numberCount !== 1) {
        return;
    }
    $nextNumber = $previousNumber;
    if ($tokens[$nextNumber]['content'] === '1') {
        if ($tokens[$stackPtr]['code'] === T_EQUAL) {
            $opToken = $phpcsFile->findNext([
                T_PLUS,
                T_MINUS,
            ], $nextVar + 1, $statementEnd);
            if ($opToken === false) {
                // Operator was before the variable, like:
                // $var = 1 + $var;
                // So we ignore it.
                return;
            }
            $operator = $tokens[$opToken]['content'];
        }
        else {
            $operator = substr($tokens[$stackPtr]['content'], 0, 1);
        }
        // If we are adding or subtracting negative value, the operator
        // needs to be reversed.
        if ($tokens[$stackPtr]['code'] !== T_EQUAL) {
            $negative = $phpcsFile->findPrevious(T_MINUS, $nextNumber - 1, $stackPtr);
            if ($negative !== false) {
                if ($operator === '+') {
                    $operator = '-';
                }
                else {
                    $operator = '+';
                }
            }
        }
        $expected = $operator . $operator . $tokens[$assignedVar]['content'];
        $found = $phpcsFile->getTokensAsString($assignedVar, $statementEnd - $assignedVar + 1);
        if ($operator === '+') {
            $error = 'Increment';
        }
        else {
            $error = 'Decrement';
        }
        $error .= " operators should be used where possible; found \"{$found}\" but expected \"{$expected}\"";
        $phpcsFile->addError($error, $stackPtr, 'Found');
    }
    
    //end if
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal