Skip to content

Commit

Permalink
False positive in UnusedUseStatement sniff
Browse files Browse the repository at this point in the history
Corrected recognising type after colon - we can't just assome that colon
is RTH declaration. It can be in switch and then can be everything.
  • Loading branch information
michalbundyra committed Nov 14, 2019
1 parent c5d952d commit 1206d91
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

use const T_AS;
use const T_BITWISE_OR;
use const T_CLOSE_PARENTHESIS;
use const T_CLOSE_USE_GROUP;
use const T_COLON;
use const T_COMMA;
Expand All @@ -39,6 +40,7 @@
use const T_NS_SEPARATOR;
use const T_NULLABLE;
use const T_OBJECT_OPERATOR;
use const T_OPEN_CURLY_BRACKET;
use const T_OPEN_PARENTHESIS;
use const T_OPEN_USE_GROUP;
use const T_SEMICOLON;
Expand Down Expand Up @@ -408,7 +410,6 @@ private function determineType(File $phpcsFile, int $beforePtr, int $ptr) : ?str
if (in_array($beforeCode, [
T_NEW,
T_NULLABLE,
T_COLON,
T_EXTENDS,
T_IMPLEMENTS,
T_INSTANCEOF,
Expand Down Expand Up @@ -453,10 +454,27 @@ private function determineType(File $phpcsFile, int $beforePtr, int $ptr) : ?str
return 'function';
}

if (in_array($afterCode, [T_DOUBLE_COLON, T_VARIABLE, T_ELLIPSIS, T_NS_SEPARATOR], true)) {
if (in_array($afterCode, [
T_DOUBLE_COLON,
T_VARIABLE,
T_ELLIPSIS,
T_NS_SEPARATOR,
T_OPEN_CURLY_BRACKET,
], true)) {
return 'class';
}

if ($beforeCode === T_COLON) {
$prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, $beforePtr - 1, null, true);
if ($prev !== false
&& $tokens[$prev]['code'] === T_CLOSE_PARENTHESIS
&& isset($tokens[$prev]['parenthesis_owner'])
&& $tokens[$tokens[$prev]['parenthesis_owner']]['code'] === T_FUNCTION
) {
return 'class';
}
}

if ($afterCode === T_BITWISE_OR) {
$next = $phpcsFile->findNext(
Tokens::$emptyTokens + [
Expand Down
43 changes: 43 additions & 0 deletions test/Sniffs/Namespaces/UnusedUseStatementUnitTest.3.inc
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,46 @@ namespace Fourth {

Foo\A::class;
}

namespace Fifth {
use MyNamespace\MyClass1;
use MyNamespace\MyClass2;
use MyNamespace\MyType1;
use MyNamespace\MyType2;
use MyNamespace\MyType3;

use function file_get_contents;
use function file_put_contents;

use const MyNamespace\CONST_1;
use const MyNamespace\CONST_2;

switch (true) {
case 1:
file_put_contents(__FILE__, __DIR__);
break;
case 2:
CONST_1 + $a;
break;
case 3:
MyClass1::class;
break;
case 4;
file_get_contents(__FILE__);
break;
case 5;
CONST_2 + $b;
break;
case 6;
MyClass2::class;
break;
}

abstract class MyAbstractClass {
abstract public function myMethod1() : MyType1;

public function myMethod2() : MyType2 {
static function () use ($a) : MyType3 {};
}
}
}
43 changes: 43 additions & 0 deletions test/Sniffs/Namespaces/UnusedUseStatementUnitTest.3.inc.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,46 @@ namespace Fourth {

Foo\A::class;
}

namespace Fifth {
use MyNamespace\MyClass1;
use MyNamespace\MyClass2;
use MyNamespace\MyType1;
use MyNamespace\MyType2;
use MyNamespace\MyType3;

use function file_get_contents;
use function file_put_contents;

use const MyNamespace\CONST_1;
use const MyNamespace\CONST_2;

switch (true) {
case 1:
file_put_contents(__FILE__, __DIR__);
break;
case 2:
CONST_1 + $a;
break;
case 3:
MyClass1::class;
break;
case 4;
file_get_contents(__FILE__);
break;
case 5;
CONST_2 + $b;
break;
case 6;
MyClass2::class;
break;
}

abstract class MyAbstractClass {
abstract public function myMethod1() : MyType1;

public function myMethod2() : MyType2 {
static function () use ($a) : MyType3 {};
}
}
}

0 comments on commit 1206d91

Please sign in to comment.