Completed
Pull Request — master (#85)
by Kévin
18:16 queued 14:06
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 1
    public function __construct(EventManager $eventManager)
32
    {
33 1
        $this->eventManager = $eventManager;
34 1
    }
35
36 1
    public function registerExpressionPasses(array $expressionPasses)
37
    {
38 1
        foreach ($expressionPasses as $pass) {
39 1
            if (!$pass instanceof AnalyzerPassInterface) {
40
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
41
            }
42
43 1
            $bindOnExpressions = $pass->getRegister();
44 1
            foreach ($bindOnExpressions as $bindOnExpression) {
45 1
                if (isset($this->bindOnExpressions[$bindOnExpression])) {
46 1
                    $this->bindOnExpressions[$bindOnExpression][] = $pass;
47 1
                } else {
48 1
                    $this->bindOnExpressions[$bindOnExpression] = [$pass];
49
                }
50 1
            }
51 1
        }
52 1
    }
53
54
    /**
55
     * @param array $statementPasses
56
     */
57 1
    public function registerStatementPasses(array $statementPasses)
58 1
    {
59 1
        foreach ($statementPasses as $pass) {
60 1
            if (!$pass instanceof AnalyzerPassInterface) {
61
                throw new \RuntimeException('Analyzer pass must implement AnalyzerPassInterface');
62
            }
63
64 1
            $bindOnStatements = $pass->getRegister();
65 1
            foreach ($bindOnStatements as $bindOnStatement) {
66 1
                if (isset($this->bindOnStatements[$bindOnStatement])) {
67 1
                    $this->bindOnStatements[$bindOnStatement][] = $pass;
68 1
                } else {
69 1
                    $this->bindOnStatements[$bindOnStatement] = [$pass];
70
                }
71 1
            }
72 1
        }
73 1
    }
74
75 1
    public function bind()
76
    {
77 1
        $this->eventManager->listen(Compiler\Event\ExpressionBeforeCompile::EVENT_NAME)
78 1
            ->handler(
79 1
                new ExpressionListener($this->bindOnExpressions)
80 1
            )
81 1
            ->method('beforeCompile');
82
83 1
        $this->eventManager->listen(Compiler\Event\StatementBeforeCompile::EVENT_NAME)
84 1
            ->handler(
85 1
                new StatementListener($this->bindOnStatements)
86 1
            )
87 1
            ->method('beforeCompile');
88 1
    }
89
}
90