vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php line 47

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of Twig.
  4. *
  5. * (c) Fabien Potencier
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Twig\NodeVisitor;
  11. use Twig\Environment;
  12. use Twig\Node\Expression\AssignNameExpression;
  13. use Twig\Node\Expression\ConstantExpression;
  14. use Twig\Node\Expression\GetAttrExpression;
  15. use Twig\Node\Expression\MethodCallExpression;
  16. use Twig\Node\Expression\NameExpression;
  17. use Twig\Node\ImportNode;
  18. use Twig\Node\ModuleNode;
  19. use Twig\Node\Node;
  20. /**
  21. * @author Fabien Potencier <fabien@symfony.com>
  22. */
  23. final class MacroAutoImportNodeVisitor implements NodeVisitorInterface
  24. {
  25. private $inAModule = false;
  26. private $hasMacroCalls = false;
  27. public function enterNode(Node $node, Environment $env)
  28. {
  29. if ($node instanceof ModuleNode) {
  30. $this->inAModule = true;
  31. $this->hasMacroCalls = false;
  32. }
  33. return $node;
  34. }
  35. public function leaveNode(Node $node, Environment $env)
  36. {
  37. if ($node instanceof ModuleNode) {
  38. $this->inAModule = false;
  39. if ($this->hasMacroCalls) {
  40. $node->getNode('constructor_end')->setNode('_auto_macro_import', new ImportNode(new NameExpression('_self', 0), new AssignNameExpression('_self', 0), 0, 'import', true));
  41. }
  42. } elseif ($this->inAModule) {
  43. if (
  44. $node instanceof GetAttrExpression &&
  45. $node->getNode('node') instanceof NameExpression &&
  46. '_self' === $node->getNode('node')->getAttribute('name') &&
  47. $node->getNode('attribute') instanceof ConstantExpression
  48. ) {
  49. $this->hasMacroCalls = true;
  50. $name = $node->getNode('attribute')->getAttribute('value');
  51. $node = new MethodCallExpression($node->getNode('node'), 'macro_'.$name, $node->getNode('arguments'), $node->getTemplateLine());
  52. $node->setAttribute('safe', true);
  53. }
  54. }
  55. return $node;
  56. }
  57. public function getPriority()
  58. {
  59. // we must be ran before auto-escaping
  60. return -10;
  61. }
  62. }