DeferredNodeVisitor.php 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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 DeferredNodeVisitor implements NodeVisitorInterface
  17. {
  18. private $hasDeferred = false;
  19. public function enterNode(Node $node, Environment $env) : Node
  20. {
  21. if (!$this->hasDeferred && $node instanceof DeferredBlockNode) {
  22. $this->hasDeferred = true;
  23. }
  24. return $node;
  25. }
  26. public function leaveNode(Node $node, Environment $env) : ?Node
  27. {
  28. if ($this->hasDeferred && $node instanceof ModuleNode) {
  29. $node->getNode('constructor_end')->setNode('deferred_initialize', new DeferredInitializeNode());
  30. $node->getNode('display_end')->setNode('deferred_resolve', new DeferredResolveNode());
  31. $node->getNode('class_end')->setNode('deferred_declare', new DeferredDeclareNode());
  32. $this->hasDeferred = false;
  33. }
  34. return $node;
  35. }
  36. public function getPriority() : int
  37. {
  38. return 0;
  39. }
  40. }