Page MenuHomePhabricator

UnusedUseStatementSniff leaves behind semicolons
Closed, ResolvedPublic

Description

Running only UnusedUseStatementSniff leaves behind extraneous semicolons. You don't see this in normal usage because the empty statements are taken care of by other sniffs.

Test case

$ mkdir /tmp/test && cd /tmp/test
$ composer require mediawiki/mediawiki-codesniffer
$ cat <<EOF > test.php
<?php

use Foo;
EOF
$ cat <<EOF > .phpcs.xml
<?xml version="1.0"?>
<ruleset>
    <rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki/Sniffs/Classes/UnusedUseStatementSniff.php" />
</ruleset>
EOF
$ vendor/bin/phpcbf test.php

Expected result

test.php is

<?php

Actual result

test.php is

<?php

;

Notes

Fixing it seems pretty straightforward:

diff --git a/MediaWiki/Sniffs/Classes/UnusedUseStatementSniff.php b/MediaWiki/Sniffs/Classes/UnusedUseStatementSniff.php
index 2cb7227..4dc17da 100644
--- a/MediaWiki/Sniffs/Classes/UnusedUseStatementSniff.php
+++ b/MediaWiki/Sniffs/Classes/UnusedUseStatementSniff.php
@@ -311,6 +311,12 @@ class UnusedUseStatementSniff implements Sniff {
                        $i++;
                } while ( isset( $tokens[$i] ) && $tokens[$i]['code'] !== T_SEMICOLON );
 
+               // Remove the semicolon too.
+               if ( isset( $tokens[$i] ) && $tokens[$i]['code'] === T_SEMICOLON ) {
+                       $phpcsFile->fixer->replaceToken( $i, '' );
+                       $i++;
+               }
+
                // Also remove whitespace after the semicolon (new lines).
                while ( isset( $tokens[$i] )
                        && $tokens[$i]['code'] === T_WHITESPACE

I'd submit that to Gerrit myself, but my Gerrit account seems to be non-functional.

Event Timeline

Change 639887 had a related patch set uploaded (by Umherirrender; owner: Umherirrender):
[mediawiki/tools/codesniffer@master] Remove semicolon in UnusedUseStatementSniff

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

I did a major rewrite of this sniff in https://gerrit.wikimedia.org/r/592415. The loop at the end was intended to remove the semicolon as well, but stops to early. I did not noticed. Thanks for catching this! Here is how it was meant to be: https://gerrit.wikimedia.org/r/c/mediawiki/tools/codesniffer/+/639887/4/MediaWiki/Sniffs/Classes/UnusedUseStatementSniff.php

Change 639887 had a related patch set uploaded (by Umherirrender; owner: Umherirrender):
[mediawiki/tools/codesniffer@master] Remove semicolon in UnusedUseStatementSniff

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

Change 639887 merged by jenkins-bot:
[mediawiki/tools/codesniffer@master] Remove semicolon in UnusedUseStatementSniff

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

Umherirrender claimed this task.
Umherirrender triaged this task as Low priority.