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

Breadcrumb

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

function SelfMemberReferenceSniff::processTokenWithinScope

Processes the function tokens within the class.

Parameters

\PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found.:

int $stackPtr The position where the token was found.:

int $currScope The current scope opener token.:

Return value

void

Overrides AbstractScopeSniff::processTokenWithinScope

File

vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php, line 44

Class

SelfMemberReferenceSniff

Namespace

PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes

Code

protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) {
    $tokens = $phpcsFile->getTokens();
    // Determine if this is a double colon which needs to be examined.
    $conditions = $tokens[$stackPtr]['conditions'];
    $conditions = array_reverse($conditions, true);
    foreach ($conditions as $conditionToken => $tokenCode) {
        if ($tokenCode === T_CLASS || $tokenCode === T_ANON_CLASS || $tokenCode === T_CLOSURE) {
            break;
        }
    }
    if ($conditionToken !== $currScope) {
        return;
    }
    $calledClassName = $phpcsFile->findPrevious(Tokens::$emptyTokens, $stackPtr - 1, null, true);
    if ($calledClassName === false) {
        // Parse error.
        return;
    }
    if ($tokens[$calledClassName]['code'] === T_SELF) {
        if ($tokens[$calledClassName]['content'] !== 'self') {
            $error = 'Must use "self::" for local static member reference; found "%s::"';
            $data = [
                $tokens[$calledClassName]['content'],
            ];
            $fix = $phpcsFile->addFixableError($error, $calledClassName, 'IncorrectCase', $data);
            if ($fix === true) {
                $phpcsFile->fixer
                    ->replaceToken($calledClassName, 'self');
            }
            return;
        }
    }
    else {
        if ($tokens[$calledClassName]['code'] === T_STRING) {
            // If the class is called with a namespace prefix, build fully qualified
            // namespace calls for both current scope class and requested class.
            $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, $calledClassName - 1, null, true);
            if ($prevNonEmpty !== false && $tokens[$prevNonEmpty]['code'] === T_NS_SEPARATOR) {
                $declarationName = $this->getDeclarationNameWithNamespace($tokens, $calledClassName);
                $declarationName = ltrim($declarationName, '\\');
                $fullQualifiedClassName = $this->getNamespaceOfScope($phpcsFile, $currScope);
                if ($fullQualifiedClassName === '\\') {
                    $fullQualifiedClassName = '';
                }
                else {
                    $fullQualifiedClassName .= '\\';
                }
                $fullQualifiedClassName .= $phpcsFile->getDeclarationName($currScope);
            }
            else {
                $declarationName = $phpcsFile->getDeclarationName($currScope);
                $fullQualifiedClassName = $tokens[$calledClassName]['content'];
            }
            if ($declarationName === $fullQualifiedClassName) {
                // Class name is the same as the current class, which is not allowed.
                $error = 'Must use "self::" for local static member reference';
                $fix = $phpcsFile->addFixableError($error, $calledClassName, 'NotUsed');
                if ($fix === true) {
                    $phpcsFile->fixer
                        ->beginChangeset();
                    $currentPointer = $stackPtr - 1;
                    while ($tokens[$currentPointer]['code'] === T_NS_SEPARATOR || $tokens[$currentPointer]['code'] === T_STRING || isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true) {
                        if (isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true) {
                            --$currentPointer;
                            continue;
                        }
                        $phpcsFile->fixer
                            ->replaceToken($currentPointer, '');
                        --$currentPointer;
                    }
                    $phpcsFile->fixer
                        ->replaceToken($stackPtr, 'self::');
                    $phpcsFile->fixer
                        ->endChangeset();
                    // Fix potential whitespace issues in the next loop.
                    return;
                }
                
                //end if
            }
            
            //end if
        }
    }
    
    //end if
    if ($tokens[$stackPtr - 1]['code'] === T_WHITESPACE) {
        $found = $tokens[$stackPtr - 1]['length'];
        $error = 'Expected 0 spaces before double colon; %s found';
        $data = [
            $found,
        ];
        $fix = $phpcsFile->addFixableError($error, $stackPtr - 1, 'SpaceBefore', $data);
        if ($fix === true) {
            $phpcsFile->fixer
                ->beginChangeset();
            for ($i = $stackPtr - 1; $tokens[$i]['code'] === T_WHITESPACE; $i--) {
                $phpcsFile->fixer
                    ->replaceToken($i, '');
            }
            $phpcsFile->fixer
                ->endChangeset();
        }
    }
    if ($tokens[$stackPtr + 1]['code'] === T_WHITESPACE) {
        $found = $tokens[$stackPtr + 1]['length'];
        $error = 'Expected 0 spaces after double colon; %s found';
        $data = [
            $found,
        ];
        $fix = $phpcsFile->addFixableError($error, $stackPtr - 1, 'SpaceAfter', $data);
        if ($fix === true) {
            $phpcsFile->fixer
                ->beginChangeset();
            for ($i = $stackPtr + 1; $tokens[$i]['code'] === T_WHITESPACE; $i++) {
                $phpcsFile->fixer
                    ->replaceToken($i, '');
            }
            $phpcsFile->fixer
                ->endChangeset();
        }
    }
}

API Navigation

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