Completed
Push — master ( 3325cc...0b755b )
by Дмитрий
08:21 queued 04:54
created

Analyzer::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 2
b 0
f 0
nc 1
nop 1
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
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\StatementListener;
11
use PHPSA\Analyzer\Pass\AnalyzerPassInterface;
12
use Webiny\Component\EventManager\EventManager;
13
14
class Analyzer
15
{
16
    /**
17
     * @var EventManager
18
     */
19
    protected $eventManager;
20
21
    /**
22
     * @var []AnalyzerPassInterface[]
23
     */
24
    protected $bindOnExpressions = [];
25
26
    /**
27
     * @var []AnalyzerPassInterface[]
28
     */
29
    protected $bindOnStatements = [];
30
31
    /**
32
     * @param EventManager $eventManager
33
     */
34 1
    public function __construct(EventManager $eventManager)
35
    {
36 1
        $this->eventManager = $eventManager;
37 1
    }
38
39
    /**
40
     * @param array $expressionPasses all the expression analyzers
41
     * @throws \RuntimeException if the analyzer does not implement the required interface
42
     */
43 1
    public function registerExpressionPasses(array $expressionPasses)
44
    {
45 1
        foreach ($expressionPasses as $pass) {
46 1
            if (!$pass instanceof AnalyzerPassInterface) {
47
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
48
            }
49
50 1
            $bindOnExpressions = $pass->getRegister();
51 1
            foreach ($bindOnExpressions as $bindOnExpression) {
52 1
                if (isset($this->bindOnExpressions[$bindOnExpression])) {
53 1
                    $this->bindOnExpressions[$bindOnExpression][] = $pass;
54 1
                } else {
55 1
                    $this->bindOnExpressions[$bindOnExpression] = [$pass];
56
                }
57 1
            }
58 1
        }
59 1
    }
60
61
    /**
62
     * @param array $statementPasses all the statement analyzers
63
     * @throws \RuntimeException if the analyzer does not implement the required interface
64
     */
65 1
    public function registerStatementPasses(array $statementPasses)
66
    {
67 1
        foreach ($statementPasses as $pass) {
68 1
            if (!$pass instanceof AnalyzerPassInterface) {
69
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
70
            }
71
72 1
            $bindOnStatements = $pass->getRegister();
73 1
            foreach ($bindOnStatements as $bindOnStatement) {
74 1
                if (isset($this->bindOnStatements[$bindOnStatement])) {
75 1
                    $this->bindOnStatements[$bindOnStatement][] = $pass;
76 1
                } else {
77 1
                    $this->bindOnStatements[$bindOnStatement] = [$pass];
78
                }
79 1
            }
80 1
        }
81 1
    }
82
83
    /**
84
     * binds the listeners
85
     */
86 1
    public function bind()
87
    {
88 1
        $this->eventManager->listen(Compiler\Event\ExpressionBeforeCompile::EVENT_NAME)
89 1
            ->handler(
90 1
                new ExpressionListener($this->bindOnExpressions)
91 1
            )
92 1
            ->method('beforeCompile');
93
94 1
        $this->eventManager->listen(Compiler\Event\StatementBeforeCompile::EVENT_NAME)
95 1
            ->handler(
96 1
                new StatementListener($this->bindOnStatements)
97 1
            )
98 1
            ->method('beforeCompile');
99 1
    }
100
}
101