/php/pear/PHP/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php

https://gitlab.com/trang1104/portable_project · PHP · 116 lines · 48 code · 17 blank · 51 comment · 11 complexity · c899f3ad198b828210cfa5b3d637245d MD5 · raw file

  1. <?php
  2. /**
  3. * Squiz_Sniffs_WhiteSpace_FunctionClosingBraceSpaceSniff.
  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-2011 Squiz Pty Ltd (ABN 77 084 670 600)
  12. * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
  13. * @link http://pear.php.net/package/PHP_CodeSniffer
  14. */
  15. /**
  16. * Squiz_Sniffs_WhiteSpace_FunctionClosingBraceSpaceSniff.
  17. *
  18. * Checks that there is one empty line before the closing brace of a function.
  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-2011 Squiz Pty Ltd (ABN 77 084 670 600)
  25. * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
  26. * @version Release: 1.3.3
  27. * @link http://pear.php.net/package/PHP_CodeSniffer
  28. */
  29. class Squiz_Sniffs_WhiteSpace_FunctionClosingBraceSpaceSniff 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. return array(T_FUNCTION);
  48. }//end register()
  49. /**
  50. * Processes this test, when one of its tokens is encountered.
  51. *
  52. * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
  53. * @param int $stackPtr The position of the current token
  54. * in the stack passed in $tokens.
  55. *
  56. * @return void
  57. */
  58. public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
  59. {
  60. $tokens = $phpcsFile->getTokens();
  61. if (isset($tokens[$stackPtr]['scope_closer']) === false) {
  62. // Probably an interface method.
  63. return;
  64. }
  65. $closeBrace = $tokens[$stackPtr]['scope_closer'];
  66. $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), null, true);
  67. // Special case for empty JS functions
  68. if ($phpcsFile->tokenizerType === 'JS' && $prevContent === $tokens[$stackPtr]['scope_opener']) {
  69. // In this case, the opening and closing brace must be
  70. // right next to each other.
  71. if ($tokens[$stackPtr]['scope_closer'] !== ($tokens[$stackPtr]['scope_opener'] + 1)) {
  72. $error = 'The opening and closing braces of empty functions must be directly next to each other; e.g., function () {}';
  73. $phpcsFile->addError($error, $closeBrace, 'SpacingBetween');
  74. }
  75. return;
  76. }
  77. $braceLine = $tokens[$closeBrace]['line'];
  78. $prevLine = $tokens[$prevContent]['line'];
  79. $found = ($braceLine - $prevLine - 1);
  80. if ($phpcsFile->hasCondition($stackPtr, T_FUNCTION) === true || isset($tokens[$stackPtr]['nested_parenthesis']) === true) {
  81. // Nested function.
  82. if ($found < 0) {
  83. $error = 'Closing brace of nested function must be on a new line';
  84. $phpcsFile->addError($error, $closeBrace, 'ContentBeforeClose');
  85. } else if ($found > 0) {
  86. $error = 'Expected 0 blank lines before closing brace of nested function; %s found';
  87. $data = array($found);
  88. $phpcsFile->addError($error, $closeBrace, 'SpacingBeforeNestedClose', $data);
  89. }
  90. } else {
  91. if ($found !== 1) {
  92. $error = 'Expected 1 blank line before closing function brace; %s found';
  93. $data = array($found);
  94. $phpcsFile->addError($error, $closeBrace, 'SpacingBeforeClose', $data);
  95. }
  96. }
  97. }//end process()
  98. }//end class
  99. ?>