You are here

public function Drupal_Sniffs_WhiteSpace_ObjectOperatorIndentSniff::process in Coder 7.2

Processes this test, when one of its tokens is encountered.

Parameters

PHP_CodeSniffer_File $phpcsFile All the tokens found in the document.:

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

Return value

void

File

coder_sniffer/Drupal/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php, line 54

Class

Drupal_Sniffs_WhiteSpace_ObjectOperatorIndentSniff
Drupal_Sniffs_WhiteSpace_ObjectOperatorIndentSniff.

Code

public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
  $tokens = $phpcsFile
    ->getTokens();

  // Make sure this is the first object operator in a chain of them.
  $prev = $phpcsFile
    ->findPrevious(T_WHITESPACE, $stackPtr - 1, null, true);
  if ($prev === false || $tokens[$prev]['code'] !== T_VARIABLE) {
    return;
  }

  // Make sure this is a chained call.
  $next = $phpcsFile
    ->findNext(T_OBJECT_OPERATOR, $stackPtr + 1, null, false, null, true);
  if ($next === false) {

    // Not a chained call.
    return;
  }

  // Determine correct indent.
  for ($i = $stackPtr - 1; $i >= 0; $i--) {
    if ($tokens[$i]['line'] !== $tokens[$stackPtr]['line']) {
      $i++;
      break;
    }
  }
  $requiredIndent = 0;
  if ($i >= 0 && $tokens[$i]['code'] === T_WHITESPACE) {
    $requiredIndent = strlen($tokens[$i]['content']);
  }
  $requiredIndent += 2;

  // Determine the scope of the original object operator.
  $origBrackets = null;
  if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) {
    $origBrackets = $tokens[$stackPtr]['nested_parenthesis'];
  }
  $origConditions = null;
  if (isset($tokens[$stackPtr]['conditions']) === true) {
    $origConditions = $tokens[$stackPtr]['conditions'];
  }

  // Check indentation of each object operator in the chain.
  while ($next !== false) {

    // Make sure it is in the same scope, otherwise dont check indent.
    $brackets = null;
    if (isset($tokens[$next]['nested_parenthesis']) === true) {
      $brackets = $tokens[$next]['nested_parenthesis'];
    }
    $conditions = null;
    if (isset($tokens[$next]['conditions']) === true) {
      $conditions = $tokens[$next]['conditions'];
    }
    if ($origBrackets === $brackets && $origConditions === $conditions) {

      // Make sure it starts a line, otherwise dont check indent.
      $indent = $tokens[$next - 1];
      if ($indent['code'] === T_WHITESPACE) {
        if ($indent['line'] === $tokens[$next]['line']) {
          $foundIndent = strlen($indent['content']);
        }
        else {
          $foundIndent = 0;
        }

        // @todo we have not established a coding standard for this,
        // disabled for now.

        /*if ($foundIndent !== ($requiredIndent-2)) {
              $error = "Object operator not indented correctly; expected $requiredIndent spaces but found $foundIndent";
              $phpcsFile->addError($error, $next);
          }*/
      }

      // It cant be the last thing on the line either.
      $content = $phpcsFile
        ->findNext(T_WHITESPACE, $next + 1, null, true);
      if ($tokens[$content]['line'] !== $tokens[$next]['line']) {
        $error = 'Object operator must be at the start of the line, not the end';
        $phpcsFile
          ->addError($error, $next);
      }
    }

    //end if
    $next = $phpcsFile
      ->findNext(T_OBJECT_OPERATOR, $next + 1, null, false, null, true);
  }

  //end while
}