made error message for strict variables more useful
authorFabien Potencier <fabien.potencier@gmail.com>
Sat, 27 Nov 2010 10:15:27 +0000 (11:15 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Sat, 27 Nov 2010 10:15:27 +0000 (11:15 +0100)
CHANGELOG
lib/Twig/Node/Expression/Name.php
lib/Twig/Node/Module.php
lib/Twig/Template.php
test/Twig/Tests/Node/Expression/NameTest.php
test/Twig/Tests/Node/ModuleTest.php
test/Twig/Tests/Node/SandboxedModuleTest.php

index 771243a..4ca63c0 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -15,6 +15,7 @@ Backward incompatibilities:
  * removed support for {{ 1 < i < 3 }} (use {{ i > 1 and i < 3 }} instead)
 
 Changes:
+ * made error message for strict variables more useful
  * changed trans tag to accept any variable for the plural count
  * fixed sandbox mode (__toString() method check was not enforced if called implicitly from complex statements)
  * added the ** (power) operator
index 37cd727..ed3fe60 100644 (file)
@@ -25,7 +25,7 @@ class Twig_Node_Expression_Name extends Twig_Node_Expression
         } elseif ('_charset' === $this->getAttribute('name')) {
             $compiler->raw('$this->getEnvironment()->getCharset()');
         } elseif ($compiler->getEnvironment()->isStrictVariables()) {
-            $compiler->raw(sprintf('$this->getContext($context, \'%s\')', $this->getAttribute('name'), $this->getAttribute('name')));
+            $compiler->raw(sprintf('$this->getContext($context, \'%s\', \'%s\')', $this->getAttribute('name'), $this->lineno));
         } else {
             $compiler->raw(sprintf('(isset($context[\'%s\']) ? $context[\'%s\'] : null)', $this->getAttribute('name'), $this->getAttribute('name')));
         }
index 8fcc2f2..aef28fb 100644 (file)
@@ -53,6 +53,8 @@ class Twig_Node_Module extends Twig_Node
 
         $this->compileMacros($compiler);
 
+        $this->compileGetTemplateName($compiler);
+
         $this->compileClassFooter($compiler);
     }
 
@@ -185,4 +187,17 @@ class Twig_Node_Module extends Twig_Node
     {
         $compiler->subcompile($this->getNode('macros'));
     }
+
+    protected function compileGetTemplateName($compiler)
+    {
+        $compiler
+            ->write("public function getTemplateName()\n", "{\n")
+            ->indent()
+            ->write('return ')
+            ->repr($this->getAttribute('filename'))
+            ->raw(";\n")
+            ->outdent()
+            ->write("}\n")
+        ;
+    }
 }
index 3fad2f8..c761685 100644 (file)
@@ -22,6 +22,11 @@ abstract class Twig_Template implements Twig_TemplateInterface
         $this->blocks = array();
     }
 
+    public function getTemplateName()
+    {
+        return 'n/a';
+    }
+
     public function getEnvironment()
     {
         return $this->env;
@@ -87,10 +92,10 @@ abstract class Twig_Template implements Twig_TemplateInterface
         return ob_get_clean();
     }
 
-    protected function getContext($context, $item)
+    protected function getContext($context, $item, $line = -1)
     {
         if (!array_key_exists($item, $context)) {
-            throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist.', $item));
+            throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist in "%s" at line %s.', $item, $this->getTemplateName(), $line));
         }
 
         return $context[$item];
index 3d8e03a..70b6654 100644 (file)
@@ -41,7 +41,7 @@ class Twig_Tests_Node_Expression_NameTest extends Twig_Tests_Node_TestCase
         $env = new Twig_Environment(null, array('strict_variables' => true));
 
         return array(
-            array($node, '$this->getContext($context, \'foo\')', $env),
+            array($node, '$this->getContext($context, \'foo\', \'0\')', $env),
             array($node, '(isset($context[\'foo\']) ? $context[\'foo\'] : null)'),
             array($self, '$this'),
             array($context, '$context'),
index 9c2bd88..edf9d2c 100644 (file)
@@ -72,6 +72,10 @@ class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
         echo "foo";
     }
 
+    public function getTemplateName()
+    {
+        return "foo.twig";
+    }
 }
 EOF
         , $twig);
@@ -105,6 +109,10 @@ class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
         \$this->getParent(\$context)->display(\$context, array_merge(\$this->blocks, \$blocks));
     }
 
+    public function getTemplateName()
+    {
+        return "foo.twig";
+    }
 }
 EOF
         , $twig);
@@ -143,6 +151,10 @@ class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
         \$this->getParent(\$context)->display(\$context, array_merge(\$this->blocks, \$blocks));
     }
 
+    public function getTemplateName()
+    {
+        return "foo.twig";
+    }
 }
 EOF
         , $twig);
index 91e54ae..b8a8196 100644 (file)
@@ -78,6 +78,10 @@ class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
         );
     }
 
+    public function getTemplateName()
+    {
+        return "foo.twig";
+    }
 }
 EOF
         , $twig);
@@ -122,6 +126,10 @@ class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
         \$this->parent->checkSecurity();
     }
 
+    public function getTemplateName()
+    {
+        return "foo.twig";
+    }
 }
 EOF
         , $twig);