EngineAdditions::compile()   B
last analyzed

Complexity

Conditions 8
Paths 128

Size

Total Lines 24
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 15
c 1
b 0
f 0
dl 0
loc 24
rs 8.2111
cc 8
nc 128
nop 12

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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