Completed
Push — master ( d48b55...73918b )
by Mewes
06:44
created

SyntaxCheckNodeVisitor::leaveNode()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 6
rs 9.4286
cc 1
eloc 3
nc 1
nop 2
1
<?php
2
3
namespace MewesK\TwigExcelBundle\Twig\NodeVisitor;
4
5
use MewesK\TwigExcelBundle\Twig\Node\XlsCellNode;
6
use MewesK\TwigExcelBundle\Twig\Node\XlsCenterNode;
7
use MewesK\TwigExcelBundle\Twig\Node\XlsDocumentNode;
8
use MewesK\TwigExcelBundle\Twig\Node\XlsDrawingNode;
9
use MewesK\TwigExcelBundle\Twig\Node\XlsFooterNode;
10
use MewesK\TwigExcelBundle\Twig\Node\XlsHeaderNode;
11
use MewesK\TwigExcelBundle\Twig\Node\XlsLeftNode;
12
use MewesK\TwigExcelBundle\Twig\Node\XlsRightNode;
13
use MewesK\TwigExcelBundle\Twig\Node\XlsRowNode;
14
use MewesK\TwigExcelBundle\Twig\Node\XlsSheetNode;
15
use Twig_BaseNodeVisitor;
16
use Twig_Environment;
17
use Twig_Error_Syntax;
18
use Twig_Node;
19
20
/**
21
 * Class SyntaxCheckNodeVisitor
22
 *
23
 * @package MewesK\TwigExcelBundle\Twig\NodeVisitor
24
 */
25
class SyntaxCheckNodeVisitor extends Twig_BaseNodeVisitor
26
{
27
    /**
28
     * @var array
29
     */
30
    protected $path = [];
31
32
    /**
33
     * {@inheritdoc}
34
     *
35
     * @throws Twig_Error_Syntax
36
     */
37
    protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
38
    {
39
        if ($node instanceof XlsDocumentNode) {
40
            $this->checkAllowedParents($node, []);
41
        } elseif ($node instanceof XlsSheetNode) {
42
            $this->checkAllowedParents($node,
43
                ['MewesK\TwigExcelBundle\Twig\Node\XlsDocumentNode']);
44
        } elseif ($node instanceof XlsRowNode || $node instanceof XlsFooterNode || $node instanceof XlsHeaderNode) {
45
            $this->checkAllowedParents($node,
46
                ['MewesK\TwigExcelBundle\Twig\Node\XlsSheetNode']);
47
        } elseif ($node instanceof XlsLeftNode || $node instanceof XlsCenterNode || $node instanceof XlsRightNode) {
48
            $this->checkAllowedParents($node,
49
                ['MewesK\TwigExcelBundle\Twig\Node\XlsFooterNode',
50
                    'MewesK\TwigExcelBundle\Twig\Node\XlsHeaderNode']);
51
        } elseif ($node instanceof XlsCellNode) {
52
            $this->checkAllowedParents($node,
53
                ['MewesK\TwigExcelBundle\Twig\Node\XlsRowNode']);
54
        } elseif ($node instanceof XlsDrawingNode) {
55
            $this->checkAllowedParents($node,
56
                ['MewesK\TwigExcelBundle\Twig\Node\XlsSheetNode',
57
                    'MewesK\TwigExcelBundle\Twig\Node\XlsLeftNode',
58
                    'MewesK\TwigExcelBundle\Twig\Node\XlsCenterNode',
59
                    'MewesK\TwigExcelBundle\Twig\Node\XlsRightNode']);
60
        }
61
62
        $this->path[] = get_class($node);
63
64
        return $node;
65
    }
66
67
    /**
68
     * {@inheritdoc}
69
     */
70
    protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
71
    {
72
        array_pop($this->path);
73
74
        return $node;
75
    }
76
77
    /**
78
     * {@inheritdoc}
79
     */
80
    public function getPriority()
81
    {
82
        return 0;
83
    }
84
85
    //
86
    // Helper
87
    //
88
89
    /**
90
     * @param Twig_Node $node
91
     * @param array $allowedParents
92
     *
93
     * @throws Twig_Error_Syntax
94
     */
95
    protected function checkAllowedParents(Twig_Node $node, array $allowedParents)
96
    {
97
        $parentName = null;
98
99
        foreach (array_reverse($this->path) as $className) {
100
            if (strpos($className, 'MewesK\TwigExcelBundle\Twig\Node\Xls') === 0) {
101
                $parentName = $className;
102
                break;
103
            }
104
        }
105
106
        if ($parentName === null && count($allowedParents) === 0) {
107
            return;
108
        }
109
110
        foreach ($allowedParents as $className) {
111
            if ($className === $parentName) {
112
                return;
113
            }
114
        }
115
116
        throw new Twig_Error_Syntax(sprintf('Node "%s" is not allowed inside of Node "%s".', get_class($node), $parentName));
117
    }
118
}
119