PageRenderTime 26ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php

https://gitlab.com/fogteen/gasaon
PHP | 231 lines | 139 code | 28 blank | 64 comment | 38 complexity | 223ea0604074e89723e6fbbd4c0fc3b3 MD5 | raw file
  1. <?php
  2. /**
  3. * Sniffs_Squiz_WhiteSpace_OperatorSpacingSniff.
  4. *
  5. * PHP version 5
  6. *
  7. * @category PHP
  8. * @package PHP_CodeSniffer
  9. * @author Greg Sherwood <gsherwood@squiz.net>
  10. * @author Marc McIntyre <mmcintyre@squiz.net>
  11. * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
  12. * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
  13. * @link http://pear.php.net/package/PHP_CodeSniffer
  14. */
  15. /**
  16. * Sniffs_Squiz_WhiteSpace_OperatorSpacingSniff.
  17. *
  18. * Verifies that operators have valid spacing surrounding them.
  19. *
  20. * @category PHP
  21. * @package PHP_CodeSniffer
  22. * @author Greg Sherwood <gsherwood@squiz.net>
  23. * @author Marc McIntyre <mmcintyre@squiz.net>
  24. * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
  25. * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
  26. * @version Release: @package_version@
  27. * @link http://pear.php.net/package/PHP_CodeSniffer
  28. */
  29. class Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff implements PHP_CodeSniffer_Sniff
  30. {
  31. /**
  32. * A list of tokenizers this sniff supports.
  33. *
  34. * @var array
  35. */
  36. public $supportedTokenizers = array(
  37. 'PHP',
  38. 'JS',
  39. );
  40. /**
  41. * Returns an array of tokens this test wants to listen for.
  42. *
  43. * @return array
  44. */
  45. public function register()
  46. {
  47. $comparison = PHP_CodeSniffer_Tokens::$comparisonTokens;
  48. $operators = PHP_CodeSniffer_Tokens::$operators;
  49. $assignment = PHP_CodeSniffer_Tokens::$assignmentTokens;
  50. $inlineIf = array(
  51. T_INLINE_THEN,
  52. T_INLINE_ELSE,
  53. );
  54. return array_unique(
  55. array_merge($comparison, $operators, $assignment, $inlineIf)
  56. );
  57. }//end register()
  58. /**
  59. * Processes this sniff, when one of its tokens is encountered.
  60. *
  61. * @param PHP_CodeSniffer_File $phpcsFile The current file being checked.
  62. * @param int $stackPtr The position of the current token in
  63. * the stack passed in $tokens.
  64. *
  65. * @return void
  66. */
  67. public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
  68. {
  69. $tokens = $phpcsFile->getTokens();
  70. // Skip default values in function declarations.
  71. if ($tokens[$stackPtr]['code'] === T_EQUAL
  72. || $tokens[$stackPtr]['code'] === T_MINUS
  73. ) {
  74. if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) {
  75. $parenthesis = array_keys($tokens[$stackPtr]['nested_parenthesis']);
  76. $bracket = array_pop($parenthesis);
  77. if (isset($tokens[$bracket]['parenthesis_owner']) === true) {
  78. $function = $tokens[$bracket]['parenthesis_owner'];
  79. if ($tokens[$function]['code'] === T_FUNCTION
  80. || $tokens[$function]['code'] === T_CLOSURE
  81. ) {
  82. return;
  83. }
  84. }
  85. }
  86. }
  87. if ($tokens[$stackPtr]['code'] === T_EQUAL) {
  88. // Skip for '=&' case.
  89. if (isset($tokens[($stackPtr + 1)]) === true
  90. && $tokens[($stackPtr + 1)]['code'] === T_BITWISE_AND
  91. ) {
  92. return;
  93. }
  94. }
  95. // Skip short ternary such as: $foo = $bar ?: true;
  96. if (($tokens[$stackPtr]['code'] == T_INLINE_THEN
  97. && $tokens[$stackPtr + 1]['code'] == T_INLINE_ELSE)
  98. || ($tokens[$stackPtr - 1]['code'] == T_INLINE_THEN
  99. && $tokens[$stackPtr]['code'] == T_INLINE_ELSE)
  100. ) {
  101. return;
  102. }
  103. if ($tokens[$stackPtr]['code'] === T_BITWISE_AND) {
  104. // If it's not a reference, then we expect one space either side of the
  105. // bitwise operator.
  106. if ($phpcsFile->isReference($stackPtr) === true) {
  107. return;
  108. }
  109. // Check there is one space before the & operator.
  110. if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) {
  111. $error = 'Expected 1 space before "&" operator; 0 found';
  112. $phpcsFile->addError($error, $stackPtr, 'NoSpaceBeforeAmp');
  113. } else {
  114. if (strlen($tokens[($stackPtr - 1)]['content']) !== 1) {
  115. $found = strlen($tokens[($stackPtr - 1)]['content']);
  116. $error = 'Expected 1 space before "&" operator; %s found';
  117. $data = array($found);
  118. $phpcsFile->addError($error, $stackPtr, 'SpacingBeforeAmp', $data);
  119. }
  120. }
  121. // Check there is one space after the & operator.
  122. if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
  123. $error = 'Expected 1 space after "&" operator; 0 found';
  124. $phpcsFile->addError($error, $stackPtr, 'NoSpaceAfterAmp');
  125. } else {
  126. if (strlen($tokens[($stackPtr + 1)]['content']) !== 1) {
  127. $found = strlen($tokens[($stackPtr + 1)]['content']);
  128. $error = 'Expected 1 space after "&" operator; %s found';
  129. $data = array($found);
  130. $phpcsFile->addError($error, $stackPtr, 'SpacingAfterAmp', $data);
  131. }
  132. }
  133. return;
  134. }//end if
  135. if ($tokens[$stackPtr]['code'] === T_MINUS) {
  136. // Check minus spacing, but make sure we aren't just assigning
  137. // a minus value or returning one.
  138. $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true);
  139. if ($tokens[$prev]['code'] === T_RETURN) {
  140. // Just returning a negative value; eg. (return -1).
  141. return;
  142. }
  143. if (in_array($tokens[$prev]['code'], PHP_CodeSniffer_Tokens::$operators) === true) {
  144. // Just trying to operate on a negative value; eg. ($var * -1).
  145. return;
  146. }
  147. if (in_array($tokens[$prev]['code'], PHP_CodeSniffer_Tokens::$comparisonTokens) === true) {
  148. // Just trying to compare a negative value; eg. ($var === -1).
  149. return;
  150. }
  151. if (in_array($tokens[$prev]['code'], PHP_CodeSniffer_Tokens::$assignmentTokens) === true) {
  152. // Just trying to assign a negative value; eg. ($var = -1).
  153. return;
  154. }
  155. // A list of tokens that indicate that the token is not
  156. // part of an arithmetic operation.
  157. $invalidTokens = array(
  158. T_COMMA,
  159. T_OPEN_PARENTHESIS,
  160. T_OPEN_SQUARE_BRACKET,
  161. T_DOUBLE_ARROW,
  162. T_COLON,
  163. T_INLINE_THEN,
  164. T_INLINE_ELSE,
  165. T_CASE,
  166. );
  167. if (in_array($tokens[$prev]['code'], $invalidTokens) === true) {
  168. // Just trying to use a negative value; eg. myFunction($var, -2).
  169. return;
  170. }
  171. }//end if
  172. $operator = $tokens[$stackPtr]['content'];
  173. if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) {
  174. $error = "Expected 1 space before \"$operator\"; 0 found";
  175. $phpcsFile->addError($error, $stackPtr, 'NoSpaceBefore');
  176. } else if (strlen($tokens[($stackPtr - 1)]['content']) !== 1) {
  177. // Don't throw an error for assignments, because other standards allow
  178. // multiple spaces there to align multiple assignments.
  179. if (in_array($tokens[$stackPtr]['code'], PHP_CodeSniffer_Tokens::$assignmentTokens) === false) {
  180. $found = strlen($tokens[($stackPtr - 1)]['content']);
  181. $error = 'Expected 1 space before "%s"; %s found';
  182. $data = array(
  183. $operator,
  184. $found,
  185. );
  186. $phpcsFile->addError($error, $stackPtr, 'SpacingBefore', $data);
  187. }
  188. }
  189. if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
  190. $error = "Expected 1 space after \"$operator\"; 0 found";
  191. $phpcsFile->addError($error, $stackPtr, 'NoSpaceAfter');
  192. } else if (strlen($tokens[($stackPtr + 1)]['content']) !== 1) {
  193. $found = strlen($tokens[($stackPtr + 1)]['content']);
  194. $error = 'Expected 1 space after "%s"; %s found';
  195. $data = array(
  196. $operator,
  197. $found,
  198. );
  199. $phpcsFile->addError($error, $stackPtr, 'SpacingAfter', $data);
  200. }
  201. }//end process()
  202. }//end class
  203. ?>