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

Compiler::compile()   C

Complexity

Conditions 11
Paths 45

Size

Total Lines 54
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 30.9561

Importance

Changes 2
Bugs 1 Features 0
Metric Value
cc 11
eloc 23
c 2
b 1
f 0
nc 45
nop 1
dl 0
loc 54
ccs 14
cts 31
cp 0.4516
crap 30.9561
rs 6.6153

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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