Completed
Push — master ( 124462...3bbcdb )
by Дмитрий
02:56
created

Compiler   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 121
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 42.86%

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 121
ccs 21
cts 49
cp 0.4286
rs 10
wmc 20
lcom 1
cbo 4

5 Methods

Rating   Name   Duplication   Size   Complexity  
C compile() 0 54 11
A addClass() 0 4 1
A addFunction() 0 4 1
A getFunctionNS() 0 10 4
A getFunction() 0 10 3
1
<?php
2
/**
3
 * @author Patsura Dmitry https://github.com/ovr <[email protected]>
4
 */
5
6
namespace PHPSA;
7
8
use PHPSA\Definition\ClassDefinition;
9
use PHPSA\Definition\FunctionDefinition;
10
use PHPSA\Definition\RuntimeClassDefinition;
11
use ReflectionClass;
12
13
class Compiler
14
{
15
    /**
16
     * @var ClassDefinition[]
17
     */
18
    protected $classes = array();
19
20
    /**
21
     * @var FunctionDefinition[]
22
     */
23
    protected $functions = array();
24
25
    /**
26
     * @param ClassDefinition $class
27
     */
28 8
    public function addClass(ClassDefinition $class)
29
    {
30 8
        $this->classes[implode('\\', [$class->getNamespace(), $class->getName()])] = $class;
31 8
    }
32
33
    /**
34
     * @param FunctionDefinition $function
35
     */
36
    public function addFunction(FunctionDefinition $function)
37
    {
38
        $this->functions[] = $function;
39
    }
40
41
    /**
42
     * @param Context $context
43
     */
44 8
    public function compile(Context $context)
45
    {
46 8
        $context->scopePointer = null;
47
48
        /**
49
         * @todo Implement class map...
50
         */
51 8
        foreach ($this->classes as $class) {
52 8
            $extends = $class->getExtendsClass();
53 8
            if ($extends) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $extends of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
54
                if (isset($this->classes[$extends])) {
55
                    $class->setExtendsClassDefinition($this->classes[$extends]);
56
                } else {
57
                    if (class_exists($extends, true)) {
58
                        $class->setExtendsClassDefinition(
59
                            new RuntimeClassDefinition(
60
                                new ReflectionClass(
61
                                    $extends
62
                                )
63
                            )
64
                        );
65
                    }
66
                }
67
            }
68 8
        }
69
70 8
        foreach ($this->functions as $function) {
71
            /**
72
             * @todo Configuration
73
             *
74
             * Ignore functions compiling from vendor
75
             */
76
            $checkVendor = strpos($function->getFilepath(), './vendor');
77
            if ($checkVendor !== false && $checkVendor < 3) {
78
                continue;
79
            }
80
81
            $function->compile($context);
82 8
        }
83
84 8
        foreach ($this->classes as $class) {
85
            /**
86
             * @todo Configuration
87
             *
88
             * Ignore Classes compiling from vendor
89
             */
90 8
            $checkVendor = strpos($class->getFilepath(), './vendor');
91 8
            if ($checkVendor !== false && $checkVendor < 3) {
92
                continue;
93
            }
94
95 8
            $class->compile($context);
96 8
        }
97 8
    }
98
99
    /**
100
     * Try to find function with $namespace from pre-compiled function(s)
101
     *
102
     * @param string $name
103
     * @param string|null $namespace
104
     * @return bool|FunctionDefinition
105
     */
106 7
    public function getFunctionNS($name, $namespace = null)
107
    {
108 7
        foreach ($this->functions as $function) {
109
            if ($function->getName() == $name && $function->getNamespace() == $namespace) {
110
                return $function;
111
            }
112 7
        }
113
114 7
        return false;
115
    }
116
117
    /**
118
     * Try to find function from pre-compiled function(s)
119
     *
120
     * @param string $name
121
     * @return bool|FunctionDefinition
122
     */
123
    public function getFunction($name)
124
    {
125
        foreach ($this->functions as $function) {
126
            if ($function->getName() == $name) {
127
                return $function;
128
            }
129
        }
130
131
        return false;
132
    }
133
}
134