From e6d6eb5aebf17cede78eef5e857a631caa5f7111 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim=20D=C3=BCsterhus?= Date: Thu, 18 Dec 2014 21:57:55 +0100 Subject: [PATCH] Adapt K&R brace style code sniff to our needs --- ...ningFunctionBraceKernighanRitchieSniff.php | 106 ++++++++++++++++++ CodeSniff/WCF/ruleset.xml | 2 +- 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php diff --git a/CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php b/CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php new file mode 100644 index 0000000000..c3423624e3 --- /dev/null +++ b/CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php @@ -0,0 +1,106 @@ + and Marc McIntyre + * and released under the terms of the BSD Licence. + * See: https://github.com/squizlabs/PHP_CodeSniffer/blob/master/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php + * + * @author Tim Duesterhus + * @license GNU Lesser General Public License + * @package com.woltlab.wcf + * @category Community Framework + */ +class WCF_Sniffs_Functions_OpeningFunctionBraceKernighanRitchieSniff implements PHP_CodeSniffer_Sniff { + /** + * Registers the tokens that this sniff wants to listen for. + * + * @return void + */ + public function register() { + return array(T_FUNCTION); + } + + /** + * 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(); + + if (isset($tokens[$stackPtr]['scope_opener']) === false) { + return; + } + + $openingBrace = $tokens[$stackPtr]['scope_opener']; + + $next = $phpcsFile->findNext(array(T_COMMENT, T_DOC_COMMENT, T_WHITESPACE), ($openingBrace + 1), null, true); + if ($tokens[$next]['line'] === $tokens[$openingBrace]['line']) { + // the closing brace is fine + if ($tokens[$openingBrace]['bracket_closer'] !== $next) { + $error = 'Opening brace must be the last content on the line'; + $fix = $phpcsFile->addFixableError($error, $openingBrace, 'ContentAfterBrace'); + if ($fix === true) { + $phpcsFile->fixer->addNewline($openingBrace); + } + } + } + + // The end of the function occurs at the end of the argument list. Its + // like this because some people like to break long function declarations + // over multiple lines. + $functionLine = $tokens[$tokens[$stackPtr]['parenthesis_closer']]['line']; + $braceLine = $tokens[$openingBrace]['line']; + + $lineDifference = ($braceLine - $functionLine); + + if ($lineDifference > 0) { + $error = 'Opening brace should be on the same line as the declaration'; + $phpcsFile->addError($error, $openingBrace, 'BraceOnNewLine'); + $phpcsFile->recordMetric($stackPtr, 'Function opening brace placement', 'new line'); + return; + } + + $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; + if ($tokens[($closeBracket + 1)]['code'] !== T_WHITESPACE) { + $length = 0; + } + else if ($tokens[($closeBracket + 1)]['content'] === "\t") { + $length = '\t'; + } + else { + $length = strlen($tokens[($closeBracket + 1)]['content']); + } + + if ($length !== 1) { + $error = 'Expected 1 space after closing parenthesis; found %s'; + $data = array($length); + $phpcsFile->addError($error, $closeBracket, 'SpaceAfterBracket', $data); + return; + } + + $closeBrace = $tokens[$stackPtr]['scope_opener']; + if ($tokens[($closeBrace - 1)]['code'] !== T_WHITESPACE) { + $length = 0; + } + else if ($tokens[($closeBrace - 1)]['content'] === "\t") { + $length = '\t'; + } + else { + $length = strlen($tokens[($closeBrace - 1)]['content']); + } + + if ($length !== 1) { + $error = 'Expected 1 space before opening brace; found %s'; + $data = array($length); + $phpcsFile->addError($error, $openingBrace, 'SpaceBeforeBrace', $data); + return; + } + + $phpcsFile->recordMetric($stackPtr, 'Function opening brace placement', 'same line'); + } +} diff --git a/CodeSniff/WCF/ruleset.xml b/CodeSniff/WCF/ruleset.xml index 39307f3c03..be86bd9a81 100644 --- a/CodeSniff/WCF/ruleset.xml +++ b/CodeSniff/WCF/ruleset.xml @@ -12,7 +12,6 @@ - @@ -32,6 +31,7 @@ + -- 2.20.1