/library/phpdocx/lib/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php

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