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

Breadcrumb

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

class DisallowVariableParsingSniff

Hierarchy

  • class \SlevomatCodingStandard\Sniffs\Strings\DisallowVariableParsingSniff implements \PHP_CodeSniffer\Sniffs\Sniff

Expanded class hierarchy of DisallowVariableParsingSniff

File

vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Strings/DisallowVariableParsingSniff.php, line 18

Namespace

SlevomatCodingStandard\Sniffs\Strings
View source
class DisallowVariableParsingSniff implements Sniff {
    public const CODE_DISALLOWED_DOLLAR_CURLY_SYNTAX = 'DisallowedDollarCurlySyntax';
    public const CODE_DISALLOWED_CURLY_DOLLAR_SYNTAX = 'DisallowedCurlyDollarSyntax';
    public const CODE_DISALLOWED_SIMPLE_SYNTAX = 'DisallowedSimpleSyntax';
    
    /** @var bool */
    public $disallowDollarCurlySyntax = true;
    
    /** @var bool */
    public $disallowCurlyDollarSyntax = false;
    
    /** @var bool */
    public $disallowSimpleSyntax = false;
    
    /**
     * @return array<int, (int|string)>
     */
    public function register() : array {
        return [
            T_DOUBLE_QUOTED_STRING,
            T_HEREDOC,
        ];
    }
    
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
     * @param int $stringPointer
     */
    public function process(File $phpcsFile, $stringPointer) : void {
        if (!$this->disallowDollarCurlySyntax && !$this->disallowCurlyDollarSyntax && !$this->disallowSimpleSyntax) {
            throw new UnexpectedValueException('No option is set.');
        }
        $tokens = $phpcsFile->getTokens();
        $tokenContent = $tokens[$stringPointer]['content'];
        if (strpos($tokenContent, '$') === false) {
            return;
        }
        $stringTokens = $tokens[$stringPointer]['code'] === T_HEREDOC ? token_get_all('<?php "' . $tokenContent . '"') : token_get_all('<?php ' . $tokenContent);
        for ($i = 0; $i < count($stringTokens); $i++) {
            $stringToken = $stringTokens[$i];
            if (!is_array($stringToken)) {
                continue;
            }
            if ($this->disallowDollarCurlySyntax && $this->getTokenContent($stringToken) === '${') {
                $usedVariable = $stringToken[1];
                for ($j = $i + 1; $j < count($stringTokens); $j++) {
                    $usedVariable .= $this->getTokenContent($stringTokens[$j]);
                    if ($this->getTokenContent($stringTokens[$j]) === '}') {
                        $phpcsFile->addError(sprintf('Using variable syntax "${...}" inside string is disallowed as syntax "${...}" is deprecated as of PHP 8.2, found "%s".', $usedVariable), $stringPointer, self::CODE_DISALLOWED_DOLLAR_CURLY_SYNTAX);
                        break;
                    }
                }
            }
            elseif ($stringToken[0] === T_VARIABLE) {
                if ($this->disallowCurlyDollarSyntax && $this->getTokenContent($stringTokens[$i - 1]) === '{') {
                    $usedVariable = $stringToken[1];
                    for ($j = $i + 1; $j < count($stringTokens); $j++) {
                        $stringTokenContent = $this->getTokenContent($stringTokens[$j]);
                        if ($stringTokenContent === '}') {
                            break;
                        }
                        $usedVariable .= $stringTokenContent;
                    }
                    $phpcsFile->addError(sprintf('Using variable syntax "{$...}" inside string is disallowed, found "{%s}".', $usedVariable), $stringPointer, self::CODE_DISALLOWED_CURLY_DOLLAR_SYNTAX);
                }
                elseif ($this->disallowSimpleSyntax) {
                    $error = true;
                    for ($j = $i - 1; $j >= 0; $j--) {
                        $stringTokenContent = $this->getTokenContent($stringTokens[$j]);
                        if (in_array($stringTokenContent, [
                            '{',
                            '${',
                        ], true)) {
                            $error = false;
                            break;
                        }
                        if ($stringTokenContent === '}') {
                            break;
                        }
                    }
                    if ($error) {
                        $phpcsFile->addError(sprintf('Using variable syntax "$..." inside string is disallowed, found "%s".', $this->getTokenContent($stringToken)), $stringPointer, self::CODE_DISALLOWED_SIMPLE_SYNTAX);
                    }
                }
            }
        }
    }
    
    /**
     * @param array{0: int, 1: string}|string $token
     */
    private function getTokenContent($token) : string {
        return is_array($token) ? $token[1] : $token;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
DisallowVariableParsingSniff::$disallowCurlyDollarSyntax public property @var bool
DisallowVariableParsingSniff::$disallowDollarCurlySyntax public property @var bool
DisallowVariableParsingSniff::$disallowSimpleSyntax public property @var bool
DisallowVariableParsingSniff::CODE_DISALLOWED_CURLY_DOLLAR_SYNTAX public constant
DisallowVariableParsingSniff::CODE_DISALLOWED_DOLLAR_CURLY_SYNTAX public constant
DisallowVariableParsingSniff::CODE_DISALLOWED_SIMPLE_SYNTAX public constant
DisallowVariableParsingSniff::getTokenContent private function *
DisallowVariableParsingSniff::process public function * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
*
Overrides Sniff::process
DisallowVariableParsingSniff::register public function * Overrides Sniff::register
RSS feed
Powered by Drupal