Adapt K&R brace style code sniff to our needs
authorTim Düsterhus <duesterhus@woltlab.com>
Thu, 18 Dec 2014 20:57:55 +0000 (21:57 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Thu, 18 Dec 2014 21:41:34 +0000 (22:41 +0100)
CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php [new file with mode: 0644]
CodeSniff/WCF/ruleset.xml

diff --git a/CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php b/CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php
new file mode 100644 (file)
index 0000000..c342362
--- /dev/null
@@ -0,0 +1,106 @@
+<?php
+/**
+ * This sniff is based on Generic_Sniffs_Functions_OpeningFunctionBraceKernighanRitchieSniff. Originally written
+ * by Greg Sherwood <gsherwood@squiz.net> and Marc McIntyre <mmcintyre@squiz.net>
+ * 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 <http://opensource.org/licenses/lgpl-license.php>
+ * @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');
+       }
+}
index 39307f3c03f686c90c813ccd9795c4d3a40a826d..be86bd9a8133bdf9209a8b11dc46610cfed5a200 100644 (file)
@@ -12,7 +12,6 @@
        <rule ref="Generic.Files.OneInterfacePerFile" />
        <rule ref="Generic.Formatting.DisallowMultipleStatements" />
        <rule ref="Generic.Functions.FunctionCallArgumentSpacing" />
-       <rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie" />
        <rule ref="Generic.NamingConventions.UpperCaseConstantName" />
        <rule ref="Generic.PHP.CharacterBeforePHPOpeningTag" />
        <rule ref="Generic.PHP.DisallowShortOpenTag" />
@@ -32,6 +31,7 @@
        <rule ref="Squiz.Scope.MethodScope" />
        <rule ref="WCF.Classes.ClassFileName" />
        <rule ref="WCF.ControlStructures.ControlSignature" />
+       <rule ref="WCF.Functions.OpeningFunctionBraceKernighanRitchie" />
        <rule ref="WCF.Methods.MethodDeclaration" />
        <rule ref="WCF.Namespaces.ClassMustBeImported" />
        <rule ref="WCF.Namespaces.SortedUseDeclaration" />