Passed
Push — master ( 54b931...b32b47 )
by Observer
01:26
created

EngineAdditions::compile()   B

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
			case 'name':
83
				try
84
				{
85
					return $this->getProperty ('Name');
86
				}
87
				
88
				catch (\WinformsException $e)
89
				{
90
					return $this->name;
91
				}
92
			break;
93
        }
94
95
        if (method_exists ($this, $method = 'get_'. $name))
96
            return $this->$method ();
97
98
        return isset ($this->$name) ?
99
            $this->$name : EngineAdditions::coupleSelector ($this->getProperty ($name));
100
    }
101
102
    public function __set (string $name, $value): void
103
    {
104
        if (substr ($name, -5) == 'Event')
105
            Events::setEvent ($this->selector, substr ($name, 0, -5), $value);
106
107
        elseif (method_exists ($this, $method = 'set_'. $name))
108
            $this->$method ($value);
109
			
110
		elseif (strtolower ($name) == 'name')
111
		{
112
			try
113
			{
114
				$this->setProperty ($name, $value);
115
			}
116
			
117
			catch (\WinformsException $e)
118
			{
119
				$this->name = $value;
120
			}
121
		}
122
        
123
        else $this->setProperty ($name, EngineAdditions::uncoupleSelector ($value));
124
    }
125
126
    public function __call (string $name, array $args)
127
    {
128
        return EngineAdditions::coupleSelector ($this->callMethod ($name,
129
            array_map ('VoidEngine\\EngineAdditions::uncoupleSelector', $args)));
130
    }
131
132
    # Управление VoidCore
133
134
    protected function getProperty ($name)
135
    {
136
        return VoidCore::getProperty ($this->selector, $name);
137
    }
138
139
    protected function setProperty (string $name, $value): void
140
    {
141
        VoidCore::setProperty ($this->selector, $name, $value);
142
    }
143
144
    protected function callMethod (string $name, array $args = [])
145
    {
146
        return VoidCore::callMethod ($this->selector, $name, ...$args);
147
    }
148
149
    # ArrayAccess
150
151
    public function offsetSet ($index, $value)
152
	{
153
        try
154
        {
155
            $index === null ?
156
                $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

156
                $this->callMethod ('Add', /** @scrutinizer ignore-type */ EngineAdditions::uncoupleSelector ($value)) :
Loading history...
157
                $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

157
                $this->/** @scrutinizer ignore-call */ 
158
                       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...
158
        }
159
160
        catch (\Throwable $e)
161
        {
162
            $index === null ?
163
                VoidCore::setArrayValue ($this->selector, $this->count, EngineAdditions::uncoupleSelector ($value)) :
164
                VoidCore::setArrayValue ($this->selector, $index, EngineAdditions::uncoupleSelector ($value));
165
        }
166
    }
167
	
168
	public function offsetGet ($index)
169
	{
170
		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

170
		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...
171
    }
172
	
173
	public function offsetUnset ($index): void
174
	{
175
		$this->callMethod ('RemoveAt', $index);
176
    }
177
    
178
    public function offsetExists ($index): bool
179
    {
180
        try
181
        {
182
            $this->offsetGet ($index);
183
        }
184
185
        catch (\WinformsException $e)
186
        {
187
            return false;
188
        }
189
190
        return true;
191
    }
192
193
    # Итерация массивов
194
195
    public function foreach (callable $callback, string $type = null): void
196
    {
197
        $size = $this->count;
198
199
        for ($i = 0; $i < $size; ++$i)
200
            $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

200
            $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...
201
    }
202
203
    public function where (callable $comparator, string $type = null): array
204
    {
205
        $size   = $this->count;
206
        $return = [];
207
208
        for ($i = 0; $i < $size; ++$i)
209
            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

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