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

Breadcrumb

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

function GetAttrExpression::compile

Overrides Node::compile

File

vendor/twig/twig/src/Node/Expression/GetAttrExpression.php, line 39

Class

GetAttrExpression

Namespace

Twig\Node\Expression

Code

public function compile(Compiler $compiler) : void {
    $env = $compiler->getEnvironment();
    $arrayAccessSandbox = false;
    // optimize array calls
    if ($this->getAttribute('optimizable') && (!$env->isStrictVariables() || $this->getAttribute('ignore_strict_check')) && !$this->getAttribute('is_defined_test') && Template::ARRAY_CALL === $this->getAttribute('type')) {
        $var = '$' . $compiler->getVarName();
        $compiler->raw('((' . $var . ' = ')
            ->subcompile($this->getNode('node'))
            ->raw(') && is_array(')
            ->raw($var);
        if (!$env->hasExtension(SandboxExtension::class)) {
            $compiler->raw(') || ')
                ->raw($var)
                ->raw(' instanceof ArrayAccess ? (')
                ->raw($var)
                ->raw('[')
                ->subcompile($this->getNode('attribute'))
                ->raw('] ?? null) : null)');
            return;
        }
        $arrayAccessSandbox = true;
        $compiler->raw(') || ')
            ->raw($var)
            ->raw(' instanceof ArrayAccess && in_array(')
            ->raw($var . '::class')
            ->raw(', CoreExtension::ARRAY_LIKE_CLASSES, true) ? (')
            ->raw($var)
            ->raw('[')
            ->subcompile($this->getNode('attribute'))
            ->raw('] ?? null) : ');
    }
    $compiler->raw('CoreExtension::getAttribute($this->env, $this->source, ');
    if ($this->getAttribute('ignore_strict_check')) {
        $this->getNode('node')
            ->setAttribute('ignore_strict_check', true);
    }
    $compiler->subcompile($this->getNode('node'))
        ->raw(', ')
        ->subcompile($this->getNode('attribute'));
    if ($this->hasNode('arguments')) {
        $compiler->raw(', ')
            ->subcompile($this->getNode('arguments'));
    }
    else {
        $compiler->raw(', []');
    }
    $compiler->raw(', ')
        ->repr($this->getAttribute('type'))
        ->raw(', ')
        ->repr($this->getAttribute('is_defined_test'))
        ->raw(', ')
        ->repr($this->getAttribute('ignore_strict_check'))
        ->raw(', ')
        ->repr($env->hasExtension(SandboxExtension::class))
        ->raw(', ')
        ->repr($this->getNode('node')
        ->getTemplateLine())
        ->raw(')');
    if ($arrayAccessSandbox) {
        $compiler->raw(')');
    }
}
RSS feed
Powered by Drupal