Skip to content

Commit d5766dd

Browse files
committed
SlevomatCodingStandard.Variables.UselessVariable: Fixed false positive
1 parent 7eaa45d commit d5766dd

File tree

5 files changed

+48
-25
lines changed

5 files changed

+48
-25
lines changed

SlevomatCodingStandard/Sniffs/Variables/UselessVariableSniff.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use const T_MOD_EQUAL;
3232
use const T_MUL_EQUAL;
3333
use const T_OPEN_CURLY_BRACKET;
34+
use const T_OPEN_PARENTHESIS;
3435
use const T_OR_EQUAL;
3536
use const T_PLUS_EQUAL;
3637
use const T_POW_EQUAL;
@@ -39,6 +40,7 @@
3940
use const T_SL_EQUAL;
4041
use const T_SR_EQUAL;
4142
use const T_STATIC;
43+
use const T_STRING;
4244
use const T_SWITCH;
4345
use const T_VARIABLE;
4446
use const T_WHILE;
@@ -109,6 +111,10 @@ public function process(File $phpcsFile, $returnPointer): void
109111
return;
110112
}
111113

114+
if ($this->isAssignedInFunctionCall($phpcsFile, $previousVariablePointer)) {
115+
return;
116+
}
117+
112118
if ($this->hasVariableVarAnnotation($phpcsFile, $previousVariablePointer)) {
113119
return;
114120
}
@@ -233,6 +239,24 @@ private function isAssignedInControlStructure(File $phpcsFile, int $pointer): bo
233239
return $tokens[$controlStructure]['parenthesis_opener'] < $pointer && $pointer < $tokens[$controlStructure]['parenthesis_closer'];
234240
}
235241

242+
private function isAssignedInFunctionCall(File $phpcsFile, int $pointer): bool
243+
{
244+
$possibleFunctionNamePointer = TokenHelper::findPrevious($phpcsFile, T_STRING, $pointer - 1);
245+
246+
if ($possibleFunctionNamePointer === null) {
247+
return false;
248+
}
249+
250+
$tokens = $phpcsFile->getTokens();
251+
252+
$parenthesisOpenerPointer = TokenHelper::findNextEffective($phpcsFile, $possibleFunctionNamePointer + 1);
253+
if ($tokens[$parenthesisOpenerPointer]['code'] !== T_OPEN_PARENTHESIS) {
254+
return false;
255+
}
256+
257+
return $parenthesisOpenerPointer < $pointer && $pointer < $tokens[$parenthesisOpenerPointer]['parenthesis_closer'];
258+
}
259+
236260
private function isAssigmentToVariable(File $phpcsFile, int $pointer): bool
237261
{
238262
$assigmentPointer = TokenHelper::findNextEffective($phpcsFile, $pointer + 1);

tests/Sniffs/Variables/UselessVariableSniffTest.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function testErrors(): void
1717
{
1818
$report = self::checkFile(__DIR__ . '/data/uselessVariableErrors.php');
1919

20-
self::assertSame(19, $report->getErrorCount());
20+
self::assertSame(18, $report->getErrorCount());
2121

2222
self::assertSniffError($report, 4, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $a.');
2323
self::assertSniffError($report, 9, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $b.');
@@ -34,10 +34,9 @@ public function testErrors(): void
3434
self::assertSniffError($report, 64, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $m.');
3535
self::assertSniffError($report, 69, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $n.');
3636
self::assertSniffError($report, 78, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $o.');
37-
self::assertSniffError($report, 84, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $p.');
38-
self::assertSniffError($report, 89, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $q.');
39-
self::assertSniffError($report, 99, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $r.');
40-
self::assertSniffError($report, 103, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $z.');
37+
self::assertSniffError($report, 89, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $r.');
38+
self::assertSniffError($report, 94, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $s.');
39+
self::assertSniffError($report, 98, UselessVariableSniff::CODE_USELESS_VARIABLE, 'Useless variable $z.');
4140

4241
self::assertAllFixedInFile($report);
4342
}

tests/Sniffs/Variables/data/uselessVariableErrors.fixed.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,6 @@ function moreVariableOneWithoutAssigment() {
6363
return 10;
6464
}
6565

66-
function assigmentAsFunctionParametr() {
67-
doSomething($p = 0);
68-
return $p;
69-
}
70-
71-
function assigmentAfterAssignment() {
72-
doSomething($qq = $q = 0);
73-
return $q;
74-
}
75-
7666
function afterIfStatement(float $seconds): string
7767
{
7868
if ($seconds < 1) {
@@ -82,4 +72,9 @@ function afterIfStatement(float $seconds): string
8272
return round($seconds, 2) . 's';
8373
}
8474

75+
function moreAssigments($object) {
76+
$object->title = $s = $object->url ?: $object->somethingElse;
77+
return $s;
78+
}
79+
8580
return null;

tests/Sniffs/Variables/data/uselessVariableErrors.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,6 @@ function moreVariableOneWithoutAssigment() {
8080
return $o;
8181
}
8282

83-
function assigmentAsFunctionParametr() {
84-
doSomething($p = 0);
85-
return $p;
86-
}
87-
88-
function assigmentAfterAssignment() {
89-
doSomething($qq = $q = 0);
90-
return $q;
91-
}
92-
9383
function afterIfStatement(float $seconds): string
9484
{
9585
if ($seconds < 1) {
@@ -100,5 +90,10 @@ function afterIfStatement(float $seconds): string
10090
return $r;
10191
}
10292

93+
function moreAssigments($object) {
94+
$object->title = $s = $object->url ?: $object->somethingElse;
95+
return $s;
96+
}
97+
10398
$z = null;
10499
return $z;

tests/Sniffs/Variables/data/uselessVariableNoErrors.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,13 @@ function boo($backtrace) {
191191
for ($class = $backtrace[$frame]['class']; ($parent = get_parent_class($class)) !== false; $class = $parent);
192192
return $class;
193193
}
194+
195+
function assigmentAsFunctionParametr() {
196+
doSomething($p = 0);
197+
return $p;
198+
}
199+
200+
function assigmentAfterAssignment() {
201+
doSomething($qq = $q = 0);
202+
return $q;
203+
}

0 commit comments

Comments
 (0)