diff --git a/src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php b/src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php index 513352e374aa..173d79dd41d6 100644 --- a/src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php +++ b/src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php @@ -150,15 +150,19 @@ public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, $is if (!empty($f['class']) && is_subclass_of($f['class'], 'Twig_Template') && method_exists($f['class'], 'getDebugInfo')) { $template = isset($f['object']) ? $f['object'] : new $f['class'](new \Twig_Environment(new \Twig_Loader_Filesystem())); - - try { - $templateName = $template->getTemplateName(); - $templateSrc = explode("\n", method_exists($template, 'getSource') ? $template->getSource() : $template->getEnvironment()->getLoader()->getSource($templateName)); - $templateInfo = $template->getDebugInfo(); - if (isset($templateInfo[$f['line']])) { + $templateName = $template->getTemplateName(); + $templateSrc = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : ''); + $templateInfo = $template->getDebugInfo(); + if (isset($templateInfo[$f['line']])) { + if (method_exists($template, 'getSourceContext')) { + $templateName = $template->getSourceContext()->getPath() ?: $templateName; + } + if ($templateSrc) { + $templateSrc = explode("\n", $templateSrc); $src[$templateName.':'.$templateInfo[$f['line']]] = self::extractSource($templateSrc, $templateInfo[$f['line']], self::$srcContext); + } else { + $src[$templateName] = $templateInfo[$f['line']]; } - } catch (\Twig_Error_Loader $e) { } } } else { diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php new file mode 100644 index 000000000000..4c72eb1f7529 --- /dev/null +++ b/src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use Symfony\Component\VarDumper\Caster\FrameStub; +use Symfony\Component\VarDumper\Test\VarDumperTestCase; + +class ExceptionCasterTest extends VarDumperTestCase +{ + /** + * @requires function Twig_Template::getSourceContext + */ + public function testFrameWithTwig() + { + require_once dirname(__DIR__).'/Fixtures/Twig.php'; + + $f = array( + new FrameStub(array( + 'file' => dirname(__DIR__).'/Fixtures/Twig.php', + 'line' => 19, + 'class' => '__TwigTemplate_VarDumperFixture_u75a09', + 'object' => new \__TwigTemplate_VarDumperFixture_u75a09(new \Twig_Environment(new \Twig_Loader_Filesystem())), + )), + new FrameStub(array( + 'file' => dirname(__DIR__).'/Fixtures/Twig.php', + 'line' => 19, + 'class' => '__TwigTemplate_VarDumperFixture_u75a09', + 'object' => new \__TwigTemplate_VarDumperFixture_u75a09(new \Twig_Environment(new \Twig_Loader_Filesystem()), null), + )), + ); + + $expectedDump = <<<'EODUMP' +array:2 [ + 0 => { + class: "__TwigTemplate_VarDumperFixture_u75a09" + object: __TwigTemplate_VarDumperFixture_u75a09 { + %A + } + src: { + %sTwig.php:19: """ + // line 2\n + throw new \Exception('Foobar');\n + }\n + """ + bar.twig:2: """ + foo bar\n + twig source\n + \n + """ + } + } + 1 => { + class: "__TwigTemplate_VarDumperFixture_u75a09" + object: __TwigTemplate_VarDumperFixture_u75a09 { + %A + } + src: { + %sTwig.php:19: """ + // line 2\n + throw new \Exception('Foobar');\n + }\n + """ + foo.twig:2: """ + foo bar\n + twig source\n + \n + """ + } + } +] + +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $f); + } +} diff --git a/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php b/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php index 11de511dd0db..36d45b6b5bb1 100644 --- a/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php +++ b/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php @@ -201,6 +201,9 @@ public function testClosedResource() ); } + /** + * @requires function Twig_Template::getSourceContext + */ public function testThrowingCaster() { $out = fopen('php://memory', 'r+b'); @@ -235,19 +238,6 @@ public function testThrowingCaster() rewind($out); $out = stream_get_contents($out); - if (method_exists($twig, 'getSource')) { - $twig = <<assertStringMatchesFormat( <<displayWithErrorHandling() ==> __TwigTemplate_VarDumperFixture_u75a09->doDisplay(): { src: { diff --git a/src/Symfony/Component/VarDumper/Tests/Fixtures/Twig.php b/src/Symfony/Component/VarDumper/Tests/Fixtures/Twig.php index f25aac6553bb..7ffdd2bd54a6 100644 --- a/src/Symfony/Component/VarDumper/Tests/Fixtures/Twig.php +++ b/src/Symfony/Component/VarDumper/Tests/Fixtures/Twig.php @@ -3,14 +3,14 @@ /* foo.twig */ class __TwigTemplate_VarDumperFixture_u75a09 extends Twig_Template { - public function __construct(Twig_Environment $env) + private $filename; + + public function __construct(Twig_Environment $env, $filename = 'bar.twig') { parent::__construct($env); - $this->parent = false; - - $this->blocks = array( - ); + $this->blocks = array(); + $this->filename = $filename; } protected function doDisplay(array $context, array $blocks = array()) @@ -26,14 +26,11 @@ public function getTemplateName() public function getDebugInfo() { - return array (19 => 2); + return array(19 => 2); } - public function getSource() + public function getSourceContext() { - return " foo bar - twig source - -"; + return new Twig_Source(" foo bar\n twig source\n\n", 'foo.twig', $this->filename); } }