/plugins/org.phpsrc.eclipse.pti.library.pear_1.2.2.R20120127000000/php/library/PEAR/PHP/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php
https://bitbucket.org/4NN3CK/myeclipse4php · PHP · 224 lines · 115 code · 32 blank · 77 comment · 25 complexity · 170d4371e30d19b36bf4d104e5d761c0 MD5 · raw file
- <?php
- /**
- * PEAR_Sniffs_Functions_FunctionDeclarationSniff.
- *
- * PHP version 5
- *
- * @category PHP
- * @package PHP_CodeSniffer
- * @author Greg Sherwood <gsherwood@squiz.net>
- * @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600)
- * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
- * @link http://pear.php.net/package/PHP_CodeSniffer
- */
- /**
- * PEAR_Sniffs_Functions_FunctionDeclarationSniff.
- *
- * Ensure single and multi-line function declarations are defined correctly.
- *
- * @category PHP
- * @package PHP_CodeSniffer
- * @author Greg Sherwood <gsherwood@squiz.net>
- * @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600)
- * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
- * @version Release: 1.3.2
- * @link http://pear.php.net/package/PHP_CodeSniffer
- */
- class PEAR_Sniffs_Functions_FunctionDeclarationSniff implements PHP_CodeSniffer_Sniff
- {
- /**
- * Returns an array of tokens this test wants to listen for.
- *
- * @return array
- */
- public function register()
- {
- return array(T_FUNCTION);
- }//end register()
- /**
- * Processes this test, when one of its tokens is encountered.
- *
- * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
- * @param int $stackPtr The position of the current token
- * in the stack passed in $tokens.
- *
- * @return void
- */
- public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
- {
- $tokens = $phpcsFile->getTokens();
- // Check if this is a single line or multi-line declaration.
- $openBracket = $tokens[$stackPtr]['parenthesis_opener'];
- $closeBracket = $tokens[$stackPtr]['parenthesis_closer'];
- if ($tokens[$openBracket]['line'] === $tokens[$closeBracket]['line']) {
- $this->processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens);
- } else {
- $this->processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens);
- }
- }//end process()
- /**
- * Processes single-line declarations.
- *
- * Just uses the Generic BSD-Allman brace sniff.
- *
- * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
- * @param int $stackPtr The position of the current token
- * in the stack passed in $tokens.
- * @param array $tokens The stack of tokens that make up
- * the file.
- *
- * @return void
- */
- public function processSingleLineDeclaration(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $tokens)
- {
- if (class_exists('Generic_Sniffs_Functions_OpeningFunctionBraceBsdAllmanSniff', true) === false) {
- throw new PHP_CodeSniffer_Exception('Class Generic_Sniffs_Functions_OpeningFunctionBraceBsdAllmanSniff not found');
- }
- $sniff = new Generic_Sniffs_Functions_OpeningFunctionBraceBsdAllmanSniff();
- $sniff->process($phpcsFile, $stackPtr);
- }//end processSingleLineDeclaration()
- /**
- * Processes mutli-line declarations.
- *
- * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
- * @param int $stackPtr The position of the current token
- * in the stack passed in $tokens.
- * @param array $tokens The stack of tokens that make up
- * the file.
- *
- * @return void
- */
- public function processMultiLineDeclaration(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $tokens)
- {
- // We need to work out how far indented the function
- // declaration itself is, so we can work out how far to
- // indent parameters.
- $functionIndent = 0;
- for ($i = ($stackPtr - 1); $i >= 0; $i--) {
- if ($tokens[$i]['line'] !== $tokens[$stackPtr]['line']) {
- $i++;
- break;
- }
- }
- if ($tokens[$i]['code'] === T_WHITESPACE) {
- $functionIndent = strlen($tokens[$i]['content']);
- }
- // Each line between the parenthesis should be indented 4 spaces.
- $openBracket = $tokens[$stackPtr]['parenthesis_opener'];
- $closeBracket = $tokens[$stackPtr]['parenthesis_closer'];
- $lastLine = $tokens[$openBracket]['line'];
- for ($i = ($openBracket + 1); $i < $closeBracket; $i++) {
- if ($tokens[$i]['line'] !== $lastLine) {
- if ($tokens[$i]['line'] === $tokens[$closeBracket]['line']) {
- // Closing brace needs to be indented to the same level
- // as the function.
- $expectedIndent = $functionIndent;
- } else {
- $expectedIndent = ($functionIndent + 4);
- }
- // We changed lines, so this should be a whitespace indent token.
- if ($tokens[$i]['code'] !== T_WHITESPACE) {
- $foundIndent = 0;
- } else {
- $foundIndent = strlen($tokens[$i]['content']);
- }
- if ($expectedIndent !== $foundIndent) {
- $error = 'Multi-line function declaration not indented correctly; expected %s spaces but found %s';
- $data = array(
- $expectedIndent,
- $foundIndent,
- );
- $phpcsFile->addError($error, $i, 'Indent', $data);
- }
- $lastLine = $tokens[$i]['line'];
- }//end if
- if ($tokens[$i]['code'] === T_ARRAY) {
- // Skip arrays as they have their own indentation rules.
- $i = $tokens[$i]['parenthesis_closer'];
- $lastLine = $tokens[$i]['line'];
- continue;
- }
- }//end for
- if (isset($tokens[$stackPtr]['scope_opener']) === true) {
- // The openning brace needs to be one space away
- // from the closing parenthesis.
- $next = $tokens[($closeBracket + 1)];
- if ($next['code'] !== T_WHITESPACE) {
- $length = 0;
- } else if ($next['content'] === $phpcsFile->eolChar) {
- $length = -1;
- } else {
- $length = strlen($next['content']);
- }
- if ($length !== 1) {
- $data = array($length);
- $code = 'SpaceBeforeOpenBrace';
- $error = 'There must be a single space between the closing parenthesis and the opening brace of a multi-line function declaration; found ';
- if ($length === -1) {
- $error .= 'newline';
- $code = 'NewlineBeforeOpenBrace';
- } else {
- $error .= '%s spaces';
- }
- $phpcsFile->addError($error, ($closeBracket + 1), $code, $data);
- return;
- }
- // And just in case they do something funny before the brace...
- $next = $phpcsFile->findNext(
- T_WHITESPACE,
- ($closeBracket + 1),
- null,
- true
- );
- if ($next !== false && $tokens[$next]['code'] !== T_OPEN_CURLY_BRACKET) {
- $error = 'There must be a single space between the closing parenthesis and the opening brace of a multi-line function declaration';
- $phpcsFile->addError($error, $next, 'NoSpaceBeforeOpenBrace');
- }
- }//end if
- // The closing parenthesis must be on a new line, even
- // when checking abstract function definitions.
- $prev = $phpcsFile->findPrevious(
- T_WHITESPACE,
- ($closeBracket - 1),
- null,
- true
- );
- if ($tokens[$prev]['line'] === $tokens[$closeBracket]['line']) {
- $error = 'The closing parenthesis of a multi-line function declaration must be on a new line';
- $phpcsFile->addError($error, $closeBracket, 'CloseBracketLine');
- }
- }//end processMultiLineDeclaration()
- }//end class
- ?>