getLine(); if (!$expr instanceof ContextVariable) { throw new SyntaxError('Function name must be an identifier.', $line, $parser->getStream()->getSourceContext()); } $name = $expr->getAttribute('name'); if (null !== $alias = $parser->getImportedSymbol('function', $name)) { /** @var TemplateVariable $var */ $var = $alias['node']->getNode('var'); return new MacroReferenceExpression($var, $alias['name'], $this->parseCallableArguments($parser, $line, false), $line); } $args = $this->parseNamedArguments($parser, false); $function = $parser->getFunction($name, $line); if ($function->getParserCallable()) { $fakeNode = new EmptyNode($line); $fakeNode->setSourceContext($parser->getStream()->getSourceContext()); return ($function->getParserCallable())($parser, $fakeNode, $args, $line); } return new ($function->getNodeClass())($function, $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; } }