Completed
Pull Request — master (#99)
by
unknown
02:17
created

InterfaceAnalyzer   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 91
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 7

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 8
lcom 0
cbo 7
dl 0
loc 91
ccs 55
cts 55
cp 1
rs 10
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
C analyze() 0 79 8
1
<?php
2
3
namespace PHPSemVerChecker\Analyzer;
4
5
use PHPSemVerChecker\Operation\InterfaceAdded;
6
use PHPSemVerChecker\Operation\InterfaceRemoved;
7
use PHPSemVerChecker\Operation\InterfaceCaseChanged;
8
use PHPSemVerChecker\Registry\Registry;
9
use PHPSemVerChecker\Report\Report;
10
11
class InterfaceAnalyzer {
12
	/**
13
	 * @var string
14
	 */
15
	protected $context = 'interface';
16
17
	/**
18
	 * @param \PHPSemVerChecker\Registry\Registry $registryBefore
19
	 * @param \PHPSemVerChecker\Registry\Registry $registryAfter
20
	 * @return \PHPSemVerChecker\Report\Report
21
	 */
22 5
	public function analyze(Registry $registryBefore, Registry $registryAfter)
23
	{
24 5
		$report = new Report();
25
26 5
		$interfacesBefore = $registryBefore->data['interface'];
27 5
		$interfacesAfter = $registryAfter->data['interface'];
28
29 5
		$interfacesBeforeKeyed = [];
30 5
		$filesBeforeKeyed = [];
31 5
		foreach($interfacesBefore as $key => $interfaceBefore)
32
		{
33 3
			$interfacesBeforeKeyed[strtolower($interfaceBefore->name)] = $interfaceBefore;
34 3
			$filesBeforeKeyed[strtolower($interfaceBefore->name)] = $registryBefore->mapping['interface'][$key];
35 5
		}
36
37 5
		$interfacesAfterKeyed = [];
38 5
		$filesAfterKeyed = [];
39 5
		foreach($interfacesAfter as $key => $interfaceAfter)
40
		{
41 3
			$interfacesAfterKeyed[strtolower($interfaceAfter->name)] = $interfaceAfter;
42 3
			$filesAfterKeyed[strtolower($interfaceAfter->name)] = $registryAfter->mapping['interface'][$key];
43 5
		}
44
45 5
		$interfaceNamesBefore = array_keys($interfacesBeforeKeyed);
46 5
		$interfaceNamesAfter = array_keys($interfacesAfterKeyed);
47 5
		$added = array_diff($interfaceNamesAfter, $interfaceNamesBefore);
48 5
		$removed = array_diff($interfaceNamesBefore, $interfaceNamesAfter);
49 5
		$toVerify = array_intersect($interfaceNamesBefore, $interfaceNamesAfter);
50
51 5
		foreach ($removed as $key) {
52 1
			$fileBefore = $filesBeforeKeyed[$key];
53 1
			$interfaceBefore = $interfacesBeforeKeyed[$key];
54
55 1
			$data = new InterfaceRemoved($fileBefore, $interfaceBefore);
56 1
			$report->addInterface($data);
57 5
		}
58
59 5
		foreach ($toVerify as $key) {
60 2
			$fileBefore = $filesBeforeKeyed[$key];
61
			/** @var \PhpParser\Node\Stmt\Interface_ $interfaceBefore */
62 2
			$interfaceBefore = $interfacesBeforeKeyed[$key];
63 2
			$fileAfter = $filesAfterKeyed[$key];
64
			/** @var \PhpParser\Node\Stmt\Interface_ $interfaceBefore */
65 2
			$interfaceAfter = $interfacesAfterKeyed[$key];
66
67
			// Leave non-strict comparison here
68 2
			if ($interfaceBefore != $interfaceAfter) {
69
70
				// Check if the name of the interface has changed case.
71
				// If we entered this section then the normalized names (lowercase) were equal.
72 1
				if ($interfaceBefore->name !== $interfaceAfter->name) {
73 1
					$report->add(
74 1
						'interface',
75 1
						new InterfaceCaseChanged(
76 1
							$fileBefore,
77 1
							$interfaceBefore,
78 1
							$fileAfter,
79
							$interfaceAfter
80 1
						)
81 1
					);
82 1
				}
83
84 1
				$analyzer = new ClassMethodAnalyzer('interface', $fileBefore, $fileAfter);
85 1
				$interfaceMethodReport = $analyzer->analyze($interfaceBefore, $interfaceAfter);
86 1
				$report->merge($interfaceMethodReport);
87 1
			}
88 5
		}
89
90 5
		foreach ($added as $key) {
91
92 1
			$fileAfter = $filesAfterKeyed[$key];
93 1
			$interfaceAfter = $interfacesAfterKeyed[$key];
94
95 1
			$data = new InterfaceAdded($fileAfter, $interfaceAfter);
96 1
			$report->addInterface($data);
97 5
		}
98
99 5
		return $report;
100
	}
101
}
102