Completed
Pull Request — master (#240)
by Дмитрий
08:27
created

Analyzer::registerExpressionPasses()   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\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 40
    public function __construct(EventManager $eventManager)
35
    {
36 40
        $this->eventManager = $eventManager;
37 40
    }
38
39
    /**
40
     * @param array $expressionPasses all the expression analyzers
41
     * @throws \RuntimeException if the analyzer does not implement the required interface
42
     */
43 40
    public function registerExpressionPasses(array $expressionPasses)
44
    {
45 40
        foreach ($expressionPasses as $pass) {
46 22
            if (!$pass instanceof AnalyzerPassInterface) {
47
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
48
            }
49
50 22
            $bindOnExpressions = $pass->getRegister();
51 22
            foreach ($bindOnExpressions as $bindOnExpression) {
52 22
                if (isset($this->bindOnExpressions[$bindOnExpression])) {
53
                    $this->bindOnExpressions[$bindOnExpression][] = $pass;
54
                } else {
55 22
                    $this->bindOnExpressions[$bindOnExpression] = [$pass];
56
                }
57 22
            }
58 40
        }
59 40
    }
60
61
    /**
62
     * @param array $statementPasses all the statement analyzers
63
     * @throws \RuntimeException if the analyzer does not implement the required interface
64
     */
65 40
    public function registerStatementPasses(array $statementPasses)
66
    {
67 40
        foreach ($statementPasses as $pass) {
68 18
            if (!$pass instanceof AnalyzerPassInterface) {
69
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
70
            }
71
72 18
            $bindOnStatements = $pass->getRegister();
73 18
            foreach ($bindOnStatements as $bindOnStatement) {
74 18
                if (isset($this->bindOnStatements[$bindOnStatement])) {
75
                    $this->bindOnStatements[$bindOnStatement][] = $pass;
76
                } else {
77 18
                    $this->bindOnStatements[$bindOnStatement] = [$pass];
78
                }
79 18
            }
80 40
        }
81 40
    }
82
83
    /**
84
     * binds the listeners
85
     */
86 40
    public function bind()
87
    {
88 40
        $this->eventManager->listen(Compiler\Event\ExpressionBeforeCompile::EVENT_NAME)
89 40
            ->handler(
90 40
                new ExpressionListener($this->bindOnExpressions)
91 40
            )
92 40
            ->method('beforeCompile');
93
94 40
        $this->eventManager->listen(Compiler\Event\StatementBeforeCompile::EVENT_NAME)
95 40
            ->handler(
96 40
                new StatementListener($this->bindOnStatements)
97 40
            )
98 40
            ->method('beforeCompile');
99 40
    }
100
}
101