From 50b275432768a0b5a2658665b00a413adc35dd57 Mon Sep 17 00:00:00 2001 From: Lars Eidam Date: Tue, 28 Feb 2012 21:11:46 +0100 Subject: [PATCH] adjust the FunctionCallArgumentSpacing sniff to be able to align the code in function calls --- .../FunctionCallArgumentSpacingSniff.php | 156 ++++++++++++++++++ .../Standards/Ontowiki/ruleset.xml | 4 +- 2 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 application/tests/CodeSniffer/Standards/Ontowiki/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php diff --git a/application/tests/CodeSniffer/Standards/Ontowiki/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php b/application/tests/CodeSniffer/Standards/Ontowiki/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php new file mode 100644 index 000000000..034acd017 --- /dev/null +++ b/application/tests/CodeSniffer/Standards/Ontowiki/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php @@ -0,0 +1,156 @@ + + * @author Marc McIntyre + * @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 + */ + +/** + * Generic_Sniffs_Functions_FunctionCallArgumentSpacingSniff. + * + * Checks that calls to methods and functions are spaced correctly. + * + * @category PHP + * @package PHP_CodeSniffer + * @author Greg Sherwood + * @author Marc McIntyre + * @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 + */ + +/** + * Little changes for Ontowiki requirements: + * After commas in function calls must at least one space but it can also be more to be able to align the code. + * + * @author Lars Eidam + */ +class Ontowiki_Sniffs_Functions_FunctionCallArgumentSpacingSniff implements PHP_CodeSniffer_Sniff +{ + + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array(T_STRING); + + }//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(); + + // Skip tokens that are the names of functions or classes + // within their definitions. For example: + // function myFunction... + // "myFunction" is T_STRING but we should skip because it is not a + // function or method *call*. + $functionName = $stackPtr; + $ignoreTokens = PHP_CodeSniffer_Tokens::$emptyTokens; + $ignoreTokens[] = T_BITWISE_AND; + $functionKeyword = $phpcsFile->findPrevious($ignoreTokens, ($stackPtr - 1), null, true); + if ($tokens[$functionKeyword]['code'] === T_FUNCTION || $tokens[$functionKeyword]['code'] === T_CLASS) { + return; + } + + // If the next non-whitespace token after the function or method call + // is not an opening parenthesis then it cant really be a *call*. + $openBracket = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($functionName + 1), null, true); + if ($tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) { + return; + } + + $closeBracket = $tokens[$openBracket]['parenthesis_closer']; + + $nextSeperator = $openBracket; + while (($nextSeperator = $phpcsFile->findNext( + array(T_COMMA, T_VARIABLE), + ($nextSeperator + 1), + $closeBracket + )) !== false) { + // Make sure the comma or variable belongs directly to this function call, + // and is not inside a nested function call or array. + $brackets = $tokens[$nextSeperator]['nested_parenthesis']; + $lastBracket = array_pop($brackets); + if ($lastBracket !== $closeBracket) { + continue; + } + + if ($tokens[$nextSeperator]['code'] === T_COMMA) { + if ($tokens[($nextSeperator - 1)]['code'] === T_WHITESPACE) { + $error = 'Space found before comma in function call'; + $phpcsFile->addError($error, $stackPtr, 'SpaceBeforeComma'); + } + + if ($tokens[($nextSeperator + 1)]['code'] !== T_WHITESPACE) { + $error = 'No space found after comma in function call'; + $phpcsFile->addError($error, $stackPtr, 'NoSpaceAfterComma'); + } + // this code is outcommented to be able to align the code in function calls (Ontowiki requirement) + /** + else { + // If there is a newline in the space, then the must be formatting + // each argument on a newline, which is valid, so ignore it. + + if (strpos($tokens[($nextSeperator + 1)]['content'], $phpcsFile->eolChar) === false) { + $space = strlen($tokens[($nextSeperator + 1)]['content']); + if ($space > 1) { + $error = 'Expected 1 space after comma in function call; %s found'; + $data = array($space); + $phpcsFile->addError($error, $stackPtr, 'TooMuchSpaceAfterComma', $data); + } + } + } + **/ + } else { + // Token is a variable. + $nextToken = $phpcsFile->findNext( + PHP_CodeSniffer_Tokens::$emptyTokens, + ($nextSeperator + 1), + $closeBracket, true + ); + if ($nextToken !== false) { + if ($tokens[$nextToken]['code'] === T_EQUAL) { + if (($tokens[($nextToken - 1)]['code']) !== T_WHITESPACE) { + $error = 'Expected 1 space before = sign of default value'; + $phpcsFile->addError($error, $stackPtr, 'NoSpaceBeforeEquals'); + } + + if ($tokens[($nextToken + 1)]['code'] !== T_WHITESPACE) { + $error = 'Expected 1 space after = sign of default value'; + $phpcsFile->addError($error, $stackPtr, 'NoSpaceAfterEquals'); + } + } + } + }//end if + }//end while + + }//end process() + + +}//end class + +?> diff --git a/application/tests/CodeSniffer/Standards/Ontowiki/ruleset.xml b/application/tests/CodeSniffer/Standards/Ontowiki/ruleset.xml index 49e98a0c3..97b907a25 100644 --- a/application/tests/CodeSniffer/Standards/Ontowiki/ruleset.xml +++ b/application/tests/CodeSniffer/Standards/Ontowiki/ruleset.xml @@ -6,8 +6,10 @@ + - + +