1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Twig\Profiler\NodeVisitor;
13
14use Twig\Environment;
15use Twig\Node\BlockNode;
16use Twig\Node\BodyNode;
17use Twig\Node\MacroNode;
18use Twig\Node\ModuleNode;
19use Twig\Node\Node;
20use Twig\NodeVisitor\AbstractNodeVisitor;
21use Twig\Profiler\Node\EnterProfileNode;
22use Twig\Profiler\Node\LeaveProfileNode;
23use Twig\Profiler\Profile;
24
25/**
26 * @author Fabien Potencier <fabien@symfony.com>
27 *
28 * @final
29 */
30class ProfilerNodeVisitor extends AbstractNodeVisitor
31{
32    private $extensionName;
33
34    public function __construct($extensionName)
35    {
36        $this->extensionName = $extensionName;
37    }
38
39    protected function doEnterNode(Node $node, Environment $env)
40    {
41        return $node;
42    }
43
44    protected function doLeaveNode(Node $node, Environment $env)
45    {
46        if ($node instanceof ModuleNode) {
47            $varName = $this->getVarName();
48            $node->setNode('display_start', new Node([new EnterProfileNode($this->extensionName, Profile::TEMPLATE, $node->getTemplateName(), $varName), $node->getNode('display_start')]));
49            $node->setNode('display_end', new Node([new LeaveProfileNode($varName), $node->getNode('display_end')]));
50        } elseif ($node instanceof BlockNode) {
51            $varName = $this->getVarName();
52            $node->setNode('body', new BodyNode([
53                new EnterProfileNode($this->extensionName, Profile::BLOCK, $node->getAttribute('name'), $varName),
54                $node->getNode('body'),
55                new LeaveProfileNode($varName),
56            ]));
57        } elseif ($node instanceof MacroNode) {
58            $varName = $this->getVarName();
59            $node->setNode('body', new BodyNode([
60                new EnterProfileNode($this->extensionName, Profile::MACRO, $node->getAttribute('name'), $varName),
61                $node->getNode('body'),
62                new LeaveProfileNode($varName),
63            ]));
64        }
65
66        return $node;
67    }
68
69    private function getVarName()
70    {
71        return sprintf('__internal_%s', hash('sha256', $this->extensionName));
72    }
73
74    public function getPriority()
75    {
76        return 0;
77    }
78}
79
80class_alias('Twig\Profiler\NodeVisitor\ProfilerNodeVisitor', 'Twig_Profiler_NodeVisitor_Profiler');
81