Completed
Pull Request — master (#232)
by
unknown
05:28
created

Analyzer::registerScalarPasses()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 17
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 5.3073

Importance

Changes 0
Metric Value
cc 5
eloc 10
nc 5
nop 1
dl 0
loc 17
ccs 10
cts 13
cp 0.7692
crap 5.3073
rs 8.8571
c 0
b 0
f 0
1
<?php
2
/**
3
 * @author Patsura Dmitry https://github.com/ovr <[email protected]>
4
 */
5
6
7
namespace PHPSA;
8
9
use PHPSA\Analyzer\EventListener\ExpressionListener;
10
use PHPSA\Analyzer\EventListener\ScalarListener;
11
use PHPSA\Analyzer\EventListener\StatementListener;
12
use PHPSA\Analyzer\Pass\AnalyzerPassInterface;
13
use Webiny\Component\EventManager\EventManager;
14
15
class Analyzer
16
{
17
    /**
18
     * @var EventManager
19
     */
20
    protected $eventManager;
21
22
    /**
23
     * @var []AnalyzerPassInterface[]
24
     */
25
    protected $bindOnExpressions = [];
26
27
    /**
28
     * @var []AnalyzerPassInterface[]
29
     */
30
    protected $bindOnStatements = [];
31
32
    /**
33
     * @var []AnalyzerPassInterface[]
34
     */
35
    protected $bindOnScalars = [];
36
37
    /**
38
     * @param EventManager $eventManager
39
     */
40 1
    public function __construct(EventManager $eventManager)
41
    {
42 1
        $this->eventManager = $eventManager;
43 1
    }
44
45
    /**
46
     * @param array $expressionPasses all the expression analyzers
47
     * @throws \RuntimeException if the analyzer does not implement the required interface
48
     */
49 1
    public function registerExpressionPasses(array $expressionPasses)
50
    {
51 1
        foreach ($expressionPasses as $pass) {
52 1
            if (!$pass instanceof AnalyzerPassInterface) {
53
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
54
            }
55
56 1
            $bindOnExpressions = $pass->getRegister();
57 1
            foreach ($bindOnExpressions as $bindOnExpression) {
58 1
                if (isset($this->bindOnExpressions[$bindOnExpression])) {
59 1
                    $this->bindOnExpressions[$bindOnExpression][] = $pass;
60 1
                } else {
61 1
                    $this->bindOnExpressions[$bindOnExpression] = [$pass];
62
                }
63 1
            }
64 1
        }
65 1
    }
66
67
    /**
68
     * @param array $statementPasses all the statement analyzers
69
     * @throws \RuntimeException if the analyzer does not implement the required interface
70
     */
71 1
    public function registerStatementPasses(array $statementPasses)
72
    {
73 1
        foreach ($statementPasses as $pass) {
74 1
            if (!$pass instanceof AnalyzerPassInterface) {
75
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
76
            }
77
78 1
            $bindOnStatements = $pass->getRegister();
79 1
            foreach ($bindOnStatements as $bindOnStatement) {
80 1
                if (isset($this->bindOnStatements[$bindOnStatement])) {
81 1
                    $this->bindOnStatements[$bindOnStatement][] = $pass;
82 1
                } else {
83 1
                    $this->bindOnStatements[$bindOnStatement] = [$pass];
84
                }
85 1
            }
86 1
        }
87 1
    }
88
89
    /**
90
     * @param array $scalarPasses all the scalar analyzers
91
     * @throws \RuntimeException if the analyzer does not implement the required interface
92
     */
93 1
    public function registerScalarPasses(array $scalarPasses)
94
    {
95 1
        foreach ($scalarPasses as $pass) {
96 1
            if (!$pass instanceof AnalyzerPassInterface) {
97
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
98
            }
99
100 1
            $bindOnScalars = $pass->getRegister();
101 1
            foreach ($bindOnScalars as $bindOnScalar) {
102 1
                if (isset($this->bindOnScalars[$bindOnScalar])) {
103
                    $this->bindOnScalars[$bindOnScalar][] = $pass;
104
                } else {
105 1
                    $this->bindOnScalars[$bindOnScalar] = [$pass];
106
                }
107 1
            }
108 1
        }
109 1
    }
110
111
    /**
112
     * binds the listeners
113
     */
114 1
    public function bind()
115
    {
116 1
        $this->eventManager->listen(Compiler\Event\ExpressionBeforeCompile::EVENT_NAME)
117 1
            ->handler(
118 1
                new ExpressionListener($this->bindOnExpressions)
119 1
            )
120 1
            ->method('beforeCompile');
121
122 1
        $this->eventManager->listen(Compiler\Event\StatementBeforeCompile::EVENT_NAME)
123 1
            ->handler(
124 1
                new StatementListener($this->bindOnStatements)
125 1
            )
126 1
            ->method('beforeCompile');
127
128 1
        $this->eventManager->listen(Compiler\Event\ScalarBeforeCompile::EVENT_NAME)
129 1
            ->handler(
130 1
                new ScalarListener($this->bindOnScalars)
131 1
            )
132 1
            ->method('beforeCompile');
133 1
    }
134
}
135