From 6a824afd005d358815243264e47d6d20f31b73ee Mon Sep 17 00:00:00 2001 From: Payton Swick Date: Mon, 5 Feb 2018 11:32:20 -0500 Subject: [PATCH 1/3] Tests: add failing test for variable function calls --- .../CodeAnalysis/VariableAnalysisTest.php | 12 +++++ .../FunctionWithVariableCallFixture.php | 44 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 VariableAnalysis/Tests/CodeAnalysis/fixtures/FunctionWithVariableCallFixture.php diff --git a/VariableAnalysis/Tests/CodeAnalysis/VariableAnalysisTest.php b/VariableAnalysis/Tests/CodeAnalysis/VariableAnalysisTest.php index ce94d6bb..1c4a8fb8 100644 --- a/VariableAnalysis/Tests/CodeAnalysis/VariableAnalysisTest.php +++ b/VariableAnalysis/Tests/CodeAnalysis/VariableAnalysisTest.php @@ -385,4 +385,16 @@ public function testTraitAllowsThis() { $expectedErrors = []; $this->assertEquals($expectedErrors, $lines); } + + public function testVariableFunctionCallsCountAsUsage() { + $fixtureFile = $this->getFixture('FunctionWithVariableCallFixture.php'); + $phpcsFile = $this->prepareLocalFileForSniffs($this->getSniffFiles(), $fixtureFile); + $phpcsFile->process(); + $lines = $this->getWarningLineNumbersFromFile($phpcsFile); + $expectedWarnings = [18]; + $this->assertEquals($expectedWarnings, $lines); + $lines = $this->getErrorLineNumbersFromFile($phpcsFile); + $expectedErrors = []; + $this->assertEquals($expectedErrors, $lines); + } } diff --git a/VariableAnalysis/Tests/CodeAnalysis/fixtures/FunctionWithVariableCallFixture.php b/VariableAnalysis/Tests/CodeAnalysis/fixtures/FunctionWithVariableCallFixture.php new file mode 100644 index 00000000..16fa366e --- /dev/null +++ b/VariableAnalysis/Tests/CodeAnalysis/fixtures/FunctionWithVariableCallFixture.php @@ -0,0 +1,44 @@ +$callback( $meta ); + } + + public function funcUsingDirectCallback($meta, $callback) { + return $callback( $meta ); + } + + public function funcUsingPropertyReferenceDirectly($meta) { + return $meta; + } + + public function funcUsingPropertyReferenceWithSelf($meta) { + return self::$$meta; + } + + public function funcUsingPropertyReferenceWithThis($meta) { + return $this->$meta; + } + + public function funcUsingPropertyReferenceWithStatic($meta) { + return static::$$meta; + } +} From bc3db485efe9ccea782ca75e491b28aac3970a65 Mon Sep 17 00:00:00 2001 From: Payton Swick Date: Wed, 7 Feb 2018 18:23:49 -0500 Subject: [PATCH 2/3] If a static var is in a class, don't ignore it --- VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php b/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php index f2100dec..445b10d0 100644 --- a/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php +++ b/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php @@ -555,7 +555,7 @@ protected function checkForStaticOutsideClass(File $phpcsFile, $stackPtr, $varNa return true; } if ($this->areAnyConditionsAClass($token['conditions'])) { - return true; + return false; } } $phpcsFile->addError( From 22c22d17771793a70d4fd3ea3ec9be10105b2c78 Mon Sep 17 00:00:00 2001 From: Payton Swick Date: Thu, 8 Feb 2018 18:38:09 -0500 Subject: [PATCH 3/3] Handle static variable function calls --- .../Sniffs/CodeAnalysis/VariableAnalysisSniff.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php b/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php index 445b10d0..84a2e26f 100644 --- a/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php +++ b/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php @@ -524,6 +524,12 @@ protected function checkForStaticMember(File $phpcsFile, $stackPtr, $varName, $c if (! in_array($tokens[$classNamePtr]['code'], $staticReferences, true)) { return false; } + // "When calling static methods, the function call is stronger than the + // static property operator" so look for a function call. + $parenPointer = $phpcsFile->findNext(T_OPEN_PARENTHESIS, $stackPtr, $stackPtr + 2); + if ($parenPointer) { + return false; + } return true; }