14f6358fdae1f5a6d59f9192c7789d78f69e53e8
[yaffs-website] / vendor / twig / twig / lib / Twig / Node / Expression / NullCoalesce.php
1 <?php
2
3 /*
4  * This file is part of Twig.
5  *
6  * (c) Fabien Potencier
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11 class Twig_Node_Expression_NullCoalesce extends Twig_Node_Expression_Conditional
12 {
13     public function __construct(Twig_NodeInterface $left, Twig_NodeInterface $right, $lineno)
14     {
15         $test = new Twig_Node_Expression_Binary_And(
16             new Twig_Node_Expression_Test_Defined(clone $left, 'defined', new Twig_Node(), $left->getTemplateLine()),
17             new Twig_Node_Expression_Unary_Not(new Twig_Node_Expression_Test_Null($left, 'null', new Twig_Node(), $left->getTemplateLine()), $left->getTemplateLine()),
18             $left->getTemplateLine()
19         );
20
21         parent::__construct($test, $left, $right, $lineno);
22     }
23
24     public function compile(Twig_Compiler $compiler)
25     {
26         /*
27          * This optimizes only one case. PHP 7 also supports more complex expressions
28          * that can return null. So, for instance, if log is defined, log("foo") ?? "..." works,
29          * but log($a["foo"]) ?? "..." does not if $a["foo"] is not defined. More advanced
30          * cases might be implemented as an optimizer node visitor, but has not been done
31          * as benefits are probably not worth the added complexity.
32          */
33         if (PHP_VERSION_ID >= 70000 && $this->getNode('expr2') instanceof Twig_Node_Expression_Name) {
34             $this->getNode('expr2')->setAttribute('always_defined', true);
35             $compiler
36                 ->raw('((')
37                 ->subcompile($this->getNode('expr2'))
38                 ->raw(') ?? (')
39                 ->subcompile($this->getNode('expr3'))
40                 ->raw('))')
41             ;
42         } else {
43             parent::compile($compiler);
44         }
45     }
46 }