Passed
Push — master ( 895563...af6f8b )
by Observer
01:38
created

NetObject::__get()   B

Complexity

Conditions 11
Paths 10

Size

Total Lines 51
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 29
c 1
b 0
f 0
dl 0
loc 51
rs 7.3166
cc 11
nc 10
nop 1

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
namespace VoidEngine;
4
5
use VoidCore;
6
7
class NetObject implements \ArrayAccess
8
{
9
    protected int $selector = 0;
10
    protected ?string $name = null;
11
    // protected bool $isCollection = false;
12
13
    public function __construct ($name, $assembly = false, ...$args)
14
    {
15
        foreach ($args as $id => $arg)
16
            $args[$id] = EngineAdditions::uncoupleSelector ($arg);
17
        
18
        if (is_int ($name) && VoidCore::objectExists ($name))
19
            $this->selector = $name;
20
21
        elseif (is_string ($name))
22
            $this->selector = VoidCore::createObject ($name, $assembly, ...$args);
23
24
        else throw new \Exception ('Incorrect params passed');
25
26
        /*$this->isCollection = $this->getType ()
27
            ->isSubclassOf (VoidCore::typeof ('System.Collectons.Generic.ICollection'));*/
28
    }
29
30
    public function dispose (): void
31
    {
32
        VoidCore::removeObjects ($this->selector);
33
    }
34
35
    # Основные магические методы
36
37
    public function __get (string $name)
38
    {
39
        switch (strtolower ($name))
40
        {
41
            case 'count':
42
            case 'length':
43
                try
44
                {
45
                    return $this->getProperty ('Count');
46
                }
47
48
                catch (\WinformsException $e)
49
                {
50
                    return $this->getProperty ('Length');
51
                }
52
            break;
53
54
            case 'list':
55
                $size = $this->count;
56
                $list = [];
57
                
58
				for ($i = 0; $i < $size; ++$i)
59
                    $list[] = EngineAdditions::coupleSelector (VoidCore::getArrayValue ($this->selector, $i));
60
                
61
                return $list;
62
            break;
63
64
            case 'names':
65
                $size  = $this->count;
66
                $names = [];
67
                
68
                for ($i = 0; $i < $size; ++$i)
69
                    try
70
                    {
71
                        $names[] = VoidCore::getProperty (VoidCore::getArrayValue ($this->selector, [$i, VC_OBJECT]), 'Text');
72
                    }
73
74
                    catch (\WinformsException $e)
75
                    {
76
                        $names[] = VoidCore::getArrayValue ($this->selector, [$i, VC_STRING]);
77
                    }
78
                
79
                return $names;
80
            break;
81
        }
82
83
        if (method_exists ($this, $method = 'get_'. $name))
84
            return $this->$method ();
85
86
        return isset ($this->$name) ?
87
            $this->$name : EngineAdditions::coupleSelector ($this->getProperty ($name));
88
    }
89
90
    public function __set (string $name, $value): void
91
    {
92
        if (substr ($name, -5) == 'Event')
93
            Events::setEvent ($this->selector, substr ($name, 0, -5), $value);
94
95
        elseif (method_exists ($this, $method = 'set_'. $name))
96
            $this->$method ($value);
97
        
98
        else $this->setProperty ($name, EngineAdditions::uncoupleSelector ($value));
99
    }
100
101
    public function __call (string $name, array $args)
102
    {
103
        return EngineAdditions::coupleSelector ($this->callMethod ($name,
104
            array_map ('VoidEngine\\EngineAdditions::uncoupleSelector', $args)));
105
    }
106
107
    # Управление VoidCore
108
109
    protected function getProperty ($name)
110
    {
111
        return VoidCore::getProperty ($this->selector, $name);
112
    }
113
114
    protected function setProperty (string $name, $value): void
115
    {
116
        VoidCore::setProperty ($this->selector, $name, $value);
117
    }
118
119
    protected function callMethod (string $name, array $args = [])
120
    {
121
        return VoidCore::callMethod ($this->selector, $name, ...$args);
122
    }
123
124
    # ArrayAccess
125
126
    public function offsetSet ($index, $value)
127
	{
128
        try
129
        {
130
            $index === null ?
131
                $this->callMethod ('Add', EngineAdditions::uncoupleSelector ($value)) :
0 ignored issues
show
Bug introduced by
It seems like VoidEngine\EngineAdditio...ncoupleSelector($value) can also be of type integer; however, parameter $args of VoidEngine\NetObject::callMethod() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

131
                $this->callMethod ('Add', /** @scrutinizer ignore-type */ EngineAdditions::uncoupleSelector ($value)) :
Loading history...
132
                $this->callMethod ('Insert', $index, EngineAdditions::uncoupleSelector ($value));
0 ignored issues
show
Unused Code introduced by
The call to VoidEngine\NetObject::callMethod() has too many arguments starting with VoidEngine\EngineAdditio...ncoupleSelector($value). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

132
                $this->/** @scrutinizer ignore-call */ 
133
                       callMethod ('Insert', $index, EngineAdditions::uncoupleSelector ($value));

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
133
        }
134
135
        catch (\Throwable $e)
136
        {
137
            $index === null ?
138
                VoidCore::setArrayValue ($this->selector, $this->count, EngineAdditions::uncoupleSelector ($value)) :
139
                VoidCore::setArrayValue ($this->selector, $index, EngineAdditions::uncoupleSelector ($value));
140
        }
141
    }
142
	
143
	public function offsetGet ($index)
144
	{
145
		return EngineAdditions::coupleSelector (VoidCore::getArrayValue ($this->selector, $index), $this->selector);
0 ignored issues
show
Unused Code introduced by
The call to VoidEngine\EngineAdditions::coupleSelector() has too many arguments starting with $this->selector. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

145
		return EngineAdditions::/** @scrutinizer ignore-call */ coupleSelector (VoidCore::getArrayValue ($this->selector, $index), $this->selector);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
146
    }
147
	
148
	public function offsetUnset ($index): void
149
	{
150
		$this->callMethod ('RemoveAt', $index);
151
    }
152
    
153
    public function offsetExists ($index): bool
154
    {
155
        try
156
        {
157
            $this->offsetGet ($index);
158
        }
159
160
        catch (\WinformsException $e)
161
        {
162
            return false;
163
        }
164
165
        return true;
166
    }
167
168
    # Итерация массивов
169
170
    public function foreach (callable $callback, string $type = null): void
171
    {
172
        $size = $this->count;
173
174
        for ($i = 0; $i < $size; ++$i)
175
            $callback (EngineAdditions::coupleSelector (VoidCore::getArrayValue ($this->selector, $type !== null ? [$i, $type] : $i), $this->selector), $i);
0 ignored issues
show
Unused Code introduced by
The call to VoidEngine\EngineAdditions::coupleSelector() has too many arguments starting with $this->selector. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

175
            $callback (EngineAdditions::/** @scrutinizer ignore-call */ coupleSelector (VoidCore::getArrayValue ($this->selector, $type !== null ? [$i, $type] : $i), $this->selector), $i);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
176
    }
177
178
    public function where (callable $comparator, string $type = null): array
179
    {
180
        $size   = $this->count;
181
        $return = [];
182
183
        for ($i = 0; $i < $size; ++$i)
184
            if ($comparator ($value = EngineAdditions::coupleSelector (VoidCore::getArrayValue ($this->selector, $type !== null ? [$i, $type] : $i), $this->selector), $i))
0 ignored issues
show
Unused Code introduced by
The call to VoidEngine\EngineAdditions::coupleSelector() has too many arguments starting with $this->selector. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

184
            if ($comparator ($value = EngineAdditions::/** @scrutinizer ignore-call */ coupleSelector (VoidCore::getArrayValue ($this->selector, $type !== null ? [$i, $type] : $i), $this->selector), $i))

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
185
                $return[] = $value;
186
187
        return $return;
188
    }
189
190
    # Магические методы
191
192
    public function __destruct ()
193
    {
194
        VoidCore::destructObject ($this->selector);
195
    }
196
197
    public function __toString (): string
198
    {
199
        return $this->selector;
200
    }
201
202
    public function __debugInfo (): array
203
    {
204
        $info = ['selector' => $this->selector];
205
206
        try
207
        {
208
            $info['name'] = $this->getProperty ('Name');
209
        }
210
211
        catch (\WinformsException $e) {}
212
213
        try
214
        {
215
            $info['info'] = $this->callMethod ('ToString');
216
        }
217
218
        catch (\WinformsException $e) {}
219
220
        return $info;
221
    }
222
}
223
224
class NetClass extends NetObject
225
{
226
    public function __construct ($name, $assembly = false)
227
    {
228
        if (is_int ($name) && VoidCore::objectExists ($name))
229
            $this->selector = $name;
230
231
        elseif (is_string ($name))
232
            $this->selector = VoidCore::getClass ($name, $assembly);
233
234
        else throw new \Exception ('Incorrect params passed');
235
    }
236
}
237
238
class EngineAdditions
239
{
240
	/**
241
     * * Компиляция PHP кода
242
     * 
243
     * TODO: дополнить описание
244
     * 
245
     * @param string $savePath - путь для компиляции
246
     * @param string $iconPath - путь до иконки
247
     * @param string $phpCode - код для компиляции без тэгов
248
     * 
249
     * [@param string $productDescription = null] - описание приложения
250
     * [@param string $productName = null]        - название приложения
251
     * [@param string $productVersion = null]     - версия приложения
252
     * [@param string $companyName = null]        - компания-производителя
253
     * [@param string $copyright = null]          - копирайт
254
     * [@param string $callSharpCode = '']        - чистый C# код
255
     * [@param string $declareSharpCode = '']     - C# код с объявлениями классов
256
     * 
257
     * @return array - возвращает список ошибок компиляции
258
     */
259
    public static function compile (string $savePath, string $iconPath, string $phpCode, string $productDescription = null, string $productName = null, string $productVersion = null, string $companyName = null, string $copyright = null, string $callSharpCode = '', string $declareSharpCode = '', NetObject $dictionary = null, NetObject $assemblies = null): array
260
    {
261
        if ($dictionary === null)
262
            $dictionary = new NetObject ('System.Collections.Generic.Dictionary`2[System.String,System.String]', null);
263
264
        if ($assemblies === null)
265
            $assemblies = dnArray ('System.String', []);
266
267
        if ($productName === null)
268
            $productName = basenameNoExt ($savePath);
269
270
        if ($productDescription === null)
271
            $productDescription = $productName;
272
273
        if ($productVersion === null)
274
            $productVersion = '1.0';
275
276
        if ($companyName === null)
277
            $companyName = 'Company N';
278
279
        if ($copyright === null)
280
            $copyright = $companyName .' copyright (c) '. date ('Y');
281
282
        return (new NetClass ('WinForms_PHP.WFCompiler', null))->compile ($savePath, $iconPath, $phpCode, $productDescription, $productName, $productVersion, $companyName, $copyright, $callSharpCode, $declareSharpCode, $dictionary, $assemblies)->names;
283
    }
284
285
    public static function loadModule (string $path): bool
286
    {
287
        try
288
        {
289
            (new NetClass ('System.Reflection.Assembly', 'mscorlib'))->loadFrom ($path);
290
        }
291
292
        catch (\WinformsException $e)
293
        {
294
            return false;
295
        }
296
297
        return true;
298
    }
299
	
300
    public static function coupleSelector ($selector)
301
    {
302
        return is_int ($selector) && VoidCore::objectExists ($selector) ?
303
            new NetObject ($selector) : $selector;
304
    }
305
306
    public static function uncoupleSelector ($object)
307
    {
308
        return is_object ($object) && $object instanceof NetObject ?
309
            $object->selector : $object;
310
    }
311
}
312