You are here

public function DocCommentAlignmentSniff::process in Coder 8.2

Same name and namespace in other branches
  1. 8.3 coder_sniffer/Drupal/Sniffs/Commenting/DocCommentAlignmentSniff.php \Drupal\Sniffs\Commenting\DocCommentAlignmentSniff::process()
  2. 8.3.x coder_sniffer/Drupal/Sniffs/Commenting/DocCommentAlignmentSniff.php \Drupal\Sniffs\Commenting\DocCommentAlignmentSniff::process()

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

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

File

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

Class

DocCommentAlignmentSniff
Largely copied from \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\DocCommentAlignmentSniff to also handle the "var" keyword. See https://github.com/squizlabs/PHP_CodeSniffer/pull/1212

Namespace

Drupal\Sniffs\Commenting

Code

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

  // We are only interested in function/class/interface doc block comments.
  $ignore = Tokens::$emptyTokens;
  if ($phpcsFile->tokenizerType === 'JS') {
    $ignore[] = T_EQUAL;
    $ignore[] = T_STRING;
    $ignore[] = T_OBJECT_OPERATOR;
  }
  $nextToken = $phpcsFile
    ->findNext($ignore, $stackPtr + 1, null, true);
  $ignore = array(
    T_CLASS => true,
    T_INTERFACE => true,
    T_FUNCTION => true,
    T_PUBLIC => true,
    T_PRIVATE => true,
    T_PROTECTED => true,
    T_STATIC => true,
    T_ABSTRACT => true,
    T_PROPERTY => true,
    T_OBJECT => true,
    T_PROTOTYPE => true,
    T_VAR => true,
  );
  if (isset($ignore[$tokens[$nextToken]['code']]) === false) {

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

  // There must be one space after each star (unless it is an empty comment line)
  // and all the stars must be aligned correctly.
  $requiredColumn = $tokens[$stackPtr]['column'] + 1;
  $endComment = $tokens[$stackPtr]['comment_closer'];
  for ($i = $stackPtr + 1; $i <= $endComment; $i++) {
    if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR && $tokens[$i]['code'] !== T_DOC_COMMENT_CLOSE_TAG) {
      continue;
    }
    if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) {

      // Can't process the close tag if it is not the first thing on the line.
      $prev = $phpcsFile
        ->findPrevious(T_DOC_COMMENT_WHITESPACE, $i - 1, $stackPtr, true);
      if ($tokens[$prev]['line'] === $tokens[$i]['line']) {
        continue;
      }
    }
    if ($tokens[$i]['column'] !== $requiredColumn) {
      $error = 'Expected %s space(s) before asterisk; %s found';
      $data = array(
        $requiredColumn - 1,
        $tokens[$i]['column'] - 1,
      );
      $fix = $phpcsFile
        ->addFixableError($error, $i, 'SpaceBeforeStar', $data);
      if ($fix === true) {
        $padding = str_repeat(' ', $requiredColumn - 1);
        if ($tokens[$i]['column'] === 1) {
          $phpcsFile->fixer
            ->addContentBefore($i, $padding);
        }
        else {
          $phpcsFile->fixer
            ->replaceToken($i - 1, $padding);
        }
      }
    }
    if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR) {
      continue;
    }
    if ($tokens[$i + 2]['line'] !== $tokens[$i]['line']) {

      // Line is empty.
      continue;
    }
    if ($tokens[$i + 1]['code'] !== T_DOC_COMMENT_WHITESPACE) {
      $error = 'Expected 1 space after asterisk; 0 found';
      $fix = $phpcsFile
        ->addFixableError($error, $i, 'NoSpaceAfterStar');
      if ($fix === true) {
        $phpcsFile->fixer
          ->addContent($i, ' ');
      }
    }
    else {
      if ($tokens[$i + 2]['code'] === T_DOC_COMMENT_TAG && $tokens[$i + 1]['content'] !== ' ') {
        $error = 'Expected 1 space after asterisk; %s found';
        $data = array(
          strlen($tokens[$i + 1]['content']),
        );
        $fix = $phpcsFile
          ->addFixableError($error, $i, 'SpaceAfterStar', $data);
        if ($fix === true) {
          $phpcsFile->fixer
            ->replaceToken($i + 1, ' ');
        }
      }
    }
  }

  //end for
}