Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. File.php

function File::isReference

Determine if the passed token is a reference operator.

Returns true if the specified token position represents a reference. Returns false if the token represents a bitwise operator.

Parameters

int $stackPtr The position of the T_BITWISE_AND token.:

Return value

boolean

File

vendor/squizlabs/php_codesniffer/src/Files/File.php, line 2096

Class

File

Namespace

PHP_CodeSniffer\Files

Code

public function isReference($stackPtr) {
    if ($this->tokens[$stackPtr]['code'] !== T_BITWISE_AND) {
        return false;
    }
    $tokenBefore = $this->findPrevious(Tokens::$emptyTokens, $stackPtr - 1, null, true);
    if ($this->tokens[$tokenBefore]['code'] === T_FUNCTION || $this->tokens[$tokenBefore]['code'] === T_CLOSURE || $this->tokens[$tokenBefore]['code'] === T_FN) {
        // Function returns a reference.
        return true;
    }
    if ($this->tokens[$tokenBefore]['code'] === T_DOUBLE_ARROW) {
        // Inside a foreach loop or array assignment, this is a reference.
        return true;
    }
    if ($this->tokens[$tokenBefore]['code'] === T_AS) {
        // Inside a foreach loop, this is a reference.
        return true;
    }
    if (isset(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;
    }
    $tokenAfter = $this->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true);
    if ($this->tokens[$tokenAfter]['code'] === T_NEW) {
        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_FN) {
                $params = $this->getMethodParameters($this->tokens[$lastBracket]['parenthesis_owner']);
                foreach ($params as $param) {
                    if ($param['reference_token'] === $stackPtr) {
                        // Function parameter declared to be passed by reference.
                        return true;
                    }
                }
            }
            
            //end if
        }
        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) {
                // Closure use by reference.
                return true;
            }
        }
        
        //end if
    }
    
    //end if
    // Pass by reference in function calls and assign by reference in arrays.
    if ($this->tokens[$tokenBefore]['code'] === T_OPEN_PARENTHESIS || $this->tokens[$tokenBefore]['code'] === T_COMMA || $this->tokens[$tokenBefore]['code'] === T_OPEN_SHORT_ARRAY) {
        if ($this->tokens[$tokenAfter]['code'] === T_VARIABLE) {
            return true;
        }
        else {
            $skip = Tokens::$emptyTokens;
            $skip[] = T_NS_SEPARATOR;
            $skip[] = T_SELF;
            $skip[] = T_PARENT;
            $skip[] = T_STATIC;
            $skip[] = T_STRING;
            $skip[] = T_NAMESPACE;
            $skip[] = T_DOUBLE_COLON;
            $nextSignificantAfter = $this->findNext($skip, $stackPtr + 1, null, true);
            if ($this->tokens[$nextSignificantAfter]['code'] === T_VARIABLE) {
                return true;
            }
        }
        
        //end if
    }
    
    //end if
    return false;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal