annotate vendor/drupal/coder/coder_sniffer/Drupal/Sniffs/Commenting/DocCommentAlignmentSniff.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2 /**
Chris@17 3 * \Drupal\Sniffs\Commenting\DocCommentAlignmentSniff.
Chris@0 4 *
Chris@0 5 * @category PHP
Chris@0 6 * @package PHP_CodeSniffer
Chris@0 7 * @link http://pear.php.net/package/PHP_CodeSniffer
Chris@0 8 */
Chris@0 9
Chris@17 10 namespace Drupal\Sniffs\Commenting;
Chris@17 11
Chris@17 12 use PHP_CodeSniffer\Files\File;
Chris@17 13 use PHP_CodeSniffer\Sniffs\Sniff;
Chris@17 14 use PHP_CodeSniffer\Util\Tokens;
Chris@17 15
Chris@0 16 /**
Chris@17 17 * Largely copied from
Chris@17 18 * \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\DocCommentAlignmentSniff to also
Chris@0 19 * handle the "var" keyword. See
Chris@0 20 * https://github.com/squizlabs/PHP_CodeSniffer/pull/1212
Chris@0 21 *
Chris@0 22 * @category PHP
Chris@0 23 * @package PHP_CodeSniffer
Chris@0 24 * @link http://pear.php.net/package/PHP_CodeSniffer
Chris@0 25 */
Chris@17 26 class DocCommentAlignmentSniff implements Sniff
Chris@0 27 {
Chris@0 28
Chris@0 29
Chris@0 30 /**
Chris@0 31 * Returns an array of tokens this test wants to listen for.
Chris@0 32 *
Chris@0 33 * @return array
Chris@0 34 */
Chris@0 35 public function register()
Chris@0 36 {
Chris@0 37 return array(T_DOC_COMMENT_OPEN_TAG);
Chris@0 38
Chris@0 39 }//end register()
Chris@0 40
Chris@0 41
Chris@0 42 /**
Chris@0 43 * Processes this test, when one of its tokens is encountered.
Chris@0 44 *
Chris@17 45 * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
Chris@17 46 * @param int $stackPtr The position of the current token
Chris@17 47 * in the stack passed in $tokens.
Chris@0 48 *
Chris@0 49 * @return void
Chris@0 50 */
Chris@17 51 public function process(File $phpcsFile, $stackPtr)
Chris@0 52 {
Chris@0 53 $tokens = $phpcsFile->getTokens();
Chris@0 54
Chris@0 55 // We are only interested in function/class/interface doc block comments.
Chris@17 56 $ignore = Tokens::$emptyTokens;
Chris@0 57 if ($phpcsFile->tokenizerType === 'JS') {
Chris@0 58 $ignore[] = T_EQUAL;
Chris@0 59 $ignore[] = T_STRING;
Chris@0 60 $ignore[] = T_OBJECT_OPERATOR;
Chris@0 61 }
Chris@0 62
Chris@0 63 $nextToken = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true);
Chris@0 64 $ignore = array(
Chris@0 65 T_CLASS => true,
Chris@0 66 T_INTERFACE => true,
Chris@0 67 T_FUNCTION => true,
Chris@0 68 T_PUBLIC => true,
Chris@0 69 T_PRIVATE => true,
Chris@0 70 T_PROTECTED => true,
Chris@0 71 T_STATIC => true,
Chris@0 72 T_ABSTRACT => true,
Chris@0 73 T_PROPERTY => true,
Chris@0 74 T_OBJECT => true,
Chris@0 75 T_PROTOTYPE => true,
Chris@0 76 T_VAR => true,
Chris@0 77 );
Chris@0 78
Chris@0 79 if (isset($ignore[$tokens[$nextToken]['code']]) === false) {
Chris@0 80 // Could be a file comment.
Chris@17 81 $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true);
Chris@0 82 if ($tokens[$prevToken]['code'] !== T_OPEN_TAG) {
Chris@0 83 return;
Chris@0 84 }
Chris@0 85 }
Chris@0 86
Chris@0 87 // There must be one space after each star (unless it is an empty comment line)
Chris@0 88 // and all the stars must be aligned correctly.
Chris@0 89 $requiredColumn = ($tokens[$stackPtr]['column'] + 1);
Chris@0 90 $endComment = $tokens[$stackPtr]['comment_closer'];
Chris@0 91 for ($i = ($stackPtr + 1); $i <= $endComment; $i++) {
Chris@0 92 if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR
Chris@0 93 && $tokens[$i]['code'] !== T_DOC_COMMENT_CLOSE_TAG
Chris@0 94 ) {
Chris@0 95 continue;
Chris@0 96 }
Chris@0 97
Chris@0 98 if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) {
Chris@0 99 // Can't process the close tag if it is not the first thing on the line.
Chris@0 100 $prev = $phpcsFile->findPrevious(T_DOC_COMMENT_WHITESPACE, ($i - 1), $stackPtr, true);
Chris@0 101 if ($tokens[$prev]['line'] === $tokens[$i]['line']) {
Chris@0 102 continue;
Chris@0 103 }
Chris@0 104 }
Chris@0 105
Chris@0 106 if ($tokens[$i]['column'] !== $requiredColumn) {
Chris@0 107 $error = 'Expected %s space(s) before asterisk; %s found';
Chris@0 108 $data = array(
Chris@0 109 ($requiredColumn - 1),
Chris@0 110 ($tokens[$i]['column'] - 1),
Chris@0 111 );
Chris@0 112 $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeStar', $data);
Chris@0 113 if ($fix === true) {
Chris@0 114 $padding = str_repeat(' ', ($requiredColumn - 1));
Chris@0 115 if ($tokens[$i]['column'] === 1) {
Chris@0 116 $phpcsFile->fixer->addContentBefore($i, $padding);
Chris@0 117 } else {
Chris@0 118 $phpcsFile->fixer->replaceToken(($i - 1), $padding);
Chris@0 119 }
Chris@0 120 }
Chris@0 121 }
Chris@0 122
Chris@0 123 if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR) {
Chris@0 124 continue;
Chris@0 125 }
Chris@0 126
Chris@0 127 if ($tokens[($i + 2)]['line'] !== $tokens[$i]['line']) {
Chris@0 128 // Line is empty.
Chris@0 129 continue;
Chris@0 130 }
Chris@0 131
Chris@0 132 if ($tokens[($i + 1)]['code'] !== T_DOC_COMMENT_WHITESPACE) {
Chris@0 133 $error = 'Expected 1 space after asterisk; 0 found';
Chris@0 134 $fix = $phpcsFile->addFixableError($error, $i, 'NoSpaceAfterStar');
Chris@0 135 if ($fix === true) {
Chris@0 136 $phpcsFile->fixer->addContent($i, ' ');
Chris@0 137 }
Chris@0 138 } else if ($tokens[($i + 2)]['code'] === T_DOC_COMMENT_TAG
Chris@0 139 && $tokens[($i + 1)]['content'] !== ' '
Chris@0 140 ) {
Chris@0 141 $error = 'Expected 1 space after asterisk; %s found';
Chris@0 142 $data = array(strlen($tokens[($i + 1)]['content']));
Chris@0 143 $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterStar', $data);
Chris@0 144 if ($fix === true) {
Chris@0 145 $phpcsFile->fixer->replaceToken(($i + 1), ' ');
Chris@0 146 }
Chris@0 147 }
Chris@0 148 }//end for
Chris@0 149
Chris@0 150 }//end process()
Chris@0 151
Chris@0 152
Chris@0 153 }//end class