Florianschmidtwelzow has uploaded a new change for review. https://gerrit.wikimedia.org/r/301828
Change subject: Disallow parenthesis around keywords like clone or require ...................................................................... Disallow parenthesis around keywords like clone or require php.net defines these keywords as "clone $obj;", "require 'path/to/file.php';". The new sniff ParenthesesAroundKeyword enforces the notation documented by php.net by warns against usages as function calls, e.g. clone ( $obj ); -> fails clone( $obj ); -> fails clone $obj; -> passes The same for: * require * require_once * include * include_once Bug: T116779 Change-Id: I9688e0df256a41490c27ac5924f090436a6c2527 --- A MediaWiki/Sniffs/ExtraCharacters/ParenthesesAroundKeywordSniff.php A MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php A MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php.expect A MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php.fixed A MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_pass.php A MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_pass.php.expect 6 files changed, 149 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/tools/codesniffer refs/changes/28/301828/1 diff --git a/MediaWiki/Sniffs/ExtraCharacters/ParenthesesAroundKeywordSniff.php b/MediaWiki/Sniffs/ExtraCharacters/ParenthesesAroundKeywordSniff.php new file mode 100644 index 0000000..fab6ba9 --- /dev/null +++ b/MediaWiki/Sniffs/ExtraCharacters/ParenthesesAroundKeywordSniff.php @@ -0,0 +1,73 @@ +<?php +/** + * Sniff to warn when keywords are used as functions, such as: + * Pass: clone $obj + * Fail: clone( $obj ) + * Pass: require 'path/to/file.php'; + * Fail: require( 'path/to/file' ); + * + * Covers: + * * clone + * * require + * * require_once + * * include + * * include_once + */ +// @codingStandardsIgnoreStart +class MediaWiki_Sniffs_ExtraCharacters_ParenthesesAroundKeywordSniff + implements PHP_CodeSniffer_Sniff { + // @codingStandardsIgnoreEnd + + /** + * @return array + */ + public function register() { + return [ + T_CLONE, + T_REQUIRE, + T_REQUIRE_ONCE, + T_INCLUDE, + T_INCLUDE_ONCE, + ]; + } + + /** + * @param PHP_CodeSniffer_File $phpcsFile PHP_CodeSniffer_File object. + * @param int $stackPtr The current token index. + * @return void + */ + public function process( PHP_CodeSniffer_File $phpcsFile, $stackPtr ) { + $tokens = $phpcsFile->getTokens(); + $nextToken = $tokens[$stackPtr + 1]; + $nextSecondToken = $tokens[$stackPtr + 2]; + + if ( + ( + $nextToken['code'] === T_WHITESPACE && + $nextSecondToken['code'] === T_OPEN_PARENTHESIS + ) || + $nextToken['code'] === T_OPEN_PARENTHESIS + ) { + $fix = $phpcsFile->addFixableWarning( + $tokens[$stackPtr]['content'] . ' keyword must not be used as a function.', + $stackPtr + 1, + 'ParenthesesAroundKeywords' ); + if ( $fix === true ) { + if ( $nextToken['code'] === T_OPEN_PARENTHESIS ) { + $phpcsFile->fixer->replaceToken( $stackPtr + 1, '' ); + } else { + $phpcsFile->fixer->replaceToken( $stackPtr + 2, '' ); + if ( $tokens[$stackPtr + 3]['code'] === T_WHITESPACE ) { + $phpcsFile->fixer->replaceToken( $stackPtr + 3, '' ); + } + } + // remove the closing parenthesis + $i = 0; + while ( $tokens[$stackPtr + $i]['code'] !== T_CLOSE_PARENTHESIS ) { + $i++; + } + $phpcsFile->fixer->replaceToken( $stackPtr + $i, '' ); + } + } + } +} diff --git a/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php new file mode 100644 index 0000000..1dc3864 --- /dev/null +++ b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php @@ -0,0 +1,17 @@ +<?php + +clone ( $obj ); +clone( $obj ); +clone $obj; +require( 'jfrpg' ); +require ( 'krpg' ); +require 'rkjgjpr'; +require_once( 'jfrpg' ); +require_once ( 'krpg' ); +require_once 'rkjgjpr'; +include( 'jfrpg' ); +include ( 'krpg' ); +include 'rkjgjpr'; +include_once( 'jfrpg' ); +include_once ( 'krpg' ); +include_once 'rkjgjpr'; diff --git a/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php.expect b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php.expect new file mode 100644 index 0000000..8a4784a --- /dev/null +++ b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php.expect @@ -0,0 +1,35 @@ + +FILE: ...sts/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php +---------------------------------------------------------------------- +FOUND 4 ERRORS AND 10 WARNINGS AFFECTING 10 LINES +---------------------------------------------------------------------- + 3 | WARNING | [x] clone keyword must not be used as a function. + 4 | WARNING | [x] clone keyword must not be used as a function. + 6 | ERROR | [x] Language constructs must be followed by a single + | | space; expected "require (" but found "require(" + 6 | WARNING | [x] require keyword must not be used as a function. + 7 | WARNING | [x] require keyword must not be used as a function. + 9 | ERROR | [x] Language constructs must be followed by a single + | | space; expected "require_once (" but found + | | "require_once(" + 9 | WARNING | [x] require_once keyword must not be used as a + | | function. + 10 | WARNING | [x] require_once keyword must not be used as a + | | function. + 12 | ERROR | [x] Language constructs must be followed by a single + | | space; expected "include (" but found "include(" + 12 | WARNING | [x] include keyword must not be used as a function. + 13 | WARNING | [x] include keyword must not be used as a function. + 15 | ERROR | [x] Language constructs must be followed by a single + | | space; expected "include_once (" but found + | | "include_once(" + 15 | WARNING | [x] include_once keyword must not be used as a + | | function. + 16 | WARNING | [x] include_once keyword must not be used as a + | | function. +---------------------------------------------------------------------- +PHPCBF CAN FIX THE 14 MARKED SNIFF VIOLATIONS AUTOMATICALLY +---------------------------------------------------------------------- + +Time: 24496728 mins, 22.78 secs; Memory: 11.5Mb + diff --git a/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php.fixed b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php.fixed new file mode 100644 index 0000000..9e22b47 --- /dev/null +++ b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_fail.php.fixed @@ -0,0 +1,17 @@ +<?php + +clone $obj; +clone $obj; +clone $obj; +require 'jfrpg'; +require 'krpg'; +require 'rkjgjpr'; +require_once 'jfrpg'; +require_once 'krpg'; +require_once 'rkjgjpr'; +include 'jfrpg'; +include 'krpg'; +include 'rkjgjpr'; +include_once 'jfrpg'; +include_once 'krpg'; +include_once 'rkjgjpr'; diff --git a/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_pass.php b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_pass.php new file mode 100644 index 0000000..6a0c2f0 --- /dev/null +++ b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_pass.php @@ -0,0 +1,7 @@ +<?php + +clone $obj; +require 'rkjgjpr'; +require_once 'rkjgjpr'; +include 'rkjgjpr'; +include_once 'rkjgjpr'; diff --git a/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_pass.php.expect b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_pass.php.expect new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/MediaWiki/Tests/files/ExtraCharacters/parenthesis_after_keyword_tag_pass.php.expect -- To view, visit https://gerrit.wikimedia.org/r/301828 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I9688e0df256a41490c27ac5924f090436a6c2527 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/tools/codesniffer Gerrit-Branch: master Gerrit-Owner: Florianschmidtwelzow <florian.schmidt.stargatewis...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits