You are here

PostStatementCommentSniff.php in Coder 8.2

File

coder_sniffer/Drupal/Sniffs/Commenting/PostStatementCommentSniff.php
View source
<?php

/**
 * \Drupal\Sniffs\Commenting\PostStatementCommentSniff.
 *
 * @category PHP
 * @package  PHP_CodeSniffer
 * @link     http://pear.php.net/package/PHP_CodeSniffer
 */
namespace Drupal\Sniffs\Commenting;

use PHP_CodeSniffer\Files\File;
use PHP_CodeSniffer\Sniffs\Sniff;

/**
 * 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
 */
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();
    }
  }

}

//end class

Classes

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