From a87d4e9aef4e166899c3f8f339580ae18f9e73f1 Mon Sep 17 00:00:00 2001 From: Payton Swick Date: Mon, 12 Feb 2018 17:44:19 -0500 Subject: [PATCH 1/2] Tests: Add foreach with `list` expansion to fixture --- .../fixtures/FunctionWithForeachFixture.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/VariableAnalysis/Tests/CodeAnalysis/fixtures/FunctionWithForeachFixture.php b/VariableAnalysis/Tests/CodeAnalysis/fixtures/FunctionWithForeachFixture.php index c0cc3d9b..ef3c43ee 100644 --- a/VariableAnalysis/Tests/CodeAnalysis/fixtures/FunctionWithForeachFixture.php +++ b/VariableAnalysis/Tests/CodeAnalysis/fixtures/FunctionWithForeachFixture.php @@ -54,3 +54,15 @@ function function_with_defined_foreach() { foreach ($array as $key4 => &$value4) { } } + +$data = [ + ['foo', 'Foo'], + ['bar', 'Bar'], + +]; +foreach ($data as $val) { + echo json_encode($val); +} +foreach ($data as list($name, $label)) { + printf('
%s
', $name, $label); +} From 6e89a41bdf141e1c8bab6dc6c5ab2c400af32f42 Mon Sep 17 00:00:00 2001 From: Payton Swick Date: Mon, 12 Feb 2018 18:17:36 -0500 Subject: [PATCH 2/2] Use T_FOREACH in checkForForeachLoopVar The open bracket check could be fooled by a `list()`. --- .../Sniffs/CodeAnalysis/VariableAnalysisSniff.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php b/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php index 6bdcfa93..0341e778 100644 --- a/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php +++ b/VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php @@ -537,12 +537,16 @@ protected function checkForForeachLoopVar(File $phpcsFile, $stackPtr, $varName, $token = $tokens[$stackPtr]; // Are we a foreach loopvar? - $openPtr = Helpers::findContainingOpeningBracket($phpcsFile, $stackPtr); + $lastStatementPtr = $phpcsFile->findPrevious(T_SEMICOLON, $stackPtr); + if ($lastStatementPtr === false) { + $lastStatementPtr = 0; + } + $openPtr = $phpcsFile->findPrevious(T_FOREACH, $stackPtr, $lastStatementPtr); if ($openPtr === false) { return false; } - // Is there an 'as' token between us and the opening bracket? + // Is there an 'as' token between us and the foreach? if ($phpcsFile->findPrevious(T_AS, $stackPtr - 1, $openPtr) === false) { return false; }