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

Breadcrumb

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

function PHP::parsePhpAttribute

PHP 8 attributes parser for PHP < 8 Handles single-line and multiline attributes.

Parameters

array $tokens The original array of tokens (as returned by token_get_all).:

int $stackPtr The current position in token array.:

Return value

array|null The array of parsed attribute tokens

1 call to PHP::parsePhpAttribute()
PHP::tokenize in vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php
Creates an array of tokens when given some PHP code.

File

vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php, line 3911

Class

PHP

Namespace

PHP_CodeSniffer\Tokenizers

Code

private function parsePhpAttribute(array &$tokens, $stackPtr) {
    $token = $tokens[$stackPtr];
    $commentBody = substr($token[1], 2);
    $subTokens = @token_get_all('<?php ' . $commentBody);
    foreach ($subTokens as $i => $subToken) {
        if (is_array($subToken) === true && $subToken[0] === T_COMMENT && strpos($subToken[1], '#[') === 0) {
            $reparsed = $this->parsePhpAttribute($subTokens, $i);
            if ($reparsed !== null) {
                array_splice($subTokens, $i, 1, $reparsed);
            }
            else {
                $subToken[0] = T_ATTRIBUTE;
            }
        }
    }
    array_splice($subTokens, 0, 1, [
        [
            T_ATTRIBUTE,
            '#[',
        ],
    ]);
    // Go looking for the close bracket.
    $bracketCloser = $this->findCloser($subTokens, 1, '[', ']');
    if (PHP_VERSION_ID < 80000 && $bracketCloser === null) {
        foreach (array_slice($tokens, $stackPtr + 1) as $token) {
            if (is_array($token) === true) {
                $commentBody .= $token[1];
            }
            else {
                $commentBody .= $token;
            }
        }
        $subTokens = @token_get_all('<?php ' . $commentBody);
        array_splice($subTokens, 0, 1, [
            [
                T_ATTRIBUTE,
                '#[',
            ],
        ]);
        $bracketCloser = $this->findCloser($subTokens, 1, '[', ']');
        if ($bracketCloser !== null) {
            array_splice($tokens, $stackPtr + 1, count($tokens), array_slice($subTokens, $bracketCloser + 1));
            $subTokens = array_slice($subTokens, 0, $bracketCloser + 1);
        }
    }
    if ($bracketCloser === null) {
        return null;
    }
    return $subTokens;
}
RSS feed
Powered by Drupal