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