2024-06-20 14:10:42 +00:00
< ? php
/*
* This file is part of Twig .
*
* ( c ) Fabien Potencier
* ( c ) Armin Ronacher
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Twig\Node\Expression ;
use Twig\Compiler ;
use Twig\Node\Node ;
/**
* Represents a block call node .
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
class BlockReferenceExpression extends AbstractExpression
{
2025-01-13 09:56:01 +00:00
/**
* @ param AbstractExpression $name
*/
public function __construct ( Node $name , ? Node $template , int $lineno )
2024-06-20 14:10:42 +00:00
{
2025-01-13 09:56:01 +00:00
if ( ! $name instanceof AbstractExpression ) {
trigger_deprecation ( 'twig/twig' , '3.15' , 'Not passing a "%s" instance to the "node" argument of "%s" is deprecated ("%s" given).' , AbstractExpression :: class , static :: class , \get_class ( $name ));
}
2024-06-20 14:10:42 +00:00
$nodes = [ 'name' => $name ];
if ( null !== $template ) {
$nodes [ 'template' ] = $template ;
}
2025-01-13 09:56:01 +00:00
parent :: __construct ( $nodes , [ 'is_defined_test' => false , 'output' => false ], $lineno );
2024-06-20 14:10:42 +00:00
}
public function compile ( Compiler $compiler ) : void
{
if ( $this -> getAttribute ( 'is_defined_test' )) {
$this -> compileTemplateCall ( $compiler , 'hasBlock' );
} else {
if ( $this -> getAttribute ( 'output' )) {
$compiler -> addDebugInfo ( $this );
$compiler -> write ( 'yield from ' );
$this
-> compileTemplateCall ( $compiler , 'yieldBlock' )
-> raw ( " ; \n " );
} else {
$this -> compileTemplateCall ( $compiler , 'renderBlock' );
}
}
}
private function compileTemplateCall ( Compiler $compiler , string $method ) : Compiler
{
if ( ! $this -> hasNode ( 'template' )) {
$compiler -> write ( '$this' );
} else {
$compiler
-> write ( '$this->loadTemplate(' )
-> subcompile ( $this -> getNode ( 'template' ))
-> raw ( ', ' )
-> repr ( $this -> getTemplateName ())
-> raw ( ', ' )
-> repr ( $this -> getTemplateLine ())
-> raw ( ')' )
;
}
2024-09-05 17:51:48 +00:00
$compiler -> raw ( \sprintf ( '->unwrap()->%s' , $method ));
2024-06-20 14:10:42 +00:00
return $this -> compileBlockArguments ( $compiler );
}
private function compileBlockArguments ( Compiler $compiler ) : Compiler
{
$compiler
-> raw ( '(' )
-> subcompile ( $this -> getNode ( 'name' ))
-> raw ( ', $context' );
if ( ! $this -> hasNode ( 'template' )) {
$compiler -> raw ( ', $blocks' );
}
return $compiler -> raw ( ')' );
}
}