fixed wrong template location in error messages (closes #803)
authorFabien Potencier <fabien.potencier@gmail.com>
Wed, 17 Oct 2012 17:24:30 +0000 (19:24 +0200)
committerFabien Potencier <fabien.potencier@gmail.com>
Thu, 18 Oct 2012 06:21:41 +0000 (08:21 +0200)
lib/Twig/Error.php
lib/Twig/Template.php
test/Twig/Tests/ErrorTest.php

index b5ac00e..977b7eb 100644 (file)
@@ -155,7 +155,9 @@ class Twig_Error extends Exception
         $template = null;
         foreach (debug_backtrace() as $trace) {
             if (isset($trace['object']) && $trace['object'] instanceof Twig_Template && 'Twig_Template' !== get_class($trace['object'])) {
-                $template = $trace['object'];
+                if (null === $this->filename || $this->filename == $trace['object']->getTemplateName()) {
+                    $template = $trace['object'];
+                }
             }
         }
 
index 64a08f6..5a9d53c 100644 (file)
@@ -304,7 +304,7 @@ abstract class Twig_Template implements Twig_TemplateInterface
                 return null;
             }
 
-            throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist', $item));
+            throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist', $item), -1, $this->getTemplateName());
         }
 
         return $context[$item];
index 9d20c4d..9b28697 100644 (file)
@@ -99,6 +99,29 @@ class Twig_Tests_ErrorTest extends PHPUnit_Framework_TestCase
         }
     }
 
+    public function testTwigExceptionAddsFileAndLineWhenMissingWithInheritanceAgain()
+    {
+        $loader = new Twig_Loader_Array(array(
+            'index' => "{% extends 'base' %}
+            {% block content %}
+                {{ parent() }}
+            {% endblock %}",
+            'base' => '{% block content %}{{ foo }}{% endblock %}'
+        ));
+        $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
+
+        $template = $twig->loadTemplate('index');
+        try {
+            $template->render(array());
+
+            $this->fail();
+        } catch (Twig_Error_Runtime $e) {
+            $this->assertEquals('Variable "foo" does not exist in "base" at line 1', $e->getMessage());
+            $this->assertEquals(1, $e->getTemplateLine());
+            $this->assertEquals('base', $e->getTemplateFile());
+        }
+    }
+
     public function testTwigExceptionAddsFileAndLineWhenMissingWithInheritanceOnDisk()
     {
         $loader = new Twig_Loader_Filesystem(dirname(__FILE__).'/Fixtures/errors');