TasneemLo has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/243096

Change subject: Sniff to warn check usage of dirname(__FILE__)
......................................................................

Sniff to warn check usage of dirname(__FILE__)

Add functionality to change from dirname(__FILE__) to __FILE__.
Fail: dirname( __FILE__ )
Pass: dirname( __FILE__ . "/.." )
Pass: dirname( __FILE__, 2 )
Pass: dirname( joinpaths( __FILE__, ".." ) )
Pass: $abc->dirname( __FILE__ )
Pass: parent::dirname( __FILE__ )

Bug: T114267
Change-Id: I0172800a4b18d0045c361872166d36cd04172823
---
A MediaWiki/Sniffs/Usage/DirUsageSniff.php
R MediaWiki/Sniffs/Usage/GotoUsageSniff.php
A MediaWiki/Tests/files/Usage/dir_usage_fail.php
A MediaWiki/Tests/files/Usage/dir_usage_pass.php
R MediaWiki/Tests/files/Usage/goto_usage_fail.php
R MediaWiki/Tests/files/Usage/goto_usage_pass.php
6 files changed, 114 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/tools/codesniffer 
refs/changes/96/243096/1

diff --git a/MediaWiki/Sniffs/Usage/DirUsageSniff.php 
b/MediaWiki/Sniffs/Usage/DirUsageSniff.php
new file mode 100644
index 0000000..1181a2b
--- /dev/null
+++ b/MediaWiki/Sniffs/Usage/DirUsageSniff.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Report error when dirname(__FILE__) is used instead of __DIR__
+ *
+ * Fail: dirname( __FILE__ )
+ * Pass: dirname( __FILE__ . "/.." )
+ * Pass: dirname( __FILE__, 2 )
+ * Pass: dirname( joinpaths( __FILE__, ".." ) )
+ * Pass: $abc->dirname( __FILE__ )
+ * Pass: parent::dirname( __FILE__ )
+ */
+
+// @codingStandardsIgnoreStart
+class MediaWiki_Sniffs_Usage_DirUsageSniff implements PHP_CodeSniffer_Sniff {
+    // @codingStandardsIgnoreEnd
+    public function register() {
+        // As per 
https://www.mediawiki.org/wiki/Manual:Coding_conventions/PHP#Other
+        return array(T_STRING);
+    }
+
+    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
+        $tokens = $phpcsFile->getTokens();
+
+        $ignore = array(
+                   T_DOUBLE_COLON    => true,
+                   T_OBJECT_OPERATOR => true,
+                   T_FUNCTION        => true,
+                   T_CONST           => true,
+                  );
+
+        // Check if the function is dirname()
+        if ( strtolower($tokens[$stackPtr]['content']) != "dirname" ) {
+            return;
+        }
+
+        // Check if it's a PHP function
+        $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), 
null, true);
+        if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
+            return;
+        }
+
+        // Find the paranthesis for the function
+        $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, 
true);
+        if ( $tokens[$nextToken]['code'] !== T_OPEN_PARENTHESIS ) {
+            return;
+        }
+
+        // Check if __FILE__ is inside it
+        $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($nextToken + 1), 
null, true);
+        if ( $tokens[$nextToken]['code'] !== T_FILE ) {
+            return;
+        }
+
+        // Find close paranthesis
+        $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($nextToken + 1), 
null, true);
+        if ( $tokens[$nextToken]['code'] !== T_CLOSE_PARENTHESIS ) {
+            return;
+        }
+
+        $fix = $phpcsFile->addFixableError(
+            'Use __DIR__ constant instead of calling dirname(__FILE__)',
+            $stackPtr,
+            'FunctionFound'
+        );
+        if ( $fix === true ) {
+            $curToken = $stackPtr;
+            while ( $curToken <= $nextToken ) {
+                if ( $tokens[$curToken]['code'] === T_FILE ) {
+                    $phpcsFile->fixer->replaceToken( $curToken, '__DIR__' );
+                } else {
+                    $phpcsFile->fixer->replaceToken( $curToken, '' );
+                }
+                $curToken += 1;
+            }
+        }
+    }
+}
diff --git a/MediaWiki/Sniffs/GotoUsage/GotoUsageSniff.php 
b/MediaWiki/Sniffs/Usage/GotoUsageSniff.php
similarity index 84%
rename from MediaWiki/Sniffs/GotoUsage/GotoUsageSniff.php
rename to MediaWiki/Sniffs/Usage/GotoUsageSniff.php
index f549f15..dd081ee 100644
--- a/MediaWiki/Sniffs/GotoUsage/GotoUsageSniff.php
+++ b/MediaWiki/Sniffs/Usage/GotoUsageSniff.php
@@ -3,7 +3,7 @@
  * Report error when `goto` is used
  */
 // @codingStandardsIgnoreStart
-class MediaWiki_Sniffs_GotoUsage_GotoUsageSniff implements 
PHP_CodeSniffer_Sniff {
+class MediaWiki_Sniffs_Usage_GotoUsageSniff implements PHP_CodeSniffer_Sniff {
        // @codingStandardsIgnoreEnd
        public function register() {
                // As per 
https://www.mediawiki.org/wiki/Manual:Coding_conventions/PHP#Other
diff --git a/MediaWiki/Tests/files/Usage/dir_usage_fail.php 
b/MediaWiki/Tests/files/Usage/dir_usage_fail.php
new file mode 100644
index 0000000..0449ea2
--- /dev/null
+++ b/MediaWiki/Tests/files/Usage/dir_usage_fail.php
@@ -0,0 +1,4 @@
+<?php
+
+$tmp = dirname( __FILE__ );
+echo "Done";
diff --git a/MediaWiki/Tests/files/Usage/dir_usage_pass.php 
b/MediaWiki/Tests/files/Usage/dir_usage_pass.php
new file mode 100644
index 0000000..ec2e6a4
--- /dev/null
+++ b/MediaWiki/Tests/files/Usage/dir_usage_pass.php
@@ -0,0 +1,32 @@
+<?php
+
+class FOO extends BAR {
+       function __construct() {
+       }
+
+       function dirname( $a ) {
+               return BAR::dirname( __FILE__ );
+       }
+
+       function foo( $a ) {
+               return BAR::foo( __FILE__ );
+       }
+
+       function bar( $a ) {
+               return BAR::bar( 0 );
+       }
+}
+
+$foo = FOO();
+
+$tmp = dirname( __FILE__ . "/.." );
+$tmp = dirname( joinpaths( __FILE__, ".." ) );
+$tmp = $foo->dirname( __FILE__ );
+
+$f = __FILE__;
+$tmp = dirname( $f );
+$tmp = dirname( $f . "/.." );
+$tmp = dirname( joinpaths( $f, ".." ) );
+$tmp = $foo->dirname( $f );
+
+echo "Done";
diff --git a/MediaWiki/Tests/files/GotoUsage/goto_usage_fail.php 
b/MediaWiki/Tests/files/Usage/goto_usage_fail.php
similarity index 100%
rename from MediaWiki/Tests/files/GotoUsage/goto_usage_fail.php
rename to MediaWiki/Tests/files/Usage/goto_usage_fail.php
diff --git a/MediaWiki/Tests/files/GotoUsage/goto_usage_pass.php 
b/MediaWiki/Tests/files/Usage/goto_usage_pass.php
similarity index 100%
rename from MediaWiki/Tests/files/GotoUsage/goto_usage_pass.php
rename to MediaWiki/Tests/files/Usage/goto_usage_pass.php

-- 
To view, visit https://gerrit.wikimedia.org/r/243096
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0172800a4b18d0045c361872166d36cd04172823
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/tools/codesniffer
Gerrit-Branch: master
Gerrit-Owner: TasneemLo <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to