You are here

public function Drupal_Sniffs_Commenting_DocCommentAlignmentSniff::process in Coder 7.2

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

Parameters

PHP_CodeSniffer_File $phpcsFile The file being scanned.:

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

Return value

void

File

coder_sniffer/Drupal/Sniffs/Commenting/DocCommentAlignmentSniff.php, line 48

Class

Drupal_Sniffs_Commenting_DocCommentAlignmentSniff
Drupal_Sniffs_Commenting_DocCommentAlignmentSniff.

Code

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

  // We are only interested in function/class/interface doc block comments.
  $nextToken = $phpcsFile
    ->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, $stackPtr + 1, null, true);
  $ignore = array(
    T_CLASS,
    T_INTERFACE,
    T_FUNCTION,
    T_PUBLIC,
    T_PRIVATE,
    T_PROTECTED,
    T_STATIC,
    T_ABSTRACT,
  );
  if (in_array($tokens[$nextToken]['code'], $ignore) === false) {

    // Could be a file comment.
    $prevToken = $phpcsFile
      ->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, $stackPtr - 1, null, true);
    if ($tokens[$prevToken]['code'] !== T_OPEN_TAG) {
      return;
    }
  }

  // We only want to get the first comment in a block. If there is
  // a comment on the line before this one, return.
  $docComment = $phpcsFile
    ->findPrevious(T_DOC_COMMENT, $stackPtr - 1);
  if ($docComment !== false) {
    if ($tokens[$docComment]['line'] === $tokens[$stackPtr]['line'] - 1) {
      return;
    }
  }
  $comments = array(
    $stackPtr,
  );
  $currentComment = $stackPtr;
  $lastComment = $stackPtr;
  while (($currentComment = $phpcsFile
    ->findNext(T_DOC_COMMENT, $currentComment + 1)) !== false) {
    if ($tokens[$lastComment]['line'] === $tokens[$currentComment]['line'] - 1) {
      $comments[] = $currentComment;
      $lastComment = $currentComment;
    }
    else {
      break;
    }
  }

  // The $comments array now contains pointers to each token in the
  // comment block.
  $requiredColumn = strpos($tokens[$stackPtr]['content'], '*');
  $requiredColumn += $tokens[$stackPtr]['column'];
  foreach ($comments as $commentPointer) {

    // Check the spacing after each asterisk.
    $content = $tokens[$commentPointer]['content'];
    $firstChar = substr($content, 0, 1);
    $lastChar = substr($content, -1);
    if ($firstChar !== '/' && $lastChar !== '/') {
      $matches = array();
      preg_match('|^(\\s+)?\\*(\\s+)?@|', $content, $matches);
      if (empty($matches) === false) {
        if (isset($matches[2]) === false) {
          $error = 'Expected 1 space between asterisk and tag; 0 found';
          $phpcsFile
            ->addError($error, $commentPointer, 'NoSpaceBeforeTag');
        }
        else {
          $length = strlen($matches[2]);
          if ($length !== 1) {
            $error = 'Expected 1 space between asterisk and tag; %s found';
            $data = array(
              $length,
            );
            $phpcsFile
              ->addError($error, $commentPointer, 'SpaceBeforeTag', $data);
          }
        }
      }
    }

    //end foreach

    // Check the alignment of each asterisk.
    $currentColumn = strpos($content, '*');
    $currentColumn += $tokens[$commentPointer]['column'];
    if ($currentColumn === $requiredColumn) {

      // Star is aligned correctly.
      continue;
    }
    $error = 'Expected %s space(s) before asterisk; %s found';
    $data = array(
      $requiredColumn - 1,
      $currentColumn - 1,
    );
    $phpcsFile
      ->addError($error, $commentPointer, 'SpaceBeforeAsterisk', $data);
  }

  //end foreach
  if (trim($tokens[$lastComment - 1]['content']) === '*') {
    $error = 'Additional blank line found at the end of doc comment';
    $phpcsFile
      ->addError($error, $lastComment - 1, 'BlankLine');
  }
}