1<?php 2 3/* 4 * This file is part of Twig. 5 * 6 * (c) Fabien Potencier 7 * 8 * For the full copyright and license information, please view the LICENSE 9 * file that was distributed with this source code. 10 */ 11 12namespace Twig\Util; 13 14use Twig\Environment; 15use Twig\Error\SyntaxError; 16use Twig\Source; 17 18/** 19 * @author Fabien Potencier <fabien@symfony.com> 20 */ 21final class DeprecationCollector 22{ 23 private $twig; 24 25 public function __construct(Environment $twig) 26 { 27 $this->twig = $twig; 28 } 29 30 /** 31 * Returns deprecations for templates contained in a directory. 32 * 33 * @param string $dir A directory where templates are stored 34 * @param string $ext Limit the loaded templates by extension 35 * 36 * @return array An array of deprecations 37 */ 38 public function collectDir($dir, $ext = '.twig') 39 { 40 $iterator = new \RegexIterator( 41 new \RecursiveIteratorIterator( 42 new \RecursiveDirectoryIterator($dir), \RecursiveIteratorIterator::LEAVES_ONLY 43 ), '{'.preg_quote($ext).'$}' 44 ); 45 46 return $this->collect(new TemplateDirIterator($iterator)); 47 } 48 49 /** 50 * Returns deprecations for passed templates. 51 * 52 * @param \Traversable $iterator An iterator of templates (where keys are template names and values the contents of the template) 53 * 54 * @return array An array of deprecations 55 */ 56 public function collect(\Traversable $iterator) 57 { 58 $deprecations = []; 59 set_error_handler(function ($type, $msg) use (&$deprecations) { 60 if (\E_USER_DEPRECATED === $type) { 61 $deprecations[] = $msg; 62 } 63 }); 64 65 foreach ($iterator as $name => $contents) { 66 try { 67 $this->twig->parse($this->twig->tokenize(new Source($contents, $name))); 68 } catch (SyntaxError $e) { 69 // ignore templates containing syntax errors 70 } 71 } 72 73 restore_error_handler(); 74 75 return $deprecations; 76 } 77} 78 79class_alias('Twig\Util\DeprecationCollector', 'Twig_Util_DeprecationCollector'); 80