public function isReference($stackPtr)
{
if ($this->_tokens[$stackPtr]['code'] !== T_BITWISE_AND) {
return false;
}
$tokenBefore = $this->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, $stackPtr - 1, null, true);
if ($this->_tokens[$tokenBefore]['code'] === T_FUNCTION) {
// Function returns a reference.
return true;
}
if ($this->_tokens[$tokenBefore]['code'] === T_DOUBLE_ARROW) {
// Inside a foreach loop, this is a reference.
return true;
}
if ($this->_tokens[$tokenBefore]['code'] === T_AS) {
// Inside a foreach loop, this is a reference.
return true;
}
if ($this->_tokens[$tokenBefore]['code'] === T_OPEN_SHORT_ARRAY) {
// Inside an array declaration, this is a reference.
return true;
}
if (isset(PHP_CodeSniffer_Tokens::$assignmentTokens[$this->_tokens[$tokenBefore]['code']]) === true) {
// This is directly after an assignment. It's a reference. Even if
// it is part of an operation, the other tests will handle it.
return true;
}
if (isset($this->_tokens[$stackPtr]['nested_parenthesis']) === true) {
$brackets = $this->_tokens[$stackPtr]['nested_parenthesis'];
$lastBracket = array_pop($brackets);
if (isset($this->_tokens[$lastBracket]['parenthesis_owner']) === true) {
$owner = $this->_tokens[$this->_tokens[$lastBracket]['parenthesis_owner']];
if ($owner['code'] === T_FUNCTION || $owner['code'] === T_CLOSURE || $owner['code'] === T_ARRAY) {
// Inside a function or array declaration, this is a reference.
return true;
}
} else {
$prev = false;
for ($t = $this->_tokens[$lastBracket]['parenthesis_opener'] - 1; $t >= 0; $t--) {
if ($this->_tokens[$t]['code'] !== T_WHITESPACE) {
$prev = $t;
break;
}
}
if ($prev !== false && $this->_tokens[$prev]['code'] === T_USE) {
return true;
}
}
//end if
}
//end if
$tokenAfter = $this->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, $stackPtr + 1, null, true);
if ($this->_tokens[$tokenAfter]['code'] === T_VARIABLE && ($this->_tokens[$tokenBefore]['code'] === T_OPEN_PARENTHESIS || $this->_tokens[$tokenBefore]['code'] === T_COMMA)) {
return true;
}
return false;
}