1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 * (c) Armin Ronacher
8 *
9 * For the full copyright and license information, please view the LICENSE
10 * file that was distributed with this source code.
11 */
12
13namespace Twig\Node\Expression;
14
15use Twig\Compiler;
16
17class NameExpression extends AbstractExpression
18{
19    private $specialVars = [
20        '_self' => '$this->getTemplateName()',
21        '_context' => '$context',
22        '_charset' => '$this->env->getCharset()',
23    ];
24
25    public function __construct(string $name, int $lineno)
26    {
27        parent::__construct([], ['name' => $name, 'is_defined_test' => false, 'ignore_strict_check' => false, 'always_defined' => false], $lineno);
28    }
29
30    public function compile(Compiler $compiler)
31    {
32        $name = $this->getAttribute('name');
33
34        $compiler->addDebugInfo($this);
35
36        if ($this->getAttribute('is_defined_test')) {
37            if ($this->isSpecial()) {
38                $compiler->repr(true);
39            } elseif (\PHP_VERSION_ID >= 70400) {
40                $compiler
41                    ->raw('array_key_exists(')
42                    ->string($name)
43                    ->raw(', $context)')
44                ;
45            } else {
46                $compiler
47                    ->raw('(isset($context[')
48                    ->string($name)
49                    ->raw(']) || array_key_exists(')
50                    ->string($name)
51                    ->raw(', $context))')
52                ;
53            }
54        } elseif ($this->isSpecial()) {
55            $compiler->raw($this->specialVars[$name]);
56        } elseif ($this->getAttribute('always_defined')) {
57            $compiler
58                ->raw('$context[')
59                ->string($name)
60                ->raw(']')
61            ;
62        } else {
63            if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) {
64                $compiler
65                    ->raw('($context[')
66                    ->string($name)
67                    ->raw('] ?? null)')
68                ;
69            } else {
70                $compiler
71                    ->raw('(isset($context[')
72                    ->string($name)
73                    ->raw(']) || array_key_exists(')
74                    ->string($name)
75                    ->raw(', $context) ? $context[')
76                    ->string($name)
77                    ->raw('] : (function () { throw new RuntimeError(\'Variable ')
78                    ->string($name)
79                    ->raw(' does not exist.\', ')
80                    ->repr($this->lineno)
81                    ->raw(', $this->source); })()')
82                    ->raw(')')
83                ;
84            }
85        }
86    }
87
88    public function isSpecial()
89    {
90        return isset($this->specialVars[$this->getAttribute('name')]);
91    }
92
93    public function isSimple()
94    {
95        return !$this->isSpecial() && !$this->getAttribute('is_defined_test');
96    }
97}
98
99class_alias('Twig\Node\Expression\NameExpression', 'Twig_Node_Expression_Name');
100