Signature::analyze()   C
last analyzed

Complexity

Conditions 15
Paths 153

Size

Total Lines 56

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 25
CRAP Score 15

Importance

Changes 0
Metric Value
dl 0
loc 56
ccs 25
cts 25
cp 1
rs 5.475
c 0
b 0
f 0
cc 15
nc 153
nop 2
crap 15

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 PHPSemVerChecker\Comparator;
4
5
class Signature
6
{
7
	/**
8
	 * @param array $parametersA
9
	 * @param array $parametersB
10
	 * @return array
11
	 */
12 82
	public static function analyze(array $parametersA, array $parametersB)
13
	{
14
		$changes = [
15 82
			'parameter_added'                 => false,
16
			'parameter_removed'               => false,
17
			'parameter_renamed'               => false,
18
			'parameter_typing_added'          => false,
19
			'parameter_typing_removed'        => false,
20
			'parameter_default_added'         => false,
21
			'parameter_default_removed'       => false,
22
			'parameter_default_value_changed' => false,
23
		];
24 82
		$lengthA = count($parametersA);
25 82
		$lengthB = count($parametersB);
26
27
		// TODO([email protected]): This is only true if newer params do not have defaults
28 82
		if ($lengthA < $lengthB) {
29 10
			$changes['parameter_added'] = true;
30 72
		} elseif ($lengthA > $lengthB) {
31 8
			$changes['parameter_removed'] = true;
32
		}
33
34 82
		$iterations = min($lengthA, $lengthB);
35 82
		for ($i = 0; $i < $iterations; ++$i) {
36
			// Name checking
37 67
			if ($parametersA[$i]->var->name !== $parametersB[$i]->var->name) {
38 11
				$changes['parameter_renamed'] = true;
39
			}
40
41
			// Type checking
42 67
			if (Type::get($parametersA[$i]->type) !== Type::get($parametersB[$i]->type)) {
43
				//if ($paramsA[$i]->default !== null && $paramsB[$i]->default !== null) {
44
				//	$changes['parameter_default_value_changed'] = true;
45 16
				if ($parametersA[$i]->type !== null) {
46 8
					$changes['parameter_typing_removed'] = true;
47
				}
48 16
				if ($parametersB[$i]->type !== null) {
49 8
					$changes['parameter_typing_added'] = true;
50
				}
51
			}
52
53
			// Default checking
54 67
			if ($parametersA[$i]->default === null && $parametersB[$i]->default === null) {
55
				// Do nothing
56 24
			} elseif ($parametersA[$i]->default !== null && $parametersB[$i]->default === null) {
57 8
				$changes['parameter_default_removed'] = true;
58 16
			} elseif ($parametersA[$i]->default === null && $parametersB[$i]->default !== null) {
59 8
				$changes['parameter_default_added'] = true;
60
				// TODO([email protected]): Not all nodes have a value property
61 8
			} elseif ( ! Node::isEqual($parametersA[$i]->default, $parametersB[$i]->default)) {
62 8
				$changes['parameter_default_value_changed'] = true;
63
			}
64
		}
65
66 82
		return $changes;
67
	}
68
}
69