You are here

public function PostStatementCommentSniff::process in Coder 8.3.x

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

Processes this sniff, 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/PostStatementCommentSniff.php, line 49

Class

PostStatementCommentSniff
Largely copied from \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\PostStatementCommentSniff but we want the fixer to move the comment to the previous line.

Namespace

Drupal\Sniffs\Commenting

Code

public function process(File $phpcsFile, $stackPtr) {
  $tokens = $phpcsFile
    ->getTokens();
  if (substr($tokens[$stackPtr]['content'], 0, 2) !== '//') {
    return;
  }
  $commentLine = $tokens[$stackPtr]['line'];
  $lastContent = $phpcsFile
    ->findPrevious(T_WHITESPACE, $stackPtr - 1, null, true);
  if ($tokens[$lastContent]['line'] !== $commentLine) {
    return;
  }
  if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) {
    return;
  }

  // Special case for JS files.
  if ($tokens[$lastContent]['code'] === T_COMMA || $tokens[$lastContent]['code'] === T_SEMICOLON) {
    $lastContent = $phpcsFile
      ->findPrevious(T_WHITESPACE, $lastContent - 1, null, true);
    if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) {
      return;
    }
  }
  $error = 'Comments may not appear after statements';
  $fix = $phpcsFile
    ->addFixableError($error, $stackPtr, 'Found');
  if ($fix === true) {
    if ($tokens[$lastContent]['code'] === T_OPEN_TAG) {
      $phpcsFile->fixer
        ->addNewlineBefore($stackPtr);
      return;
    }
    $lineStart = $stackPtr;
    while ($tokens[$lineStart]['line'] === $tokens[$stackPtr]['line'] && $tokens[$lineStart]['code'] !== T_OPEN_TAG) {
      $lineStart--;
    }
    $phpcsFile->fixer
      ->beginChangeset();
    $phpcsFile->fixer
      ->addContent($lineStart, $tokens[$stackPtr]['content']);
    $phpcsFile->fixer
      ->replaceToken($stackPtr, $phpcsFile->eolChar);
    $phpcsFile->fixer
      ->endChangeset();
  }
}