Completed
Push — master ( 28368b...f9f779 )
by Дмитрий
05:23 queued 02:40
created

Compiler::getFunctionNS()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 5
c 0
b 0
f 0
nc 3
nop 2
dl 0
loc 10
ccs 0
cts 6
cp 0
crap 20
rs 9.2
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
    public function getFunctionNS($name, $namespace = null)
107
    {
108
        foreach ($this->functions as $function) {
109
            if ($function->getName() == $name && $function->getNamespace() == $namespace) {
110
                return $function;
111
            }
112
        }
113
114
        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