diff --git a/Tests/VariableAnalysisSniff/IfConditionTest.php b/Tests/VariableAnalysisSniff/IfConditionTest.php index 63ac330..ad6e7c8 100644 --- a/Tests/VariableAnalysisSniff/IfConditionTest.php +++ b/Tests/VariableAnalysisSniff/IfConditionTest.php @@ -30,6 +30,39 @@ public function testIfConditionWarnings() { 101, 159, 166, + 176, + 179, + ]; + $this->assertEquals($expectedWarnings, $lines); + } + + public function testIfConditionWarningsWithValidUndefinedVariableNames() { + $fixtureFile = $this->getFixture('FunctionWithIfConditionFixture.php'); + $phpcsFile = $this->prepareLocalFileForSniffs($fixtureFile); + $phpcsFile->ruleset->setSniffProperty( + 'VariableAnalysis\Sniffs\CodeAnalysis\VariableAnalysisSniff', + 'validUndefinedVariableNames', + 'second' + ); + $phpcsFile->ruleset->setSniffProperty( + 'VariableAnalysis\Sniffs\CodeAnalysis\VariableAnalysisSniff', + 'allowUnusedParametersBeforeUsed', + 'true' + ); + $phpcsFile->process(); + $lines = $this->getWarningLineNumbersFromFile($phpcsFile); + $expectedWarnings = [ + 15, + 36, + 47, + 58, + 70, + 82, + 98, + 159, + 166, + 176, + 179, ]; $this->assertEquals($expectedWarnings, $lines); } @@ -60,6 +93,39 @@ public function testInlineIfConditionWarnings() { 88, 130, 136, + 152, + 154, + ]; + $this->assertEquals($expectedWarnings, $lines); + } + + public function testInlineIfConditionWarningsWithValidUndefinedVariableNames() { + $fixtureFile = $this->getFixture('FunctionWithInlineIfConditionFixture.php'); + $phpcsFile = $this->prepareLocalFileForSniffs($fixtureFile); + $phpcsFile->ruleset->setSniffProperty( + 'VariableAnalysis\Sniffs\CodeAnalysis\VariableAnalysisSniff', + 'validUndefinedVariableNames', + 'second' + ); + $phpcsFile->ruleset->setSniffProperty( + 'VariableAnalysis\Sniffs\CodeAnalysis\VariableAnalysisSniff', + 'allowUnusedParametersBeforeUsed', + 'true' + ); + $phpcsFile->process(); + $lines = $this->getWarningLineNumbersFromFile($phpcsFile); + $expectedWarnings = [ + 14, + 34, + 44, + 54, + 64, + 74, + 86, + 130, + 136, + 152, + 154, ]; $this->assertEquals($expectedWarnings, $lines); } diff --git a/Tests/VariableAnalysisSniff/fixtures/FunctionWithIfConditionFixture.php b/Tests/VariableAnalysisSniff/fixtures/FunctionWithIfConditionFixture.php index eaa9841..ecb7042 100644 --- a/Tests/VariableAnalysisSniff/fixtures/FunctionWithIfConditionFixture.php +++ b/Tests/VariableAnalysisSniff/fixtures/FunctionWithIfConditionFixture.php @@ -167,3 +167,16 @@ function loopAndPushWithUndefinedArray($parts) { } return $suggestions; } + +function definedInsideElseIfBlockUndefinedInsideElseBlockDifferentName($first) { + $name = 'human'; + if ($first) { + $words = "hello {$name}"; + } elseif ($name) { + $third = true; // unused variable $third + } else { + $words = "bye {$name}"; + echo $third; // undefined variable $third + } + echo $words; +} diff --git a/Tests/VariableAnalysisSniff/fixtures/FunctionWithInlineIfConditionFixture.php b/Tests/VariableAnalysisSniff/fixtures/FunctionWithInlineIfConditionFixture.php index d5dfcad..171788b 100644 --- a/Tests/VariableAnalysisSniff/fixtures/FunctionWithInlineIfConditionFixture.php +++ b/Tests/VariableAnalysisSniff/fixtures/FunctionWithInlineIfConditionFixture.php @@ -143,3 +143,14 @@ function ifElseConditionWithInlineAssignAndUseInsideElse() { else echo $q; } + +function definedInsideElseIfBlockUndefinedInsideElseBlockDifferentName($first) { + $name = 'human'; + if ($first) + $words = "hello {$name}"; + elseif ($name) + $third = true; // unused variable $third + else + echo $third; // undefined variable $third + echo $words; +} diff --git a/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php b/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php index bfe41f2..7d40f18 100644 --- a/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php +++ b/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php @@ -1518,8 +1518,10 @@ protected function processVaribleInsideElse(File $phpcsFile, $stackPtr, $varName } if (count($assignmentsInsideAttachedBlocks) === count($allAssignmentIndices)) { - Helpers::debug("variable $varName inside else looks undefined"); - $this->warnAboutUndefinedVariable($phpcsFile, $varName, $stackPtr); + if (! $varInfo->ignoreUndefined) { + Helpers::debug("variable $varName inside else looks undefined"); + $this->warnAboutUndefinedVariable($phpcsFile, $varName, $stackPtr); + } return; }