Skip to content

Commit 8d84f95

Browse files
authored
Merge pull request #10 from JBlond/twig-trans-9
Fix: Twig removed MacroAutoImportNodeVisitor in Twig v3.15.0
2 parents 981c40d + ccce40e commit 8d84f95

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
namespace jblond\TwigTrans;
4+
5+
use Twig\Environment;
6+
use Twig\Node\Expression\AssignNameExpression;
7+
use Twig\Node\Expression\ConstantExpression;
8+
use Twig\Node\Expression\GetAttrExpression;
9+
use Twig\Node\Expression\MethodCallExpression;
10+
use Twig\Node\Expression\NameExpression;
11+
use Twig\Node\ImportNode;
12+
use Twig\Node\ModuleNode;
13+
use Twig\Node\Node;
14+
use Twig\NodeVisitor\NodeVisitorInterface;
15+
16+
class MacroAutoImportNodeVisitor implements NodeVisitorInterface
17+
{
18+
private $inAModule = false;
19+
private $hasMacroCalls = false;
20+
21+
public function enterNode(Node $node, Environment $env): Node
22+
{
23+
if ($node instanceof ModuleNode) {
24+
$this->inAModule = true;
25+
$this->hasMacroCalls = false;
26+
}
27+
28+
return $node;
29+
}
30+
31+
public function leaveNode(Node $node, Environment $env): Node
32+
{
33+
if ($node instanceof ModuleNode) {
34+
$this->inAModule = false;
35+
if ($this->hasMacroCalls) {
36+
$node->getNode('constructor_end')->setNode(
37+
'_auto_macro_import',
38+
new ImportNode(new NameExpression('_self', 0), new AssignNameExpression('_self', 0), 0, true)
39+
);
40+
}
41+
} elseif ($this->inAModule) {
42+
if (
43+
$node instanceof GetAttrExpression
44+
&& $node->getNode('node') instanceof NameExpression
45+
&& '_self' === $node->getNode('node')->getAttribute('name')
46+
&& $node->getNode('attribute') instanceof ConstantExpression
47+
) {
48+
$this->hasMacroCalls = true;
49+
50+
$name = $node->getNode('attribute')->getAttribute('value');
51+
$node = new MethodCallExpression(
52+
$node->getNode('node'),
53+
'macro_' . $name,
54+
$node->getNode('arguments'),
55+
$node->getTemplateLine()
56+
);
57+
$node->setAttribute('safe', true);
58+
}
59+
}
60+
61+
return $node;
62+
}
63+
64+
public function getPriority(): int
65+
{
66+
// we must run before auto-escaping
67+
return -10;
68+
}
69+
}

src/jblond/TwigTrans/Translation.php

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Twig\Compiler;
66
use Twig\Extension\ExtensionInterface;
7-
use Twig\NodeVisitor\MacroAutoImportNodeVisitor;
87
use Twig\TwigFilter;
98
use Twig\TwigFunction;
109
use Twig\TwigTest;

0 commit comments

Comments
 (0)