Resolve code sniffer-related TODOs
authorMatthias Schmidt <gravatronics@live.com>
Sat, 20 Apr 2019 14:04:50 +0000 (16:04 +0200)
committerMatthias Schmidt <gravatronics@live.com>
Sat, 20 Apr 2019 14:04:50 +0000 (16:04 +0200)
See #2544

CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php [new file with mode: 0644]
CodeSniff/WCF/ruleset.xml
wcfsetup/install/files/lib/core.functions.php

diff --git a/CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php b/CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php
new file mode 100644 (file)
index 0000000..abc9228
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+namespace WCF\Sniffs\Functions;
+
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Files\File;
+
+/**
+ * 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    WoltLabSuite\Core
+ */
+class OpeningFunctionBraceKernighanRitchieSniff implements 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(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 93e0b2a32edea184b5e6710df0a25b1c91eea4c4..4ad1180e84516b324a94c62cdd961a9006c643e6 100644 (file)
        <rule ref="Squiz.Scope.MethodScope" />
        <rule ref="Squiz.Strings.EchoedStrings" />
        <rule ref="Squiz.WhiteSpace.FunctionOpeningBraceSpace" />
-       <!--<rule ref="Squiz.WhiteSpace.ObjectOperatorSpacing" />-->
        <rule ref="WCF.Classes.ClassFileName" />
        <rule ref="WCF.ControlStructures.ControlSignature" />
-       <!--TODO:<rule ref="WCF.Functions.OpeningFunctionBraceKernighanRitchie" />-->
+       <rule ref="WCF.Functions.OpeningFunctionBraceKernighanRitchie" />
        <rule ref="WCF.Methods.MethodDeclaration" />
        <rule ref="WCF.Namespaces.ClassMustBeImported" />
        <rule ref="WCF.Namespaces.UseDeclaration" />
index 970d31211fe2090ce15a8980b51089553a38ff4a..a433fcf3c959812719421f4b5c3868352f9048fc 100644 (file)
@@ -90,7 +90,9 @@ namespace {
        }
        
        if (!function_exists('is_countable')) {
-               function is_countable($var) { return is_array($var) || $var instanceof Countable || $var instanceof ResourceBundle || $var instanceof SimpleXmlElement; }
+               function is_countable($var) {
+                       return is_array($var) || $var instanceof Countable || $var instanceof ResourceBundle || $var instanceof SimpleXmlElement;
+               }
        }
 }