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

Reply via email to