Skip to content

Commit 48c16a5

Browse files
committed
Support shorthand list assignment
1 parent 35bc63e commit 48c16a5

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

VariableAnalysis/Lib/Helpers.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,25 @@
55
use PHP_CodeSniffer\Files\File;
66

77
class Helpers {
8+
public static function findContainingOpeningSquareBracket(File $phpcsFile, $stackPtr) {
9+
$tokens = $phpcsFile->getTokens();
10+
$previousStatementPtr = self::getPreviousStatementPtr($phpcsFile, $stackPtr);
11+
return $phpcsFile->findPrevious(T_OPEN_SHORT_ARRAY, $stackPtr - 1, $previousStatementPtr);
12+
}
13+
14+
public static function findContainingClosingSquareBracket(File $phpcsFile, $stackPtr) {
15+
$tokens = $phpcsFile->getTokens();
16+
$endOfStatementPtr = $phpcsFile->findNext([T_SEMICOLON], $stackPtr + 1);
17+
if (! $endOfStatementPtr) {
18+
return false;
19+
}
20+
return $phpcsFile->findNext(T_CLOSE_SHORT_ARRAY, $stackPtr + 1, $endOfStatementPtr);
21+
}
22+
23+
public static function getPreviousStatementPtr(File $phpcsFile, $stackPtr) {
24+
return $phpcsFile->findPrevious([T_SEMICOLON, T_CLOSE_CURLY_BRACKET], $stackPtr - 1) ?: 1;
25+
}
26+
827
public static function findContainingOpeningBracket(File $phpcsFile, $stackPtr) {
928
$tokens = $phpcsFile->getTokens();
1029
if (isset($tokens[$stackPtr]['nested_parenthesis'])) {

VariableAnalysis/Sniffs/CodeAnalysis/VariableAnalysisSniff.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,29 @@ protected function checkForAssignment(File $phpcsFile, $stackPtr, $varName, $cur
438438
return true;
439439
}
440440

441+
protected function checkForListShorthandAssignment(File $phpcsFile, $stackPtr, $varName, $currScope) {
442+
$tokens = $phpcsFile->getTokens();
443+
$token = $tokens[$stackPtr];
444+
445+
// OK, are we within a [ ... ] construct?
446+
$openPtr = Helpers::findContainingOpeningSquareBracket($phpcsFile, $stackPtr);
447+
if ($openPtr === false) {
448+
return false;
449+
}
450+
451+
// OK, we're a [ ... ] construct... are we being assigned to?
452+
$closePtr = Helpers::findContainingClosingSquareBracket($phpcsFile, $stackPtr);
453+
$assignPtr = Helpers::isNextThingAnAssign($phpcsFile, $closePtr);
454+
if ($assignPtr === false) {
455+
return false;
456+
}
457+
458+
// Yes, we're being assigned.
459+
$writtenPtr = Helpers::findWhereAssignExecuted($phpcsFile, $assignPtr);
460+
$this->markVariableAssignment($varName, $writtenPtr, $currScope);
461+
return true;
462+
}
463+
441464
protected function checkForListAssignment(File $phpcsFile, $stackPtr, $varName, $currScope) {
442465
$tokens = $phpcsFile->getTokens();
443466
$token = $tokens[$stackPtr];
@@ -737,6 +760,11 @@ protected function processVariable(File $phpcsFile, $stackPtr) {
737760
return;
738761
}
739762

763+
// OK, are we within a [...] = construct?
764+
if ($this->checkForListShorthandAssignment($phpcsFile, $stackPtr, $varName, $currScope)) {
765+
return;
766+
}
767+
740768
// Are we a global declaration?
741769
if ($this->checkForGlobalDeclaration($phpcsFile, $stackPtr, $varName, $currScope)) {
742770
return;

0 commit comments

Comments
 (0)