if (!
$this->parser->
getParent() && !
$this->parser->
hasTraits()) { throw new SyntaxError('Calling "parent" on a template that does not extend nor "use" another template is forbidden.',
$line,
$this->parser->
getStream()->
getSourceContext());
} return new ParentExpression($this->parser->
peekBlockStack(),
$line);
case 'block':
$args =
$this->
parseArguments();
if (\
count($args) < 1
) { throw new SyntaxError('The "block" function takes one argument (the block name).',
$line,
$this->parser->
getStream()->
getSourceContext());
} return new BlockReferenceExpression($args->
getNode(0
), \
count($args) > 1 ?
$args->
getNode(1
) : null,
$line);
case 'attribute':
$args =
$this->
parseArguments();
if (\
count($args) < 2
) { throw new SyntaxError('The "attribute" function takes at least two arguments (the variable and the attributes).',
$line,
$this->parser->
getStream()->
getSourceContext());
} return new GetAttrExpression($args->
getNode(0
),
$args->
getNode(1
), \
count($args) > 2 ?
$args->
getNode(2
) : null, Template::ANY_CALL,
$line);
default:
if (null !==
$alias =
$this->parser->
getImportedSymbol('function',
$name)) { $arguments =
new ArrayExpression([],
$line);
foreach ($this->
parseArguments() as $n) {