Вход Регистрация
Файл: upload/core/vendor/twig/twig/src/ExpressionParser/Infix/FunctionExpressionParser.php
Строк: 146
<?php

/*
 * This file is part of Twig.
 *
 * (c) Fabien Potencier
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace TwigExpressionParserInfix;

use 
TwigAttributeFirstClassTwigCallableReady;
use 
TwigErrorSyntaxError;
use 
TwigExpressionParserAbstractExpressionParser;
use 
TwigExpressionParserExpressionParserDescriptionInterface;
use 
TwigExpressionParserInfixAssociativity;
use 
TwigExpressionParserInfixExpressionParserInterface;
use 
TwigNodeEmptyNode;
use 
TwigNodeExpressionAbstractExpression;
use 
TwigNodeExpressionMacroReferenceExpression;
use 
TwigNodeExpressionNameExpression;
use 
TwigParser;
use 
TwigToken;

/**
 * @internal
 */
final class FunctionExpressionParser extends AbstractExpressionParser implements InfixExpressionParserInterfaceExpressionParserDescriptionInterface
{
    use 
ArgumentsTrait;

    private 
$readyNodes = [];

    public function 
parse(Parser $parserAbstractExpression $exprToken $token): AbstractExpression
    
{
        
$line $token->getLine();
        if (!
$expr instanceof NameExpression) {
            throw new 
SyntaxError('Function name must be an identifier.'$line$parser->getStream()->getSourceContext());
        }

        
$name $expr->getAttribute('name');

        if (
null !== $alias $parser->getImportedSymbol('function'$name)) {
            return new 
MacroReferenceExpression($alias['node']->getNode('var'), $alias['name'], $this->parseCallableArguments($parser$linefalse), $line);
        }

        
$args $this->parseNamedArguments($parserfalse);

        
$function $parser->getFunction($name$line);

        if (
$function->getParserCallable()) {
            
$fakeNode = new EmptyNode($line);
            
$fakeNode->setSourceContext($parser->getStream()->getSourceContext());

            return (
$function->getParserCallable())($parser$fakeNode$args$line);
        }

        if (!isset(
$this->readyNodes[$class $function->getNodeClass()])) {
            
$this->readyNodes[$class] = (bool) (new ReflectionClass($class))->getConstructor()->getAttributes(FirstClassTwigCallableReady::class);
        }

        if (!
$ready $this->readyNodes[$class]) {
            
trigger_deprecation('twig/twig''3.12''Twig node "%s" is not marked as ready for passing a "TwigFunction" in the constructor instead of its name; please update your code and then add #[FirstClassTwigCallableReady] attribute to the constructor.'$class);
        }

        return new 
$class($ready $function $function->getName(), $args$line);
    }

    public function 
getName(): string
    
{
        return 
'(';
    }

    public function 
getDescription(): string
    
{
        return 
'Twig function call';
    }

    public function 
getPrecedence(): int
    
{
        return 
512;
    }

    public function 
getAssociativity(): InfixAssociativity
    
{
        return 
InfixAssociativity::Left;
    }
}
Онлайн: 1
Реклама