You are here

class PostStatementCommentSniff in Coder 8.2

Same name and namespace in other branches
  1. 8.3 coder_sniffer/Drupal/Sniffs/Commenting/PostStatementCommentSniff.php \Drupal\Sniffs\Commenting\PostStatementCommentSniff
  2. 8.3.x coder_sniffer/Drupal/Sniffs/Commenting/PostStatementCommentSniff.php \Drupal\Sniffs\Commenting\PostStatementCommentSniff

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

@category PHP @package PHP_CodeSniffer @link http://pear.php.net/package/PHP_CodeSniffer

Hierarchy

Expanded class hierarchy of PostStatementCommentSniff

File

coder_sniffer/Drupal/Sniffs/Commenting/PostStatementCommentSniff.php, line 24

Namespace

Drupal\Sniffs\Commenting
View source
class PostStatementCommentSniff implements Sniff {

  /**
   * A list of tokenizers this sniff supports.
   *
   * @var array
   */
  public $supportedTokenizers = array(
    'PHP',
  );

  /**
   * Returns an array of tokens this test wants to listen for.
   *
   * @return array
   */
  public function register() {
    return array(
      T_COMMENT,
    );
  }

  //end register()

  /**
   * Processes this sniff, when one of its tokens is encountered.
   *
   * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
   * @param int                         $stackPtr  The position of the current token in the
   *                                               stack passed in $tokens.
   *
   * @return void
   */
  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();
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
PostStatementCommentSniff::$supportedTokenizers public property A list of tokenizers this sniff supports.
PostStatementCommentSniff::process public function Processes this sniff, when one of its tokens is encountered.
PostStatementCommentSniff::register public function Returns an array of tokens this test wants to listen for.