Skip to content

Commit

Permalink
Do not use Node_Expression_Name for function names, just use strings …
Browse files Browse the repository at this point in the history
…for those
  • Loading branch information
nikic committed Aug 6, 2011
1 parent 652ac77 commit da4d964
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 25 deletions.
31 changes: 15 additions & 16 deletions lib/Twig/ExpressionParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,11 @@ public function parsePrimaryExpression()
break;

default:
$node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine());
if ('(' === $this->parser->getCurrentToken()->getValue()) {
$node = $this->getFunctionNode($token->getValue(), $token->getLine());
} else {
$node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine());
}
}
break;

Expand Down Expand Up @@ -210,54 +214,49 @@ public function parseHashExpression()

public function parsePostfixExpression($node)
{
$firstPass = true;
while (true) {
$token = $this->parser->getCurrentToken();
if ($token->getType() == Twig_Token::PUNCTUATION_TYPE) {
if ('.' == $token->getValue() || '[' == $token->getValue()) {
$node = $this->parseSubscriptExpression($node);
} elseif ('|' == $token->getValue()) {
$node = $this->parseFilterExpression($node);
} elseif ($firstPass && $node instanceof Twig_Node_Expression_Name && '(' == $token->getValue()) {
$node = $this->getFunctionNode($node);
} else {
break;
}
} else {
break;
}

$firstPass = false;
}

return $node;
}

public function getFunctionNode(Twig_Node_Expression_Name $node)
public function getFunctionNode($name, $line)
{
$args = $this->parseArguments();

if ('parent' === $node->getAttribute('name')) {
if ('parent' === $name) {
if (!count($this->parser->getBlockStack())) {
throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden', $node->getLine());
throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden', $line);
}

if (!$this->parser->getParent()) {
throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend another one is forbidden', $node->getLine());
throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend another one is forbidden', $line);
}

return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $node->getLine());
return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $line);
}

if ('block' === $node->getAttribute('name')) {
return new Twig_Node_Expression_BlockReference($args->getNode(0), false, $node->getLine());
if ('block' === $name) {
return new Twig_Node_Expression_BlockReference($args->getNode(0), false, $line);
}

if (null !== $alias = $this->parser->getImportedFunction($node->getAttribute('name'))) {
return new Twig_Node_Expression_GetAttr($alias['node'], new Twig_Node_Expression_Constant($alias['name'], $node->getLine()), $args, Twig_TemplateInterface::METHOD_CALL, $node->getLine());
if (null !== $alias = $this->parser->getImportedFunction($name)) {
return new Twig_Node_Expression_GetAttr($alias['node'], new Twig_Node_Expression_Constant($alias['name'], $line), $args, Twig_TemplateInterface::METHOD_CALL, $line);
}

return new Twig_Node_Expression_Function($node, $args, $node->getLine());
return new Twig_Node_Expression_Function($name, $args, $line);
}

public function parseSubscriptExpression($node)
Expand Down
8 changes: 4 additions & 4 deletions lib/Twig/Node/Expression/Function.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@
*/
class Twig_Node_Expression_Function extends Twig_Node_Expression
{
public function __construct(Twig_Node_Expression_Name $name, Twig_NodeInterface $arguments, $lineno)
public function __construct($name, Twig_NodeInterface $arguments, $lineno)
{
parent::__construct(array('name' => $name, 'arguments' => $arguments), array(), $lineno);
parent::__construct(array('arguments' => $arguments), array('name' => $name), $lineno);
}

public function compile(Twig_Compiler $compiler)
{
$function = $compiler->getEnvironment()->getFunction($this->getNode('name')->getAttribute('name'));
$function = $compiler->getEnvironment()->getFunction($this->getAttribute('name'));
if (false === $function) {
throw new Twig_Error_Syntax(sprintf('The function "%s" does not exist', $this->getNode('name')->getAttribute('name')), $this->getLine());
throw new Twig_Error_Syntax(sprintf('The function "%s" does not exist', $this->getAttribute('name')), $this->getLine());
}

$compiler
Expand Down
2 changes: 1 addition & 1 deletion lib/Twig/NodeVisitor/SafeAnalysis.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
}
} elseif ($node instanceof Twig_Node_Expression_Function) {
// function expression is safe when the function is safe
$name = $node->getNode('name')->getAttribute('name');
$name = $node->getAttribute('name');
$args = $node->getNode('arguments');
$function = $env->getFunction($name);
if (false !== $function) {
Expand Down
2 changes: 1 addition & 1 deletion lib/Twig/NodeVisitor/Sandbox.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)

// look for functions
if ($node instanceof Twig_Node_Expression_Function) {
$this->functions[] = $node->getNode('name')->getAttribute('name');
$this->functions[] = $node->getAttribute('name');
}

// wrap print to check __toString() calls
Expand Down
5 changes: 2 additions & 3 deletions test/Twig/Tests/Node/Expression/FunctionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ class Twig_Tests_Node_Expression_FunctionTest extends Twig_Tests_Node_TestCase
*/
public function testConstructor()
{
$name = new Twig_Node_Expression_Name('function', 0);
$name = 'function';
$args = new Twig_Node();
$node = new Twig_Node_Expression_Function($name, $args, 0);

$this->assertEquals($name, $node->getNode('name'));
$this->assertEquals($name, $node->getAttribute('name'));
$this->assertEquals($args, $node->getNode('arguments'));
}

Expand Down Expand Up @@ -85,7 +85,6 @@ public function getTests()

protected function createFunction($name, array $arguments = array())
{
$name = new Twig_Node_Expression_Name($name, 0);
$arguments = new Twig_Node($arguments);
return new Twig_Node_Expression_Function($name, $arguments, 0);
}
Expand Down

0 comments on commit da4d964

Please sign in to comment.