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

Breadcrumb

  1. Drupal Core 11.1.x

UseDeclarationSniff.php

Same filename in this branch
  1. 11.1.x vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php

Namespace

PHP_CodeSniffer\Standards\PSR12\Sniffs\Traits

File

vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php

View source
<?php


/**
 * Verifies that trait import statements are defined correctly.
 *
 * @author    Greg Sherwood <gsherwood@squiz.net>
 * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
 * @license   https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
 */
namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Traits;

use PHP_CodeSniffer\Files\File;
use PHP_CodeSniffer\Sniffs\Sniff;
use PHP_CodeSniffer\Util\Tokens;
class UseDeclarationSniff implements Sniff {
    
    /**
     * Returns an array of tokens this test wants to listen for.
     *
     * @return array<int|string>
     */
    public function register() {
        return [
            T_USE,
        ];
    }
    
    //end register()
    
    /**
     * Processes this test, when one of its tokens is encountered.
     *
     * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
     * @param int                         $stackPtr  The position of the current token in the
     *                                               stack passed in $tokens.
     *
     * @return void|int
     */
    public function process(File $phpcsFile, $stackPtr) {
        $tokens = $phpcsFile->getTokens();
        // Needs to be a use statement directly inside a class.
        $conditions = $tokens[$stackPtr]['conditions'];
        end($conditions);
        if (isset(Tokens::$ooScopeTokens[current($conditions)]) === false) {
            return;
        }
        $ooToken = key($conditions);
        $opener = $tokens[$ooToken]['scope_opener'];
        // Figure out where all the use statements are.
        $useTokens = [
            $stackPtr,
        ];
        for ($i = $stackPtr + 1; $i < $tokens[$ooToken]['scope_closer']; $i++) {
            if ($tokens[$i]['code'] === T_USE) {
                $useTokens[] = $i;
            }
            if (isset($tokens[$i]['scope_closer']) === true) {
                $i = $tokens[$i]['scope_closer'];
            }
        }
        $numUseTokens = count($useTokens);
        foreach ($useTokens as $usePos => $useToken) {
            if ($usePos === 0) {
                
                /*
                    This is the first use statement.
                */
                // The first non-comment line must be the use line.
                $lastValidContent = $useToken;
                for ($i = $useToken - 1; $i > $opener; $i--) {
                    if ($tokens[$i]['code'] === T_WHITESPACE && ($tokens[$i - 1]['line'] === $tokens[$i]['line'] || $tokens[$i + 1]['line'] === $tokens[$i]['line'])) {
                        continue;
                    }
                    if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) {
                        if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) {
                            // Skip past the comment.
                            $i = $tokens[$i]['comment_opener'];
                        }
                        $lastValidContent = $i;
                        continue;
                    }
                    break;
                }
                
                //end for
                if ($tokens[$lastValidContent]['line'] !== $tokens[$opener]['line'] + 1) {
                    $error = 'The first trait import statement must be declared on the first non-comment line after the %s opening brace';
                    $data = [
                        strtolower($tokens[$ooToken]['content']),
                    ];
                    // Figure out if we can fix this error.
                    $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, $useToken - 1, $opener - 1, true);
                    if ($tokens[$prev]['line'] === $tokens[$opener]['line']) {
                        $fix = $phpcsFile->addFixableError($error, $useToken, 'UseAfterBrace', $data);
                        if ($fix === true) {
                            // We know that the USE statements is the first non-comment content
                            // in the class, so we just need to remove blank lines.
                            $phpcsFile->fixer
                                ->beginChangeset();
                            for ($i = $useToken - 1; $i > $opener; $i--) {
                                if ($tokens[$i]['line'] === $tokens[$opener]['line']) {
                                    break;
                                }
                                if ($tokens[$i]['line'] === $tokens[$useToken]['line']) {
                                    continue;
                                }
                                if ($tokens[$i]['code'] === T_WHITESPACE && $tokens[$i - 1]['line'] !== $tokens[$i]['line'] && $tokens[$i + 1]['line'] !== $tokens[$i]['line']) {
                                    $phpcsFile->fixer
                                        ->replaceToken($i, '');
                                }
                                if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) {
                                    if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) {
                                        // Skip past the comment.
                                        $i = $tokens[$i]['comment_opener'];
                                    }
                                    $lastValidContent = $i;
                                }
                            }
                            
                            //end for
                            $phpcsFile->fixer
                                ->endChangeset();
                        }
                        
                        //end if
                    }
                    else {
                        $phpcsFile->addError($error, $useToken, 'UseAfterBrace', $data);
                    }
                    
                    //end if
                }
                
                //end if
            }
            else {
                // Make sure this use statement is not on the same line as the previous one.
                $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, $useToken - 1, null, true);
                if ($prev !== false && $tokens[$prev]['line'] === $tokens[$useToken]['line']) {
                    $error = 'Each imported trait must be on its own line';
                    $prevNonWs = $phpcsFile->findPrevious(T_WHITESPACE, $useToken - 1, null, true);
                    if ($prevNonWs !== $prev) {
                        $phpcsFile->addError($error, $useToken, 'SpacingBeforeImport');
                    }
                    else {
                        $fix = $phpcsFile->addFixableError($error, $useToken, 'SpacingBeforeImport');
                        if ($fix === true) {
                            $phpcsFile->fixer
                                ->beginChangeset();
                            for ($x = $useToken - 1; $x > $prev; $x--) {
                                if ($tokens[$x]['line'] === $tokens[$useToken]['line']) {
                                    // Preserve indent.
                                    continue;
                                }
                                $phpcsFile->fixer
                                    ->replaceToken($x, '');
                            }
                            $phpcsFile->fixer
                                ->addNewline($prev);
                            if ($tokens[$prev]['line'] === $tokens[$useToken]['line']) {
                                if ($tokens[$useToken - 1]['code'] === T_WHITESPACE) {
                                    $phpcsFile->fixer
                                        ->replaceToken($useToken - 1, '');
                                }
                                $padding = str_repeat(' ', $tokens[$useTokens[0]]['column'] - 1);
                                $phpcsFile->fixer
                                    ->addContent($prev, $padding);
                            }
                            $phpcsFile->fixer
                                ->endChangeset();
                        }
                        
                        //end if
                    }
                    
                    //end if
                }
                
                //end if
            }
            
            //end if
            $error = 'Expected 1 space after USE in trait import statement; %s found';
            if ($tokens[$useToken + 1]['code'] !== T_WHITESPACE) {
                $data = [
                    '0',
                ];
                $fix = $phpcsFile->addFixableError($error, $useToken, 'SpaceAfterUse', $data);
                if ($fix === true) {
                    $phpcsFile->fixer
                        ->addContent($useToken, ' ');
                }
            }
            else {
                if ($tokens[$useToken + 1]['content'] !== ' ') {
                    $next = $phpcsFile->findNext(T_WHITESPACE, $useToken + 1, null, true);
                    if ($tokens[$next]['line'] !== $tokens[$useToken]['line']) {
                        $found = 'newline';
                    }
                    else {
                        $found = $tokens[$useToken + 1]['length'];
                    }
                    $data = [
                        $found,
                    ];
                    $fix = $phpcsFile->addFixableError($error, $useToken, 'SpaceAfterUse', $data);
                    if ($fix === true) {
                        if ($found === 'newline') {
                            $phpcsFile->fixer
                                ->beginChangeset();
                            for ($x = $useToken + 1; $x < $next; $x++) {
                                $phpcsFile->fixer
                                    ->replaceToken($x, '');
                            }
                            $phpcsFile->fixer
                                ->addContent($useToken, ' ');
                            $phpcsFile->fixer
                                ->endChangeset();
                        }
                        else {
                            $phpcsFile->fixer
                                ->replaceToken($useToken + 1, ' ');
                        }
                    }
                }
            }
            
            //end if
            // Check the formatting of the statement.
            if (isset($tokens[$useToken]['scope_opener']) === true) {
                $this->processUseGroup($phpcsFile, $useToken);
                $end = $tokens[$useToken]['scope_closer'];
            }
            else {
                $this->processUseStatement($phpcsFile, $useToken);
                $end = $phpcsFile->findNext(T_SEMICOLON, $useToken + 1);
                if ($end === false) {
                    // Syntax error.
                    return;
                }
            }
            if ($usePos === $numUseTokens - 1) {
                
                /*
                    This is the last use statement.
                */
                $next = $phpcsFile->findNext(T_WHITESPACE, $end + 1, null, true);
                if ($next === $tokens[$ooToken]['scope_closer']) {
                    // Last content in the class.
                    $closer = $tokens[$ooToken]['scope_closer'];
                    if ($tokens[$closer]['line'] > $tokens[$end]['line'] + 1) {
                        $error = 'There must be no blank line after the last trait import statement at the bottom of a %s';
                        $data = [
                            strtolower($tokens[$ooToken]['content']),
                        ];
                        $fix = $phpcsFile->addFixableError($error, $end, 'BlankLineAfterLastUse', $data);
                        if ($fix === true) {
                            $phpcsFile->fixer
                                ->beginChangeset();
                            for ($i = $end + 1; $i < $closer; $i++) {
                                if ($tokens[$i]['line'] === $tokens[$end]['line']) {
                                    continue;
                                }
                                if ($tokens[$i]['line'] === $tokens[$closer]['line']) {
                                    // Don't remove indents.
                                    break;
                                }
                                $phpcsFile->fixer
                                    ->replaceToken($i, '');
                            }
                            $phpcsFile->fixer
                                ->endChangeset();
                        }
                    }
                    
                    //end if
                }
                else {
                    if ($tokens[$next]['code'] !== T_USE) {
                        // Comments are allowed on the same line as the use statement, so make sure
                        // we don't error for those.
                        for ($next = $end + 1; $next < $tokens[$ooToken]['scope_closer']; $next++) {
                            if ($tokens[$next]['code'] === T_WHITESPACE) {
                                continue;
                            }
                            if (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true && $tokens[$next]['line'] === $tokens[$end]['line']) {
                                continue;
                            }
                            break;
                        }
                        if ($tokens[$next]['line'] <= $tokens[$end]['line'] + 1) {
                            $error = 'There must be a blank line following the last trait import statement';
                            $fix = $phpcsFile->addFixableError($error, $end, 'NoBlankLineAfterUse');
                            if ($fix === true) {
                                if ($tokens[$next]['line'] === $tokens[$useToken]['line']) {
                                    $phpcsFile->fixer
                                        ->addContentBefore($next, $phpcsFile->eolChar . $phpcsFile->eolChar);
                                }
                                else {
                                    for ($i = $next - 1; $i > $end; $i--) {
                                        if ($tokens[$i]['line'] !== $tokens[$next]['line']) {
                                            break;
                                        }
                                    }
                                    $phpcsFile->fixer
                                        ->addNewlineBefore($i + 1);
                                }
                            }
                        }
                    }
                }
                
                //end if
            }
            else {
                // Ensure use statements are grouped.
                $next = $phpcsFile->findNext(Tokens::$emptyTokens, $end + 1, null, true);
                if ($next !== $useTokens[$usePos + 1]) {
                    $error = 'Imported traits must be grouped together';
                    $phpcsFile->addError($error, $useTokens[$usePos + 1], 'NotGrouped');
                }
            }
            
            //end if
        }
        
        //end foreach
        return $tokens[$ooToken]['scope_closer'];
    }
    
    //end process()
    
    /**
     * Processes a group use statement.
     *
     * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
     * @param int                         $stackPtr  The position of the current token in the
     *                                               stack passed in $tokens.
     *
     * @return void
     */
    protected function processUseGroup(File $phpcsFile, $stackPtr) {
        $tokens = $phpcsFile->getTokens();
        $opener = $tokens[$stackPtr]['scope_opener'];
        $closer = $tokens[$stackPtr]['scope_closer'];
        if ($tokens[$opener]['line'] !== $tokens[$stackPtr]['line']) {
            $error = 'The opening brace of a trait import statement must be on the same line as the USE keyword';
            // Figure out if we can fix this error.
            $canFix = true;
            for ($i = $stackPtr + 1; $i < $opener; $i++) {
                if ($tokens[$i]['line'] !== $tokens[$i + 1]['line'] && $tokens[$i]['code'] !== T_WHITESPACE) {
                    $canFix = false;
                    break;
                }
            }
            if ($canFix === true) {
                $fix = $phpcsFile->addFixableError($error, $opener, 'OpenBraceNewLine');
                if ($fix === true) {
                    $phpcsFile->fixer
                        ->beginChangeset();
                    for ($i = $stackPtr + 1; $i < $opener; $i++) {
                        if ($tokens[$i]['line'] !== $tokens[$i + 1]['line']) {
                            // Everything should have a single space around it.
                            $phpcsFile->fixer
                                ->replaceToken($i, ' ');
                        }
                    }
                    $phpcsFile->fixer
                        ->endChangeset();
                }
            }
            else {
                $phpcsFile->addError($error, $opener, 'OpenBraceNewLine');
            }
        }
        
        //end if
        $error = 'Expected 1 space before opening brace in trait import statement; %s found';
        if ($tokens[$opener - 1]['code'] !== T_WHITESPACE) {
            $data = [
                '0',
            ];
            $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceBeforeOpeningBrace', $data);
            if ($fix === true) {
                $phpcsFile->fixer
                    ->addContentBefore($opener, ' ');
            }
        }
        else {
            if ($tokens[$opener - 1]['content'] !== ' ') {
                $prev = $phpcsFile->findPrevious(T_WHITESPACE, $opener - 1, null, true);
                if ($tokens[$prev]['line'] !== $tokens[$opener]['line']) {
                    $found = 'newline';
                }
                else {
                    $found = $tokens[$opener - 1]['length'];
                }
                $data = [
                    $found,
                ];
                $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceBeforeOpeningBrace', $data);
                if ($fix === true) {
                    if ($found === 'newline') {
                        $phpcsFile->fixer
                            ->beginChangeset();
                        for ($x = $opener - 1; $x > $prev; $x--) {
                            $phpcsFile->fixer
                                ->replaceToken($x, '');
                        }
                        $phpcsFile->fixer
                            ->addContentBefore($opener, ' ');
                        $phpcsFile->fixer
                            ->endChangeset();
                    }
                    else {
                        $phpcsFile->fixer
                            ->replaceToken($opener - 1, ' ');
                    }
                }
            }
        }
        
        //end if
        $next = $phpcsFile->findNext(Tokens::$emptyTokens, $opener + 1, $closer - 1, true);
        if ($next !== false && $tokens[$next]['line'] !== $tokens[$opener]['line'] + 1) {
            $error = 'First trait conflict resolution statement must be on the line after the opening brace';
            $nextNonWs = $phpcsFile->findNext(T_WHITESPACE, $opener + 1, $closer - 1, true);
            if ($nextNonWs !== $next) {
                $phpcsFile->addError($error, $opener, 'SpaceAfterOpeningBrace');
            }
            else {
                $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceAfterOpeningBrace');
                if ($fix === true) {
                    $phpcsFile->fixer
                        ->beginChangeset();
                    for ($x = $opener + 1; $x < $next; $x++) {
                        if ($tokens[$x]['line'] === $tokens[$next]['line']) {
                            // Preserve indent.
                            break;
                        }
                        $phpcsFile->fixer
                            ->replaceToken($x, '');
                    }
                    $phpcsFile->fixer
                        ->addNewline($opener);
                    $phpcsFile->fixer
                        ->endChangeset();
                }
            }
        }
        
        //end if
        for ($i = $stackPtr + 1; $i < $opener; $i++) {
            if ($tokens[$i]['code'] !== T_COMMA) {
                continue;
            }
            if ($tokens[$i - 1]['code'] === T_WHITESPACE) {
                $error = 'Expected no space before comma in trait import statement; %s found';
                $data = [
                    $tokens[$i - 1]['length'],
                ];
                $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeComma', $data);
                if ($fix === true) {
                    $phpcsFile->fixer
                        ->replaceToken($i - 1, '');
                }
            }
            $error = 'Expected 1 space after comma in trait import statement; %s found';
            if ($tokens[$i + 1]['code'] !== T_WHITESPACE) {
                $data = [
                    '0',
                ];
                $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterComma', $data);
                if ($fix === true) {
                    $phpcsFile->fixer
                        ->addContent($i, ' ');
                }
            }
            else {
                if ($tokens[$i + 1]['content'] !== ' ') {
                    $next = $phpcsFile->findNext(T_WHITESPACE, $i + 1, $opener, true);
                    if ($tokens[$next]['line'] !== $tokens[$i]['line']) {
                        $found = 'newline';
                    }
                    else {
                        $found = $tokens[$i + 1]['length'];
                    }
                    $data = [
                        $found,
                    ];
                    $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterComma', $data);
                    if ($fix === true) {
                        if ($found === 'newline') {
                            $phpcsFile->fixer
                                ->beginChangeset();
                            for ($x = $i + 1; $x < $next; $x++) {
                                $phpcsFile->fixer
                                    ->replaceToken($x, '');
                            }
                            $phpcsFile->fixer
                                ->addContent($i, ' ');
                            $phpcsFile->fixer
                                ->endChangeset();
                        }
                        else {
                            $phpcsFile->fixer
                                ->replaceToken($i + 1, ' ');
                        }
                    }
                }
            }
            
            //end if
        }
        
        //end for
        for ($i = $opener + 1; $i < $closer; $i++) {
            if ($tokens[$i]['code'] === T_INSTEADOF) {
                $error = 'Expected 1 space before INSTEADOF in trait import statement; %s found';
                if ($tokens[$i - 1]['code'] !== T_WHITESPACE) {
                    $data = [
                        '0',
                    ];
                    $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeInsteadof', $data);
                    if ($fix === true) {
                        $phpcsFile->fixer
                            ->addContentBefore($i, ' ');
                    }
                }
                else {
                    if ($tokens[$i - 1]['content'] !== ' ') {
                        $prev = $phpcsFile->findPrevious(T_WHITESPACE, $i - 1, $opener, true);
                        if ($tokens[$prev]['line'] !== $tokens[$i]['line']) {
                            $found = 'newline';
                        }
                        else {
                            $found = $tokens[$i - 1]['length'];
                        }
                        $data = [
                            $found,
                        ];
                        $prevNonWs = $phpcsFile->findPrevious(Tokens::$emptyTokens, $i - 1, $opener, true);
                        if ($prevNonWs !== $prev) {
                            $phpcsFile->addError($error, $i, 'SpaceBeforeInsteadof', $data);
                        }
                        else {
                            $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeInsteadof', $data);
                            if ($fix === true) {
                                if ($found === 'newline') {
                                    $phpcsFile->fixer
                                        ->beginChangeset();
                                    for ($x = $i - 1; $x > $prev; $x--) {
                                        $phpcsFile->fixer
                                            ->replaceToken($x, '');
                                    }
                                    $phpcsFile->fixer
                                        ->addContentBefore($i, ' ');
                                    $phpcsFile->fixer
                                        ->endChangeset();
                                }
                                else {
                                    $phpcsFile->fixer
                                        ->replaceToken($i - 1, ' ');
                                }
                            }
                        }
                    }
                }
                
                //end if
                $error = 'Expected 1 space after INSTEADOF in trait import statement; %s found';
                if ($tokens[$i + 1]['code'] !== T_WHITESPACE) {
                    $data = [
                        '0',
                    ];
                    $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterInsteadof', $data);
                    if ($fix === true) {
                        $phpcsFile->fixer
                            ->addContent($i, ' ');
                    }
                }
                else {
                    if ($tokens[$i + 1]['content'] !== ' ') {
                        $next = $phpcsFile->findNext(T_WHITESPACE, $i + 1, $closer, true);
                        if ($tokens[$next]['line'] !== $tokens[$i]['line']) {
                            $found = 'newline';
                        }
                        else {
                            $found = $tokens[$i + 1]['length'];
                        }
                        $data = [
                            $found,
                        ];
                        $nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, $i + 1, $closer, true);
                        if ($nextNonWs !== $next) {
                            $phpcsFile->addError($error, $i, 'SpaceAfterInsteadof', $data);
                        }
                        else {
                            $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterInsteadof', $data);
                            if ($fix === true) {
                                if ($found === 'newline') {
                                    $phpcsFile->fixer
                                        ->beginChangeset();
                                    for ($x = $i + 1; $x < $next; $x++) {
                                        $phpcsFile->fixer
                                            ->replaceToken($x, '');
                                    }
                                    $phpcsFile->fixer
                                        ->addContent($i, ' ');
                                    $phpcsFile->fixer
                                        ->endChangeset();
                                }
                                else {
                                    $phpcsFile->fixer
                                        ->replaceToken($i + 1, ' ');
                                }
                            }
                        }
                    }
                }
                
                //end if
            }
            
            //end if
            if ($tokens[$i]['code'] === T_AS) {
                $error = 'Expected 1 space before AS in trait import statement; %s found';
                if ($tokens[$i - 1]['code'] !== T_WHITESPACE) {
                    $data = [
                        '0',
                    ];
                    $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeAs', $data);
                    if ($fix === true) {
                        $phpcsFile->fixer
                            ->addContentBefore($i, ' ');
                    }
                }
                else {
                    if ($tokens[$i - 1]['content'] !== ' ') {
                        $prev = $phpcsFile->findPrevious(T_WHITESPACE, $i - 1, $opener, true);
                        if ($tokens[$prev]['line'] !== $tokens[$i]['line']) {
                            $found = 'newline';
                        }
                        else {
                            $found = $tokens[$i - 1]['length'];
                        }
                        $data = [
                            $found,
                        ];
                        $prevNonWs = $phpcsFile->findPrevious(Tokens::$emptyTokens, $i - 1, $opener, true);
                        if ($prevNonWs !== $prev) {
                            $phpcsFile->addError($error, $i, 'SpaceBeforeAs', $data);
                        }
                        else {
                            $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeAs', $data);
                            if ($fix === true) {
                                if ($found === 'newline') {
                                    $phpcsFile->fixer
                                        ->beginChangeset();
                                    for ($x = $i - 1; $x > $prev; $x--) {
                                        $phpcsFile->fixer
                                            ->replaceToken($x, '');
                                    }
                                    $phpcsFile->fixer
                                        ->addContentBefore($i, ' ');
                                    $phpcsFile->fixer
                                        ->endChangeset();
                                }
                                else {
                                    $phpcsFile->fixer
                                        ->replaceToken($i - 1, ' ');
                                }
                            }
                        }
                    }
                }
                
                //end if
                $error = 'Expected 1 space after AS in trait import statement; %s found';
                if ($tokens[$i + 1]['code'] !== T_WHITESPACE) {
                    $data = [
                        '0',
                    ];
                    $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterAs', $data);
                    if ($fix === true) {
                        $phpcsFile->fixer
                            ->addContent($i, ' ');
                    }
                }
                else {
                    if ($tokens[$i + 1]['content'] !== ' ') {
                        $next = $phpcsFile->findNext(T_WHITESPACE, $i + 1, $closer, true);
                        if ($tokens[$next]['line'] !== $tokens[$i]['line']) {
                            $found = 'newline';
                        }
                        else {
                            $found = $tokens[$i + 1]['length'];
                        }
                        $data = [
                            $found,
                        ];
                        $nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, $i + 1, $closer, true);
                        if ($nextNonWs !== $next) {
                            $phpcsFile->addError($error, $i, 'SpaceAfterAs', $data);
                        }
                        else {
                            $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterAs', $data);
                            if ($fix === true) {
                                if ($found === 'newline') {
                                    $phpcsFile->fixer
                                        ->beginChangeset();
                                    for ($x = $i + 1; $x < $next; $x++) {
                                        $phpcsFile->fixer
                                            ->replaceToken($x, '');
                                    }
                                    $phpcsFile->fixer
                                        ->addContent($i, ' ');
                                    $phpcsFile->fixer
                                        ->endChangeset();
                                }
                                else {
                                    $phpcsFile->fixer
                                        ->replaceToken($i + 1, ' ');
                                }
                            }
                        }
                    }
                }
                
                //end if
            }
            
            //end if
            if ($tokens[$i]['code'] === T_SEMICOLON) {
                if ($tokens[$i - 1]['code'] === T_WHITESPACE) {
                    $error = 'Expected no space before semicolon in trait import statement; %s found';
                    $data = [
                        $tokens[$i - 1]['length'],
                    ];
                    $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeSemicolon', $data);
                    if ($fix === true) {
                        $phpcsFile->fixer
                            ->replaceToken($i - 1, '');
                    }
                }
                $next = $phpcsFile->findNext(Tokens::$emptyTokens, $i + 1, $closer - 1, true);
                if ($next !== false && $tokens[$next]['line'] === $tokens[$i]['line']) {
                    $error = 'Each trait conflict resolution statement must be on a line by itself';
                    $nextNonWs = $phpcsFile->findNext(T_WHITESPACE, $i + 1, $closer - 1, true);
                    if ($nextNonWs !== $next) {
                        $phpcsFile->addError($error, $i, 'ConflictSameLine');
                    }
                    else {
                        $fix = $phpcsFile->addFixableError($error, $i, 'ConflictSameLine');
                        if ($fix === true) {
                            $phpcsFile->fixer
                                ->beginChangeset();
                            if ($tokens[$i + 1]['code'] === T_WHITESPACE) {
                                $phpcsFile->fixer
                                    ->replaceToken($i + 1, '');
                            }
                            $phpcsFile->fixer
                                ->addNewline($i);
                            $phpcsFile->fixer
                                ->endChangeset();
                        }
                    }
                }
            }
            
            //end if
        }
        
        //end for
        $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, $closer - 1, $opener + 1, true);
        if ($prev !== false && $tokens[$prev]['line'] !== $tokens[$closer]['line'] - 1) {
            $error = 'Closing brace must be on the line after the last trait conflict resolution statement';
            $prevNonWs = $phpcsFile->findPrevious(T_WHITESPACE, $closer - 1, $opener + 1, true);
            if ($prevNonWs !== $prev) {
                $phpcsFile->addError($error, $closer, 'SpaceBeforeClosingBrace');
            }
            else {
                $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeClosingBrace');
                if ($fix === true) {
                    $phpcsFile->fixer
                        ->beginChangeset();
                    for ($x = $closer - 1; $x > $prev; $x--) {
                        if ($tokens[$x]['line'] === $tokens[$closer]['line']) {
                            // Preserve indent.
                            continue;
                        }
                        $phpcsFile->fixer
                            ->replaceToken($x, '');
                    }
                    $phpcsFile->fixer
                        ->addNewline($prev);
                    $phpcsFile->fixer
                        ->endChangeset();
                }
            }
        }
        
        //end if
    }
    
    //end processUseGroup()
    
    /**
     * Processes a single use statement.
     *
     * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
     * @param int                         $stackPtr  The position of the current token in the
     *                                               stack passed in $tokens.
     *
     * @return void
     */
    protected function processUseStatement(File $phpcsFile, $stackPtr) {
        $tokens = $phpcsFile->getTokens();
        $next = $phpcsFile->findNext([
            T_COMMA,
            T_SEMICOLON,
        ], $stackPtr + 1);
        if ($next !== false && $tokens[$next]['code'] === T_COMMA) {
            $error = 'Each imported trait must have its own "use" import statement';
            $fix = $phpcsFile->addFixableError($error, $next, 'MultipleImport');
            if ($fix === true) {
                $padding = str_repeat(' ', $tokens[$stackPtr]['column'] - 1);
                $phpcsFile->fixer
                    ->replaceToken($next, ';' . $phpcsFile->eolChar . $padding . 'use ');
            }
        }
    }
    
    //end processUseStatement()

}

//end class

Classes

Title Deprecated Summary
UseDeclarationSniff

API Navigation

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