Update CodeSniffs to be compatible with CodeSniffer 3.0
authorTim Düsterhus <duesterhus@woltlab.com>
Sat, 6 May 2017 18:20:01 +0000 (20:20 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Sat, 6 May 2017 18:20:01 +0000 (20:20 +0200)
CodeSniff/WCF/Sniffs/Classes/ClassFileNameSniff.php
CodeSniff/WCF/Sniffs/ControlStructures/ControlSignatureSniff.php
CodeSniff/WCF/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php
CodeSniff/WCF/Sniffs/Methods/MethodDeclarationSniff.php
CodeSniff/WCF/Sniffs/Namespaces/ClassMustBeImportedSniff.php
CodeSniff/WCF/Sniffs/Namespaces/SortedUseDeclarationSniff.php
CodeSniff/WCF/Sniffs/Namespaces/UseDeclarationSniff.php
CodeSniff/WCF/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php

index 49973829196a9068f8bcb5f3b9b2badd0c884846..d50eb5c60b3568f5b26c04a2bd09d190f9677cd1 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+namespace WCF\Sniffs\Classes;
+
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Files\File;
+
 /**
  * This sniff is based on Squiz_Sniffs_Classes_ClassFileNameSniff. Originally written
  * by Greg Sherwood <gsherwood@squiz.net> and Marc McIntyre <mmcintyre@squiz.net>
@@ -10,7 +15,7 @@
  * @package    com.woltlab.wcf
  * @category   Community Framework
  */
-class WCF_Sniffs_Classes_ClassFileNameSniff implements PHP_CodeSniffer_Sniff {
+class ClassFileNameSniff implements Sniff {
        /**
         * Returns an array of tokens this test wants to listen for.
         *
@@ -32,7 +37,7 @@ class WCF_Sniffs_Classes_ClassFileNameSniff implements PHP_CodeSniffer_Sniff {
         *
         * @return void
         */
-       public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
+       public function process(File $phpcsFile, $stackPtr) {
                $tokens   = $phpcsFile->getTokens();
                $decName  = $phpcsFile->findNext(T_STRING, $stackPtr);
                $fullPath = basename($phpcsFile->getFilename());
index a10dbad2af33faf4518cc9a01b874bce26d0eb0a..ef0c0668b6965b1737482447782ec9479a4a05fd 100644 (file)
@@ -1,7 +1,8 @@
 <?php
-if (class_exists('PHP_CodeSniffer_Standards_AbstractPatternSniff', true) === false) {
-       throw new PHP_CodeSniffer_Exception('Class PHP_CodeSniffer_Standards_AbstractPatternSniff not found');
-}
+namespace WCF\Sniffs\ControlStructures;
+
+use PHP_CodeSniffer\Sniffs\AbstractPatternSniff;
+use PHP_CodeSniffer\Files\File;
 
 /**
  * This sniff is based on Squiz_Sniffs_ControlStructures_ControlSignatureSniff. Originally written
@@ -14,7 +15,7 @@ if (class_exists('PHP_CodeSniffer_Standards_AbstractPatternSniff', true) === fal
  * @package    com.woltlab.wcf
  * @category   Community Framework
  */
-class WCF_Sniffs_ControlStructures_ControlSignatureSniff extends PHP_CodeSniffer_Standards_AbstractPatternSniff {
+class ControlSignatureSniff extends AbstractPatternSniff {
        /**
         * A list of tokenizers this sniff supports.
         *
index c3423624e36f5c00b136d74850b7c0677bf64c35..4f8618295f4e3050ed9037f32ed51c1f8908409f 100644 (file)
@@ -1,4 +1,9 @@
 <?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>
@@ -10,7 +15,7 @@
  * @package    com.woltlab.wcf
  * @category   Community Framework
  */
-class WCF_Sniffs_Functions_OpeningFunctionBraceKernighanRitchieSniff implements PHP_CodeSniffer_Sniff {
+class OpeningFunctionBraceKernighanRitchieSniff implements Sniff {
        /**
         * Registers the tokens that this sniff wants to listen for.
         *
@@ -29,7 +34,7 @@ class WCF_Sniffs_Functions_OpeningFunctionBraceKernighanRitchieSniff implements
         *
         * @return void
         */
-       public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
+       public function process(File $phpcsFile, $stackPtr) {
                $tokens = $phpcsFile->getTokens();
                
                if (isset($tokens[$stackPtr]['scope_opener']) === false) {
index 0117c4b37f51fc06eace58d20c14377cc1127733..2bc178e6684f9ff5fdbf25584a797c53d4bcc9e6 100644 (file)
@@ -1,4 +1,11 @@
 <?php
+namespace WCF\Sniffs\Methods;
+
+use PHP_CodeSniffer\Sniffs\AbstractScopeSniff;
+use PHP_CodeSniffer\Files\File;
+use PHP_CodeSniffer\Util\Tokens;
+
+
 /**
  * This sniff is based on PSR2_Sniffs_Methods_MethodDeclarationSniff. Originally written
  * by Greg Sherwood <gsherwood@squiz.net> and released under the terms of the BSD Licence.
@@ -9,7 +16,7 @@
  * @package    com.woltlab.wcf
  * @category   Community Framework
  */
-class WCF_Sniffs_Methods_MethodDeclarationSniff extends PHP_CodeSniffer_Standards_AbstractScopeSniff {
+class MethodDeclarationSniff extends AbstractScopeSniff {
        /**
         * Constructs a Squiz_Sniffs_Scope_MethodScopeSniff.
         */
@@ -26,7 +33,7 @@ class WCF_Sniffs_Methods_MethodDeclarationSniff extends PHP_CodeSniffer_Standard
         *
         * @return void
         */
-       protected function processTokenWithinScope(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $currScope) {
+       protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) {
                $tokens = $phpcsFile->getTokens();
                
                $methodName = $phpcsFile->getDeclarationName($stackPtr);
@@ -40,12 +47,12 @@ class WCF_Sniffs_Methods_MethodDeclarationSniff extends PHP_CodeSniffer_Standard
                $abstract = 0;
                $final = 0;
                
-               $find = PHP_CodeSniffer_Tokens::$methodPrefixes;
+               $find = Tokens::$methodPrefixes;
                $find[] = T_WHITESPACE;
                $prev = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true);
                
                $prefix = $stackPtr;
-               while (($prefix = $phpcsFile->findPrevious(PHP_CodeSniffer_Tokens::$methodPrefixes, ($prefix - 1), $prev)) !== false) {
+               while (($prefix = $phpcsFile->findPrevious(Tokens::$methodPrefixes, ($prefix - 1), $prev)) !== false) {
                        switch ($tokens[$prefix]['code']) {
                                case T_STATIC:
                                        $static = $prefix;
@@ -77,4 +84,8 @@ class WCF_Sniffs_Methods_MethodDeclarationSniff extends PHP_CodeSniffer_Standard
                        $phpcsFile->addError($error, $final, 'FinalBeforeVisibilityOrBeforeStatic');
                }
        }
-}
\ No newline at end of file
+       
+       protected function processTokenOutsideScope(File $phpcsFile, $stackPtr)
+       {
+       }
+}
index 0e1ba74ca74aacc7a8eebb94274b6993e98661f9..7aec928bad669d31bfa5a7c85f9cab0b9843294e 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+namespace WCF\Sniffs\Namespaces;
+
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Files\File;
+
 /**
  * Disallows calling non global classes via FQN. Classes must be imported with use [...];
  * 
@@ -7,7 +12,7 @@
  * @package    com.woltlab.wcf
  * @category   Community Framework
  */
-class WCF_Sniffs_Namespaces_ClassMustBeImportedSniff implements PHP_CodeSniffer_Sniff {
+class ClassMustBeImportedSniff implements Sniff {
        /**
         * Returns an array of tokens this test wants to listen for.
         *
@@ -26,7 +31,7 @@ class WCF_Sniffs_Namespaces_ClassMustBeImportedSniff implements PHP_CodeSniffer_
         * @param int                  $stackPtr  The position of the current token in the
         *                                        stack passed in $tokens.
         */
-       public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
+       public function process(File $phpcsFile, $stackPtr) {
                $tokens = $phpcsFile->getTokens();
                
                // skip files in global namespace
index dc8b87ae5f428ca66a873aa41441b35da8052cb8..9df7e5b475767a06e2134f9a004359ed9e3b821a 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+namespace WCF\Sniffs\Namespaces;
+
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Files\File;
+
 /**
  * This sniff is based on Squiz_Sniffs_Classes_ClassFileNameSniff. Originally written
  * by Greg Sherwood <gsherwood@squiz.net> and released under the terms of the BSD Licence.
@@ -9,7 +14,7 @@
  * @package    com.woltlab.wcf
  * @category   Community Framework
  */
-class WCF_Sniffs_Namespaces_SortedUseDeclarationSniff implements PHP_CodeSniffer_Sniff {
+class SortedUseDeclarationSniff implements Sniff {
        /**
         * Returns an array of tokens this test wants to listen for.
         *
@@ -28,7 +33,7 @@ class WCF_Sniffs_Namespaces_SortedUseDeclarationSniff implements PHP_CodeSniffer
         *
         * @return void
         */
-       public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
+       public function process(File $phpcsFile, $stackPtr) {
                $tokens = $phpcsFile->getTokens();
                
                $classes = array();
index 1d9bac295a4c2bf9789215d79d8400f0fb57c4d6..7070320ee7a788657077e8492a30cf014932fb9a 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+namespace WCF\Sniffs\Namespaces;
+
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Files\File;
+
 /**
  * This sniff is based on Squiz_Sniffs_Classes_ClassFileNameSniff. Originally written
  * by Greg Sherwood <gsherwood@squiz.net> and released under the terms of the BSD Licence.
  * @package    com.woltlab.wcf
  * @category   Community Framework
  */
-class WCF_Sniffs_Namespaces_UseDeclarationSniff implements PHP_CodeSniffer_Sniff {
-       /**
-        * Returns an array of tokens this test wants to listen for.
-        *
-        * @return array
-        */
-       public function register() {
-               return array(T_USE);
-       }
-
-       /**
-        * 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();
-               
-               // Ignore USE keywords inside closures.
-               $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true);
-               if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS) {
-                       return;
-               }
-               
-               // Only one USE declaration allowed per statement.
-               $next = $phpcsFile->findNext(array(T_COMMA, T_SEMICOLON), ($stackPtr + 1));
-               if ($tokens[$next]['code'] === T_COMMA) {
-                       $error = 'There must be one USE keyword per declaration';
-                       $phpcsFile->addError($error, $stackPtr, 'MultipleDeclarations');
-               }
-               
-               // Leading NS_SEPARATOR must be omitted
-               $next = $phpcsFile->findNext(array(T_NS_SEPARATOR, T_STRING), ($stackPtr + 1));
-               if ($tokens[$next]['code'] === T_NS_SEPARATOR) {
-                       $error = 'Leading backslash must be omitted.';
-                       $phpcsFile->addError($error, $stackPtr, 'LeadingNSSeparator');
-               }
-               
-               // Make sure this USE comes after the first namespace declaration.
-               $prev = $phpcsFile->findPrevious(T_NAMESPACE, ($stackPtr - 1));
-               if ($prev !== false) {
-                       $first = $phpcsFile->findNext(T_NAMESPACE, 1);
-                       if ($prev !== $first) {
-                               $error = 'USE declarations must go after the first namespace declaration';
-                               $phpcsFile->addError($error, $stackPtr, 'UseAfterNamespace');
-                       }
-               }
-               
-               $end = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1));
-               $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true);
-               if ($tokens[$next]['code'] === T_USE) {
-                       $diff = $tokens[$next]['line'] - $tokens[$stackPtr]['line'] - 1;
-                       if ($diff !== 0) {
-                               $error = 'There must not be any blank lines between use statements; %s found;';
-                               $data = array($diff);
-                               $phpcsFile->addError($error, $stackPtr, 'SpaceBetweenUse', $data);
-                       }
-               }
-               
-               // Only interested in the last USE statement from here onwards.
-               $nextUse = $phpcsFile->findNext(T_USE, ($stackPtr + 1));
-               if ($nextUse !== false) {
-                       $next = $phpcsFile->findNext(T_WHITESPACE, ($nextUse + 1), null, true);
-                       if ($tokens[$next]['code'] !== T_OPEN_PARENTHESIS) {
-                               return;
-                       }
-               }
-               
-               $end  = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1));
-               $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true);
-               $diff = ($tokens[$next]['line'] - $tokens[$end]['line'] - 1);
-               if ($diff !== 1) {
-                       if ($diff < 0) {
-                               $diff = 0;
-                       }
-                       
-                       $error = 'There must be one blank line after the last USE statement; %s found;';
-                       $data = array($diff);
-                       $phpcsFile->addError($error, $stackPtr, 'SpaceAfterLastUse', $data);
-               }
-       
-       }
-}
+class UseDeclarationSniff implements Sniff
+{
+
+
+    /**
+     * Returns an array of tokens this test wants to listen for.
+     *
+     * @return array
+     */
+    public function register()
+    {
+        return array(T_USE);
+
+    }//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(File $phpcsFile, $stackPtr)
+    {
+        if ($this->_shouldIgnoreUse($phpcsFile, $stackPtr) === true) {
+            return;
+        }
+
+        $tokens = $phpcsFile->getTokens();
+
+        // One space after the use keyword.
+        if ($tokens[($stackPtr + 1)]['content'] !== ' ') {
+            $error = 'There must be a single space after the USE keyword';
+            $fix   = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterUse');
+            if ($fix === true) {
+                $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' ');
+            }
+        }
+
+        // Only one USE declaration allowed per statement.
+        $next = $phpcsFile->findNext(array(T_COMMA, T_SEMICOLON), ($stackPtr + 1));
+        if ($tokens[$next]['code'] === T_COMMA) {
+            $error = 'There must be one USE keyword per declaration';
+            $fix   = $phpcsFile->addFixableError($error, $stackPtr, 'MultipleDeclarations');
+            if ($fix === true) {
+                $phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar.'use ');
+            }
+        }
+
+        // Leading NS_SEPARATOR must be omitted
+        $next = $phpcsFile->findNext(array(T_NS_SEPARATOR, T_STRING), ($stackPtr + 1));
+        if ($tokens[$next]['code'] === T_NS_SEPARATOR) {
+            $error = 'Leading backslash must be omitted.';
+            $phpcsFile->addError($error, $stackPtr, 'LeadingNSSeparator');
+        }
+        
+        // Make sure this USE comes after the first namespace declaration.
+        $prev = $phpcsFile->findPrevious(T_NAMESPACE, ($stackPtr - 1));
+        if ($prev !== false) {
+            $first = $phpcsFile->findNext(T_NAMESPACE, 1);
+            if ($prev !== $first) {
+                $error = 'USE declarations must go after the first namespace declaration';
+                $phpcsFile->addError($error, $stackPtr, 'UseAfterNamespace');
+            }
+        }
+
+        $end = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1));
+        $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true);
+        if ($tokens[$next]['code'] === T_USE) {
+            $diff = $tokens[$next]['line'] - $tokens[$stackPtr]['line'] - 1;
+            if ($diff !== 0) {
+                $error = 'There must not be any blank lines between use statements; %s found;';
+                $data = array($diff);
+                $phpcsFile->addError($error, $stackPtr, 'SpaceBetweenUse', $data);
+            }
+        }
+        
+        // Only interested in the last USE statement from here onwards.
+        $nextUse = $phpcsFile->findNext(T_USE, ($stackPtr + 1));
+        while ($this->_shouldIgnoreUse($phpcsFile, $nextUse) === true) {
+            $nextUse = $phpcsFile->findNext(T_USE, ($nextUse + 1));
+            if ($nextUse === false) {
+                break;
+            }
+        }
+
+        if ($nextUse !== false) {
+            return;
+        }
+
+        $end  = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1));
+        $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true);
+
+        if ($tokens[$next]['code'] === T_CLOSE_TAG) {
+            return;
+        }
+
+        $diff = ($tokens[$next]['line'] - $tokens[$end]['line'] - 1);
+        if ($diff !== 1) {
+            if ($diff < 0) {
+                $diff = 0;
+            }
+
+            $error = 'There must be one blank line after the last USE statement; %s found;';
+            $data  = array($diff);
+            $fix   = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterLastUse', $data);
+            if ($fix === true) {
+                if ($diff === 0) {
+                    $phpcsFile->fixer->addNewline($end);
+                } else {
+                    $phpcsFile->fixer->beginChangeset();
+                    for ($i = ($end + 1); $i < $next; $i++) {
+                        if ($tokens[$i]['line'] === $tokens[$next]['line']) {
+                            break;
+                        }
+
+                        $phpcsFile->fixer->replaceToken($i, '');
+                    }
+
+                    $phpcsFile->fixer->addNewline($end);
+                    $phpcsFile->fixer->endChangeset();
+                }
+            }
+        }//end if
+
+    }//end process()
+
+
+    /**
+     * Check if this use statement is part of the namespace block.
+     *
+     * @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
+     */
+    private function _shouldIgnoreUse(File $phpcsFile, $stackPtr)
+    {
+        $tokens = $phpcsFile->getTokens();
+
+        // Ignore USE keywords inside closures.
+        $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true);
+        if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS) {
+            return true;
+        }
+
+        // Ignore USE keywords for traits.
+        if ($phpcsFile->hasCondition($stackPtr, array(T_CLASS, T_TRAIT)) === true) {
+            return true;
+        }
+
+        return false;
+
+    }//end _shouldIgnoreUse()
+
+
+}//end class
index ec4cf0bd7e3c7d228558e82f8a76f29058333be7..204b16c1214b0765e95040b0c145725480d133b2 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+namespace WCF\Sniffs\WhiteSpace;
+
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Files\File;
+
 /**
  * This sniff is based on Squiz_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff. Originally written
  * by Greg Sherwood <gsherwood@squiz.net> and Marc McIntyre <mmcintyre@squiz.net>
@@ -10,7 +15,7 @@
  * @package    com.woltlab.wcf
  * @category   Community Framework
  */
-class WCF_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff implements PHP_CodeSniffer_Sniff {
+class SuperfluousWhitespaceSniff implements Sniff {
        /**
         * A list of tokenizers this sniff supports.
         *
@@ -52,7 +57,7 @@ class WCF_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff implements PHP_CodeSniffe
         * @param int                  $stackPtr  The position of the current token in the
         *                                        stack passed in $tokens.
         */
-       public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
+       public function process(File $phpcsFile, $stackPtr) {
                $tokens = $phpcsFile->getTokens();
                
                if ($tokens[$stackPtr]['code'] === T_OPEN_TAG) {