added an exception when a macro uses a reserved name
authorFabien Potencier <fabien.potencier@gmail.com>
Sat, 18 Dec 2010 12:15:24 +0000 (13:15 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Sat, 18 Dec 2010 12:15:34 +0000 (13:15 +0100)
CHANGELOG
lib/Twig/Parser.php
test/Twig/Tests/ParserTest.php [new file with mode: 0644]

index f00961f..fd6450f 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,6 +6,7 @@ Backward incompatibilities:
 
 Changes:
 
+ * added an exception when a macro uses a reserved name
  * the "default" filter now uses the "empty" test instead of just checking for null
  * added the "empty" test
 
index 31f0e81..a0ba8d5 100644 (file)
@@ -20,6 +20,7 @@ class Twig_Parser implements Twig_ParserInterface
     protected $blockStack;
     protected $macros;
     protected $env;
+    protected $reservedMacroNames;
 
     public function __construct(Twig_Environment $env)
     {
@@ -173,9 +174,21 @@ class Twig_Parser implements Twig_ParserInterface
         return isset($this->macros[$name]);
     }
 
-    public function setMacro($name, $value)
+    public function setMacro($name, Twig_Node_Macro $node)
     {
-        $this->macros[$name] = $value;
+        if (null === $this->reservedMacroNames) {
+            $this->reservedMacroNames = array();
+            $r = new ReflectionClass($this->env->getBaseTemplateClass());
+            foreach ($r->getMethods() as $method) {
+                $this->reservedMacroNames[] = $method->getName();
+            }
+        }
+
+        if (in_array($name, $this->reservedMacroNames)) {
+            throw new Twig_Error_Syntax(sprintf('"%s" cannot be used as a macro name as it is a reserved keyword', $name), $node->getLine());
+        }
+
+        $this->macros[$name] = $node;
     }
 
     public function getExpressionParser()
diff --git a/test/Twig/Tests/ParserTest.php b/test/Twig/Tests/ParserTest.php
new file mode 100644 (file)
index 0000000..2159a5c
--- /dev/null
@@ -0,0 +1,21 @@
+<?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.
+ */
+class Twig_Tests_ParserTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @expectedException Twig_Error_Syntax
+     */
+    public function testSetMacroThrowsExceptionOnReservedMethods()
+    {
+        $parser = new Twig_Parser(new Twig_Environment());
+        $parser->setMacro('display', $this->getMock('Twig_Node_Macro', null, array(), '', null));
+    }
+}