annotate vendor/drupal/coder/coder_sniffer/Drupal/Sniffs/Commenting/DocCommentAlignmentSniff.php @ 0:4c8ae668cc8c

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