public function getFunctionNode($name, $line) {
switch ($name) {
case 'parent':
$args = $this
->parseArguments();
if (!count($this->parser
->getBlockStack())) {
throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden', $line, $this->parser
->getFilename());
}
if (!$this->parser
->getParent() && !$this->parser
->hasTraits()) {
throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend nor "use" another template is forbidden', $line, $this->parser
->getFilename());
}
return new Twig_Node_Expression_Parent($this->parser
->peekBlockStack(), $line);
case 'block':
return new Twig_Node_Expression_BlockReference($this
->parseArguments()
->getNode(0), false, $line);
case 'attribute':
$args = $this
->parseArguments();
if (count($args) < 2) {
throw new Twig_Error_Syntax('The "attribute" function takes at least two arguments (the variable and the attributes)', $line, $this->parser
->getFilename());
}
return new Twig_Node_Expression_GetAttr($args
->getNode(0), $args
->getNode(1), count($args) > 2 ? $args
->getNode(2) : new Twig_Node_Expression_Array(array(), $line), Twig_TemplateInterface::ANY_CALL, $line);
default:
if (null !== ($alias = $this->parser
->getImportedSymbol('function', $name))) {
$arguments = new Twig_Node_Expression_Array(array(), $line);
foreach ($this
->parseArguments() as $n) {
$arguments
->addElement($n);
}
$node = new Twig_Node_Expression_MethodCall($alias['node'], $alias['name'], $arguments, $line);
$node
->setAttribute('safe', true);
return $node;
}
$args = $this
->parseArguments(true);
$class = $this
->getFunctionNodeClass($name, $line);
return new $class($name, $args, $line);
}
}