Completed
Pull Request — master (#149)
by Enrico
04:03
created

Statement   C

Complexity

Total Complexity 24

Size/Duplication

Total Lines 77
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 20

Test Coverage

Coverage 84.91%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 77
ccs 45
cts 53
cp 0.8491
rs 6.4705
wmc 24
lcom 0
cbo 20

2 Methods

Rating   Name   Duplication   Size   Complexity  
D factory() 0 41 18
B __construct() 0 23 6
1
<?php
2
/**
3
 * @author Patsura Dmitry https://github.com/ovr <[email protected]>
4
 */
5
6
namespace PHPSA\Compiler;
7
8
use PHPSA\Context;
9
use PhpParser\Node;
10
use PHPSA\Compiler\Statement\AbstractCompiler;
11
use RuntimeException;
12
use PhpParser\Node\Stmt;
13
14
class Statement
15
{
16
    /**
17
     * @param Node\Stmt $stmt
18
     * @throws RuntimeException
19
     * @return AbstractCompiler
20
     */
21 20
    protected function factory($stmt)
22
    {
23 20
        switch (get_class($stmt)) {
24 20
            case Stmt\Break_::class:
25 1
                return new Statement\BreakSt();
26 20
            case Stmt\Continue_::class:
27
                return new Statement\ContinueSt();
28 20
            case Stmt\Echo_::class:
29
                return new Statement\EchoSt();
30 20
            case Stmt\Return_::class:
31 20
                return new Statement\ReturnSt();
32 2
            case Stmt\While_::class:
33
                return new Statement\WhileSt();
34 2
            case Stmt\Switch_::class:
35 1
                return new Statement\SwitchSt();
36 1
            case Stmt\If_::class:
37
                return new Statement\IfSt();
38 1
            case Stmt\Do_::class:
39
                return new Statement\DoSt();
40 1
            case Stmt\For_::class:
41
                return new Statement\ForSt();
42 1
            case Stmt\Foreach_::class:
43 1
                return new Statement\ForeachSt();
44 1
            case Stmt\TryCatch::class:
45 1
                return new Statement\TryCatchSt();
46 1
            case Stmt\Catch_::class:
47 1
                return new Statement\CatchSt();
48 1
            case Stmt\Throw_::class:
49 1
                return new Statement\ThrowSt();
50 1
            case Stmt\Global_::class:
51 1
                return new Statement\GlobalSt();
52 1
            case Stmt\Static_::class:
53 1
                return new Statement\StaticSt();
54 1
            case Stmt\Declare_::class:
55
                return new Statement\DeclareSt();
56 1
            case Stmt\Const_::class:
57
                return new Statement\ConstSt();
58 1
        }
59
60 1
        throw new RuntimeException('Unknown statement: ' . get_class($stmt));
61
    }
62
63
    /**
64
     * @param Node\Stmt $stmt
65
     * @param Context $context
66
     */
67 21
    public function __construct(Node\Stmt $stmt, Context $context)
68
    {
69
        try {
70 21
            $context->getEventManager()->fire(
71 21
                Event\StatementBeforeCompile::EVENT_NAME,
72 21
                new Event\StatementBeforeCompile(
73 21
                    $stmt,
74
                    $context
75 21
                )
76 21
            );
77
            
78 21
            if ($stmt instanceof Stmt\Goto_ || $stmt instanceof Stmt\Label || $stmt instanceof Stmt\InlineHTML || $stmt instanceof Stmt\Nop) {
79 1
                return;
80
            }
81
82 20
            $compiler = $this->factory($stmt);
83 20
        } catch (\Exception $e) {
84 1
            $context->debug('StatementCompiler is not implemented for ' . get_class($stmt));
85 1
            return;
86
        }
87
88 20
        $compiler->pass($stmt, $context);
89 20
    }
90
}
91