annotate vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php @ 9:1fc0ff908d1f

Add another data file
author Chris Cannam
date Mon, 05 Feb 2018 12:34:32 +0000
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2 /**
Chris@0 3 * Generic_Sniffs_NamingConventions_UpperCaseConstantNameSniff.
Chris@0 4 *
Chris@0 5 * PHP version 5
Chris@0 6 *
Chris@0 7 * @category PHP
Chris@0 8 * @package PHP_CodeSniffer
Chris@0 9 * @author Greg Sherwood <gsherwood@squiz.net>
Chris@0 10 * @author Marc McIntyre <mmcintyre@squiz.net>
Chris@0 11 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
Chris@0 12 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
Chris@0 13 * @link http://pear.php.net/package/PHP_CodeSniffer
Chris@0 14 */
Chris@0 15
Chris@0 16 /**
Chris@0 17 * Generic_Sniffs_NamingConventions_UpperCaseConstantNameSniff.
Chris@0 18 *
Chris@0 19 * Ensures that constant names are all uppercase.
Chris@0 20 *
Chris@0 21 * @category PHP
Chris@0 22 * @package PHP_CodeSniffer
Chris@0 23 * @author Greg Sherwood <gsherwood@squiz.net>
Chris@0 24 * @author Marc McIntyre <mmcintyre@squiz.net>
Chris@0 25 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
Chris@0 26 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
Chris@0 27 * @version Release: @package_version@
Chris@0 28 * @link http://pear.php.net/package/PHP_CodeSniffer
Chris@0 29 */
Chris@0 30 class Generic_Sniffs_NamingConventions_UpperCaseConstantNameSniff implements PHP_CodeSniffer_Sniff
Chris@0 31 {
Chris@0 32
Chris@0 33
Chris@0 34 /**
Chris@0 35 * Returns an array of tokens this test wants to listen for.
Chris@0 36 *
Chris@0 37 * @return array
Chris@0 38 */
Chris@0 39 public function register()
Chris@0 40 {
Chris@0 41 return array(T_STRING);
Chris@0 42
Chris@0 43 }//end register()
Chris@0 44
Chris@0 45
Chris@0 46 /**
Chris@0 47 * Processes this test, when one of its tokens is encountered.
Chris@0 48 *
Chris@0 49 * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
Chris@0 50 * @param int $stackPtr The position of the current token in the
Chris@0 51 * stack passed in $tokens.
Chris@0 52 *
Chris@0 53 * @return void
Chris@0 54 */
Chris@0 55 public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
Chris@0 56 {
Chris@0 57 $tokens = $phpcsFile->getTokens();
Chris@0 58 $constName = $tokens[$stackPtr]['content'];
Chris@0 59
Chris@0 60 // If this token is in a heredoc, ignore it.
Chris@0 61 if ($phpcsFile->hasCondition($stackPtr, T_START_HEREDOC) === true) {
Chris@0 62 return;
Chris@0 63 }
Chris@0 64
Chris@0 65 // Special case for PHP 5.5 class name resolution.
Chris@0 66 if (strtolower($constName) === 'class'
Chris@0 67 && $tokens[($stackPtr - 1)]['code'] === T_DOUBLE_COLON
Chris@0 68 ) {
Chris@0 69 return;
Chris@0 70 }
Chris@0 71
Chris@0 72 // Special case for PHPUnit.
Chris@0 73 if ($constName === 'PHPUnit_MAIN_METHOD') {
Chris@0 74 return;
Chris@0 75 }
Chris@0 76
Chris@0 77 // If the next non-whitespace token after this token
Chris@0 78 // is not an opening parenthesis then it is not a function call.
Chris@0 79 for ($openBracket = ($stackPtr + 1); $openBracket < $phpcsFile->numTokens; $openBracket++) {
Chris@0 80 if ($tokens[$openBracket]['code'] !== T_WHITESPACE) {
Chris@0 81 break;
Chris@0 82 }
Chris@0 83 }
Chris@0 84
Chris@0 85 if ($openBracket === $phpcsFile->numTokens) {
Chris@0 86 return;
Chris@0 87 }
Chris@0 88
Chris@0 89 if ($tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) {
Chris@0 90 $functionKeyword = $phpcsFile->findPrevious(
Chris@0 91 array(
Chris@0 92 T_WHITESPACE,
Chris@0 93 T_COMMA,
Chris@0 94 T_COMMENT,
Chris@0 95 T_STRING,
Chris@0 96 T_NS_SEPARATOR,
Chris@0 97 ),
Chris@0 98 ($stackPtr - 1),
Chris@0 99 null,
Chris@0 100 true
Chris@0 101 );
Chris@0 102
Chris@0 103 if ($tokens[$functionKeyword]['code'] !== T_CONST) {
Chris@0 104 return;
Chris@0 105 }
Chris@0 106
Chris@0 107 // This is a class constant.
Chris@0 108 if (strtoupper($constName) !== $constName) {
Chris@0 109 if (strtolower($constName) === $constName) {
Chris@0 110 $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'lower');
Chris@0 111 } else {
Chris@0 112 $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'mixed');
Chris@0 113 }
Chris@0 114
Chris@0 115 $error = 'Class constants must be uppercase; expected %s but found %s';
Chris@0 116 $data = array(
Chris@0 117 strtoupper($constName),
Chris@0 118 $constName,
Chris@0 119 );
Chris@0 120 $phpcsFile->addError($error, $stackPtr, 'ClassConstantNotUpperCase', $data);
Chris@0 121 } else {
Chris@0 122 $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'upper');
Chris@0 123 }
Chris@0 124
Chris@0 125 return;
Chris@0 126 }//end if
Chris@0 127
Chris@0 128 if (strtolower($constName) !== 'define') {
Chris@0 129 return;
Chris@0 130 }
Chris@0 131
Chris@0 132 /*
Chris@0 133 This may be a "define" function call.
Chris@0 134 */
Chris@0 135
Chris@0 136 // Make sure this is not a method call.
Chris@0 137 $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true);
Chris@0 138 if ($tokens[$prev]['code'] === T_OBJECT_OPERATOR
Chris@0 139 || $tokens[$prev]['code'] === T_DOUBLE_COLON
Chris@0 140 ) {
Chris@0 141 return;
Chris@0 142 }
Chris@0 143
Chris@0 144 // The next non-whitespace token must be the constant name.
Chris@0 145 $constPtr = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), null, true);
Chris@0 146 if ($tokens[$constPtr]['code'] !== T_CONSTANT_ENCAPSED_STRING) {
Chris@0 147 return;
Chris@0 148 }
Chris@0 149
Chris@0 150 $constName = $tokens[$constPtr]['content'];
Chris@0 151
Chris@0 152 // Check for constants like self::CONSTANT.
Chris@0 153 $prefix = '';
Chris@0 154 $splitPos = strpos($constName, '::');
Chris@0 155 if ($splitPos !== false) {
Chris@0 156 $prefix = substr($constName, 0, ($splitPos + 2));
Chris@0 157 $constName = substr($constName, ($splitPos + 2));
Chris@0 158 }
Chris@0 159
Chris@0 160 // Strip namesspace from constant like /foo/bar/CONSTANT.
Chris@0 161 $splitPos = strrpos($constName, '\\');
Chris@0 162 if ($splitPos !== false) {
Chris@0 163 $prefix = substr($constName, 0, ($splitPos + 1));
Chris@0 164 $constName = substr($constName, ($splitPos + 1));
Chris@0 165 }
Chris@0 166
Chris@0 167 if (strtoupper($constName) !== $constName) {
Chris@0 168 if (strtolower($constName) === $constName) {
Chris@0 169 $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'lower');
Chris@0 170 } else {
Chris@0 171 $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'mixed');
Chris@0 172 }
Chris@0 173
Chris@0 174 $error = 'Constants must be uppercase; expected %s but found %s';
Chris@0 175 $data = array(
Chris@0 176 $prefix.strtoupper($constName),
Chris@0 177 $prefix.$constName,
Chris@0 178 );
Chris@0 179 $phpcsFile->addError($error, $stackPtr, 'ConstantNotUpperCase', $data);
Chris@0 180 } else {
Chris@0 181 $phpcsFile->recordMetric($stackPtr, 'Constant name case', 'upper');
Chris@0 182 }
Chris@0 183
Chris@0 184 }//end process()
Chris@0 185
Chris@0 186
Chris@0 187 }//end class