MaxSem has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/373433 )

Change subject: WIP: prohibit some globals
......................................................................

WIP: prohibit some globals

Change-Id: Ib75750212128bba70de7cd7d815b982982ed1505
---
A MediaWiki/Sniffs/VariableAnalysis/ForbiddenGlobalVariablesSniff.php
A MediaWiki/Tests/files/VariableAnalysis/forbidden_global_variables.php
A MediaWiki/Tests/files/VariableAnalysis/forbidden_global_variables.php.expect
3 files changed, 105 insertions(+), 0 deletions(-)


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

diff --git 
a/MediaWiki/Sniffs/VariableAnalysis/ForbiddenGlobalVariablesSniff.php 
b/MediaWiki/Sniffs/VariableAnalysis/ForbiddenGlobalVariablesSniff.php
new file mode 100644
index 0000000..d7ef8a0
--- /dev/null
+++ b/MediaWiki/Sniffs/VariableAnalysis/ForbiddenGlobalVariablesSniff.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Detect use of discouraged global variables.
+ */
+
+namespace MediaWiki\Sniffs\VariableAnalysis;
+
+use PHP_CodeSniffer\Files\File;
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Util\Tokens;
+
+class ForbiddenGlobalVariablesSniff implements Sniff {
+
+       /**
+        * Forbidden globals
+        */
+       private $forbiddenGlobals = [
+               '$parserMemc',
+       ];
+
+       /**
+        * @return array
+        */
+       public function register() {
+               return [ T_FUNCTION ];
+       }
+
+       /**
+        * @param File $phpcsFile File object.
+        * @param int $stackPtr The current token index.
+        * @return void
+        */
+       public function process( File $phpcsFile, $stackPtr ) {
+               $tokens = $phpcsFile->getTokens();
+               if ( !isset( $tokens[$stackPtr]['scope_opener'] ) ) {
+                       // An interface or abstract function which doesn't have 
a body
+                       return;
+               }
+               $scopeOpener = ++$tokens[$stackPtr]['scope_opener'];
+               $scopeCloser = $tokens[$stackPtr]['scope_closer'];
+
+               $globalLine = 0;
+               $globalVariables = [];
+
+               for ( $i = $scopeOpener; $i < $scopeCloser; $i++ ) {
+                       if ( array_key_exists( $tokens[$i]['type'], 
Tokens::$emptyTokens ) ) {
+                               continue;
+                       }
+                       if ( $tokens[$i]['type'] === 'T_GLOBAL' ) {
+                               $globalLine = $tokens[$i]['line'];
+                       }
+                       if ( $tokens[$i]['type'] === 'T_VARIABLE' && 
$tokens[$i]['line'] == $globalLine ) {
+                               $globalVariables[] = [ $tokens[$i]['content'], 
$i ];
+                       }
+               }
+               foreach ( $globalVariables as $global ) {
+                       if ( in_array( $global[0], $this->forbiddenGlobals ) ) {
+                               $phpcsFile->addWarning(
+                                       "Global {$global[0]} should not be 
used.",
+                                       $global[1],
+                                       'ForbiddenGlobal' . $global[0]
+                               );
+                       }
+               }
+       }
+}
diff --git 
a/MediaWiki/Tests/files/VariableAnalysis/forbidden_global_variables.php 
b/MediaWiki/Tests/files/VariableAnalysis/forbidden_global_variables.php
new file mode 100644
index 0000000..a41ea36
--- /dev/null
+++ b/MediaWiki/Tests/files/VariableAnalysis/forbidden_global_variables.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * No errors should be found here
+ */
+function wfValidFunction() {
+       global $wgFoo, $wgBar;
+
+       echo $wgFoo, $wgBar;
+}
+
+/**
+ * This one should fail
+ */
+function wfInvalidFunction() {
+       global $wgFoo, $parserMemc;
+
+       echo $parserMemc;
+}
+
+class Foo {
+       /**
+        * No errors should be found here
+        */
+       public function validFunction() {
+               global $wgFoo, $wgBar;
+
+               echo $wgFoo, $wgBar;
+       }
+
+       /**
+        * This one should fail
+        */
+       private function invalidFunction() {
+               global $wgFoo, $parserMemc;
+
+               echo $wgFoo, $parserMemc;
+       }
+}
diff --git 
a/MediaWiki/Tests/files/VariableAnalysis/forbidden_global_variables.php.expect 
b/MediaWiki/Tests/files/VariableAnalysis/forbidden_global_variables.php.expect
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ 
b/MediaWiki/Tests/files/VariableAnalysis/forbidden_global_variables.php.expect

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib75750212128bba70de7cd7d815b982982ed1505
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/tools/codesniffer
Gerrit-Branch: master
Gerrit-Owner: MaxSem <maxsem.w...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to