DeferredNodeVisitorCompat.php 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <?php
  2. /**
  3. * This file is part of the rybakit/twig-deferred-extension package.
  4. *
  5. * (c) Eugene Leonovich <gen.work@gmail.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. declare(strict_types=1);
  11. namespace Twig\DeferredExtension;
  12. use Twig\Environment;
  13. use Twig\Node\ModuleNode;
  14. use Twig\Node\Node;
  15. use Twig\NodeVisitor\NodeVisitorInterface;
  16. final class DeferredNodeVisitorCompat implements NodeVisitorInterface
  17. {
  18. private $hasDeferred = false;
  19. /**
  20. * @param \Twig_NodeInterface $node
  21. * @param Environment $env
  22. * @return Node
  23. */
  24. public function enterNode(\Twig_NodeInterface $node, Environment $env): Node
  25. {
  26. if (!$this->hasDeferred && $node instanceof DeferredBlockNode) {
  27. $this->hasDeferred = true;
  28. }
  29. \assert($node instanceof Node);
  30. return $node;
  31. }
  32. /**
  33. * @param \Twig_NodeInterface $node
  34. * @param Environment $env
  35. * @return Node|null
  36. */
  37. public function leaveNode(\Twig_NodeInterface $node, Environment $env): ?Node
  38. {
  39. if ($this->hasDeferred && $node instanceof ModuleNode) {
  40. $node->getNode('constructor_end')->setNode('deferred_initialize', new DeferredInitializeNode());
  41. $node->getNode('display_end')->setNode('deferred_resolve', new DeferredResolveNode());
  42. $node->getNode('class_end')->setNode('deferred_declare', new DeferredDeclareNode());
  43. $this->hasDeferred = false;
  44. }
  45. \assert($node instanceof Node);
  46. return $node;
  47. }
  48. /**
  49. * @return int
  50. */
  51. public function getPriority() : int
  52. {
  53. return 0;
  54. }
  55. }