From beba9c029dfb2320d38030f21b81a158717c402d Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Fri, 17 Sep 2021 15:46:10 +0300 Subject: [PATCH] Better Twig 3 support --- .../DeferredExtension/DeferredExtension.php | 6 +++ .../DeferredExtension/DeferredNodeVisitor.php | 4 +- .../DeferredNodeVisitorCompat.php | 49 +++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php diff --git a/system/src/Twig/DeferredExtension/DeferredExtension.php b/system/src/Twig/DeferredExtension/DeferredExtension.php index aa7044995..f27c2a36f 100644 --- a/system/src/Twig/DeferredExtension/DeferredExtension.php +++ b/system/src/Twig/DeferredExtension/DeferredExtension.php @@ -13,6 +13,7 @@ declare(strict_types=1); namespace Twig\DeferredExtension; +use Twig\Environment; use Twig\Extension\AbstractExtension; use Twig\Template; @@ -27,6 +28,11 @@ final class DeferredExtension extends AbstractExtension public function getNodeVisitors() : array { + if (Environment::VERSION_ID < 20000) { + // Twig 1.x support + return [new DeferredNodeVisitorCompat()]; + } + return [new DeferredNodeVisitor()]; } diff --git a/system/src/Twig/DeferredExtension/DeferredNodeVisitor.php b/system/src/Twig/DeferredExtension/DeferredNodeVisitor.php index 0aa364ce7..aef739943 100644 --- a/system/src/Twig/DeferredExtension/DeferredNodeVisitor.php +++ b/system/src/Twig/DeferredExtension/DeferredNodeVisitor.php @@ -22,7 +22,7 @@ final class DeferredNodeVisitor implements NodeVisitorInterface { private $hasDeferred = false; - public function enterNode(\Twig_NodeInterface $node, Environment $env) : Node + public function enterNode(Node $node, Environment $env) : Node { if (!$this->hasDeferred && $node instanceof DeferredBlockNode) { $this->hasDeferred = true; @@ -31,7 +31,7 @@ final class DeferredNodeVisitor implements NodeVisitorInterface return $node; } - public function leaveNode(\Twig_NodeInterface $node, Environment $env) : ?Node + public function leaveNode(Node $node, Environment $env) : ?Node { if ($this->hasDeferred && $node instanceof ModuleNode) { $node->setNode('constructor_end', new Node([new DeferredExtensionNode(), $node->getNode('constructor_end')])); diff --git a/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php b/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php new file mode 100644 index 000000000..8c441bb9a --- /dev/null +++ b/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Twig\DeferredExtension; + +use Twig\Environment; +use Twig\Node\ModuleNode; +use Twig\Node\Node; +use Twig\NodeVisitor\NodeVisitorInterface; + +final class DeferredNodeVisitorCompat implements NodeVisitorInterface +{ + private $hasDeferred = false; + + public function enterNode(\Twig_NodeInterface $node, Environment $env) : Node + { + if (!$this->hasDeferred && $node instanceof DeferredBlockNode) { + $this->hasDeferred = true; + } + + return $node; + } + + public function leaveNode(\Twig_NodeInterface $node, Environment $env) : ?Node + { + if ($this->hasDeferred && $node instanceof ModuleNode) { + $node->setNode('constructor_end', new Node([new DeferredExtensionNode(), $node->getNode('constructor_end')])); + $node->setNode('display_end', new Node([new DeferredNode(), $node->getNode('display_end')])); + $this->hasDeferred = false; + } + + return $node; + } + + public function getPriority() : int + { + return 0; + } +}