PageRenderTime 31ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/libraries/mpdf/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php

https://github.com/Joomla-Bible-Study/joomla_churchdirectory
PHP | 279 lines | 193 code | 32 blank | 54 comment | 64 complexity | cf69fa175b3718a9fa0fe83e4ea3041e MD5 | raw file
  1. <?php
  2. /**
  3. * Verifies that control statements conform to their coding standards.
  4. *
  5. * PHP version 5
  6. *
  7. * @category PHP
  8. * @package PHP_CodeSniffer
  9. * @author Greg Sherwood <gsherwood@squiz.net>
  10. * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
  11. * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
  12. * @link http://pear.php.net/package/PHP_CodeSniffer
  13. */
  14. /**
  15. * Verifies that control statements conform to their coding standards.
  16. *
  17. * @category PHP
  18. * @package PHP_CodeSniffer
  19. * @author Greg Sherwood <gsherwood@squiz.net>
  20. * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
  21. * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
  22. * @version Release: @package_version@
  23. * @link http://pear.php.net/package/PHP_CodeSniffer
  24. */
  25. class Squiz_Sniffs_ControlStructures_ControlSignatureSniff implements PHP_CodeSniffer_Sniff
  26. {
  27. /**
  28. * A list of tokenizers this sniff supports.
  29. *
  30. * @var array
  31. */
  32. public $supportedTokenizers = array(
  33. 'PHP',
  34. 'JS',
  35. );
  36. /**
  37. * Returns an array of tokens this test wants to listen for.
  38. *
  39. * @return int[]
  40. */
  41. public function register()
  42. {
  43. return array(
  44. T_TRY,
  45. T_CATCH,
  46. T_DO,
  47. T_WHILE,
  48. T_FOR,
  49. T_IF,
  50. T_FOREACH,
  51. T_ELSE,
  52. T_ELSEIF,
  53. T_SWITCH,
  54. );
  55. }//end register()
  56. /**
  57. * Processes this test, when one of its tokens is encountered.
  58. *
  59. * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
  60. * @param int $stackPtr The position of the current token in the
  61. * stack passed in $tokens.
  62. *
  63. * @return void
  64. */
  65. public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
  66. {
  67. $tokens = $phpcsFile->getTokens();
  68. if (isset($tokens[($stackPtr + 1)]) === false) {
  69. return;
  70. }
  71. // Single space after the keyword.
  72. $found = 1;
  73. if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
  74. $found = 0;
  75. } else if ($tokens[($stackPtr + 1)]['content'] !== ' ') {
  76. if (strpos($tokens[($stackPtr + 1)]['content'], $phpcsFile->eolChar) !== false) {
  77. $found = 'newline';
  78. } else {
  79. $found = strlen($tokens[($stackPtr + 1)]['content']);
  80. }
  81. }
  82. if ($found !== 1) {
  83. $error = 'Expected 1 space after %s keyword; %s found';
  84. $data = array(
  85. strtoupper($tokens[$stackPtr]['content']),
  86. $found,
  87. );
  88. $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterKeyword', $data);
  89. if ($fix === true) {
  90. if ($found === 0) {
  91. $phpcsFile->fixer->addContent($stackPtr, ' ');
  92. } else {
  93. $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' ');
  94. }
  95. }
  96. }
  97. // Single space after closing parenthesis.
  98. if (isset($tokens[$stackPtr]['parenthesis_closer']) === true
  99. && isset($tokens[$stackPtr]['scope_opener']) === true
  100. ) {
  101. $closer = $tokens[$stackPtr]['parenthesis_closer'];
  102. $opener = $tokens[$stackPtr]['scope_opener'];
  103. $content = $phpcsFile->getTokensAsString(($closer + 1), ($opener - $closer - 1));
  104. if ($content !== ' ') {
  105. $error = 'Expected 1 space after closing parenthesis; found %s';
  106. if (trim($content) === '') {
  107. $found = strlen($content);
  108. } else {
  109. $found = '"'.str_replace($phpcsFile->eolChar, '\n', $content).'"';
  110. }
  111. $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceAfterCloseParenthesis', array($found));
  112. if ($fix === true) {
  113. if ($closer === ($opener - 1)) {
  114. $phpcsFile->fixer->addContent($closer, ' ');
  115. } else {
  116. $phpcsFile->fixer->beginChangeset();
  117. if (trim($content) === '') {
  118. $phpcsFile->fixer->addContent($closer, ' ');
  119. if ($found !== 0) {
  120. for ($i = ($closer + 1); $i < $opener; $i++) {
  121. $phpcsFile->fixer->replaceToken($i, '');
  122. }
  123. }
  124. } else {
  125. $phpcsFile->fixer->addContent($closer, ' '.$tokens[$opener]['content']);
  126. $phpcsFile->fixer->replaceToken($opener, '');
  127. if ($tokens[$opener]['line'] !== $tokens[$closer]['line']) {
  128. $next = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), null, true);
  129. if ($tokens[$next]['line'] !== $tokens[$opener]['line']) {
  130. for ($i = ($opener + 1); $i < $next; $i++) {
  131. $phpcsFile->fixer->replaceToken($i, '');
  132. }
  133. }
  134. }
  135. }
  136. $phpcsFile->fixer->endChangeset();
  137. }//end if
  138. }//end if
  139. }//end if
  140. }//end if
  141. // Single newline after opening brace.
  142. if (isset($tokens[$stackPtr]['scope_opener']) === true) {
  143. $opener = $tokens[$stackPtr]['scope_opener'];
  144. for ($next = ($opener + 1); $next < $phpcsFile->numTokens; $next++) {
  145. $code = $tokens[$next]['code'];
  146. if ($code === T_WHITESPACE
  147. || ($code === T_INLINE_HTML
  148. && trim($tokens[$next]['content']) === '')
  149. ) {
  150. continue;
  151. }
  152. // Skip all empty tokens on the same line as the opener.
  153. if ($tokens[$next]['line'] === $tokens[$opener]['line']
  154. && (isset(PHP_CodeSniffer_Tokens::$emptyTokens[$code]) === true
  155. || $code === T_CLOSE_TAG)
  156. ) {
  157. continue;
  158. }
  159. // We found the first bit of a code, or a comment on the
  160. // following line.
  161. break;
  162. }//end for
  163. if ($tokens[$next]['line'] === $tokens[$opener]['line']) {
  164. $error = 'Newline required after opening brace';
  165. $fix = $phpcsFile->addFixableError($error, $opener, 'NewlineAfterOpenBrace');
  166. if ($fix === true) {
  167. $phpcsFile->fixer->beginChangeset();
  168. for ($i = ($opener + 1); $i < $next; $i++) {
  169. if (trim($tokens[$i]['content']) !== '') {
  170. break;
  171. }
  172. // Remove whitespace.
  173. $phpcsFile->fixer->replaceToken($i, '');
  174. }
  175. $phpcsFile->fixer->addContent($opener, $phpcsFile->eolChar);
  176. $phpcsFile->fixer->endChangeset();
  177. }
  178. }//end if
  179. } else if ($tokens[$stackPtr]['code'] === T_WHILE) {
  180. // Zero spaces after parenthesis closer.
  181. $closer = $tokens[$stackPtr]['parenthesis_closer'];
  182. $found = 0;
  183. if ($tokens[($closer + 1)]['code'] === T_WHITESPACE) {
  184. if (strpos($tokens[($closer + 1)]['content'], $phpcsFile->eolChar) !== false) {
  185. $found = 'newline';
  186. } else {
  187. $found = strlen($tokens[($closer + 1)]['content']);
  188. }
  189. }
  190. if ($found !== 0) {
  191. $error = 'Expected 0 spaces before semicolon; %s found';
  192. $data = array($found);
  193. $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeSemicolon', $data);
  194. if ($fix === true) {
  195. $phpcsFile->fixer->replaceToken(($closer + 1), '');
  196. }
  197. }
  198. }//end if
  199. // Only want to check multi-keyword structures from here on.
  200. if ($tokens[$stackPtr]['code'] === T_DO) {
  201. if (isset($tokens[$stackPtr]['scope_closer']) === false) {
  202. return;
  203. }
  204. $closer = $tokens[$stackPtr]['scope_closer'];
  205. } else if ($tokens[$stackPtr]['code'] === T_ELSE
  206. || $tokens[$stackPtr]['code'] === T_ELSEIF
  207. || $tokens[$stackPtr]['code'] === T_CATCH
  208. ) {
  209. if (isset($tokens[$stackPtr]['scope_opener']) === true
  210. && $tokens[$tokens[$stackPtr]['scope_opener']]['code'] === T_COLON
  211. ) {
  212. // Special case for alternate syntax, where this token is actually
  213. // the closer for the previous block, so there is no spacing to check.
  214. return;
  215. }
  216. $closer = $phpcsFile->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr - 1), null, true);
  217. if ($closer === false || $tokens[$closer]['code'] !== T_CLOSE_CURLY_BRACKET) {
  218. return;
  219. }
  220. } else {
  221. return;
  222. }//end if
  223. // Single space after closing brace.
  224. $found = 1;
  225. if ($tokens[($closer + 1)]['code'] !== T_WHITESPACE) {
  226. $found = 0;
  227. } else if ($tokens[($closer + 1)]['content'] !== ' ') {
  228. if (strpos($tokens[($closer + 1)]['content'], $phpcsFile->eolChar) !== false) {
  229. $found = 'newline';
  230. } else {
  231. $found = strlen($tokens[($closer + 1)]['content']);
  232. }
  233. }
  234. if ($found !== 1) {
  235. $error = 'Expected 1 space after closing brace; %s found';
  236. $data = array($found);
  237. $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceAfterCloseBrace', $data);
  238. if ($fix === true) {
  239. if ($found === 0) {
  240. $phpcsFile->fixer->addContent($closer, ' ');
  241. } else {
  242. $phpcsFile->fixer->replaceToken(($closer + 1), ' ');
  243. }
  244. }
  245. }
  246. }//end process()
  247. }//end class