Skip to content

Commit 3245849

Browse files
authored
Fix recognition of variable functions (#27)
* Tests: add failing test for variable function calls * If a static var is in a class, don't ignore it * Handle static variable function calls
1 parent 4f54eb8 commit 3245849

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,12 @@ protected function checkForStaticMember(File $phpcsFile, $stackPtr, $varName, $c
524524
if (! in_array($tokens[$classNamePtr]['code'], $staticReferences, true)) {
525525
return false;
526526
}
527+
// "When calling static methods, the function call is stronger than the
528+
// static property operator" so look for a function call.
529+
$parenPointer = $phpcsFile->findNext(T_OPEN_PARENTHESIS, $stackPtr, $stackPtr + 2);
530+
if ($parenPointer) {
531+
return false;
532+
}
527533
return true;
528534
}
529535

@@ -555,7 +561,7 @@ protected function checkForStaticOutsideClass(File $phpcsFile, $stackPtr, $varNa
555561
return true;
556562
}
557563
if ($this->areAnyConditionsAClass($token['conditions'])) {
558-
return true;
564+
return false;
559565
}
560566
}
561567
$phpcsFile->addError(

VariableAnalysis/Tests/CodeAnalysis/VariableAnalysisTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,4 +385,16 @@ public function testTraitAllowsThis() {
385385
$expectedErrors = [];
386386
$this->assertEquals($expectedErrors, $lines);
387387
}
388+
389+
public function testVariableFunctionCallsCountAsUsage() {
390+
$fixtureFile = $this->getFixture('FunctionWithVariableCallFixture.php');
391+
$phpcsFile = $this->prepareLocalFileForSniffs($this->getSniffFiles(), $fixtureFile);
392+
$phpcsFile->process();
393+
$lines = $this->getWarningLineNumbersFromFile($phpcsFile);
394+
$expectedWarnings = [18];
395+
$this->assertEquals($expectedWarnings, $lines);
396+
$lines = $this->getErrorLineNumbersFromFile($phpcsFile);
397+
$expectedErrors = [];
398+
$this->assertEquals($expectedErrors, $lines);
399+
}
388400
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
class MyClass {
4+
public function funcUsingSelfCallbackFromAlias($meta, $callback) {
5+
$get_meta_callback = $callback;
6+
return self::$get_meta_callback( $meta );
7+
}
8+
9+
public function funcUsingSelfCallbackFromArgument($meta, $callback) {
10+
return self::$callback( $meta );
11+
}
12+
13+
public function funcUsingStaticCallbackFromArgument($meta, $callback) {
14+
return static::$callback( $meta );
15+
}
16+
17+
public function funcUsingStaticCallbackWithUndefinedVariable($meta) {
18+
return static::$badName( $meta );
19+
}
20+
21+
public function funcUsingPropertyReference($meta, $callback) {
22+
return $this->$callback( $meta );
23+
}
24+
25+
public function funcUsingDirectCallback($meta, $callback) {
26+
return $callback( $meta );
27+
}
28+
29+
public function funcUsingPropertyReferenceDirectly($meta) {
30+
return $meta;
31+
}
32+
33+
public function funcUsingPropertyReferenceWithSelf($meta) {
34+
return self::$$meta;
35+
}
36+
37+
public function funcUsingPropertyReferenceWithThis($meta) {
38+
return $this->$meta;
39+
}
40+
41+
public function funcUsingPropertyReferenceWithStatic($meta) {
42+
return static::$$meta;
43+
}
44+
}

0 commit comments

Comments
 (0)