Code Duplication    Length = 82-82 lines in 2 locations

src/PHPSemVerChecker/Analyzer/ClassAnalyzer.php 1 location

@@ 11-92 (lines=82) @@
8
use PHPSemVerChecker\Registry\Registry;
9
use PHPSemVerChecker\Report\Report;
10
11
class ClassAnalyzer {
12
	protected $context = 'class';
13
14
	public function analyze(Registry $registryBefore, Registry $registryAfter)
15
	{
16
		$report = new Report();
17
18
		$classesBefore = $registryBefore->data['class'];
19
		$classesAfter = $registryAfter->data['class'];
20
21
		$classesBeforeKeyed = [];
22
		$mappingsBeforeKeyed = [];
23
		foreach($classesBefore as $key => $classBefore)
24
		{
25
			$classesBeforeKeyed[strtolower($classBefore->name)] = $classBefore;
26
			$mappingsBeforeKeyed[strtolower($classBefore->name)] = $registryBefore->mapping['class'][$key];
27
		}
28
29
		$classesAfterKeyed = [];
30
		$mappingsAfterKeyed = [];
31
		foreach($classesAfter as $key => $classAfter)
32
		{
33
			$classesAfterKeyed[strtolower($classAfter->name)] = $classAfter;
34
			$mappingsAfterKeyed[strtolower($classAfter->name)] = $registryAfter->mapping['class'][$key];
35
		}
36
37
		$classNamesBefore = array_keys($classesBeforeKeyed);
38
		$classNamesAfter = array_keys($classesAfterKeyed);
39
		$added = array_diff($classNamesAfter, $classNamesBefore);
40
		$removed = array_diff($classNamesBefore, $classNamesAfter);
41
		$toVerify = array_intersect($classNamesBefore, $classNamesAfter);
42
43
		foreach ($removed as $key) {
44
			$fileBefore = $mappingsBeforeKeyed[$key];
45
			$classBefore = $classesBeforeKeyed[$key];
46
47
			$data = new ClassRemoved($fileBefore, $classBefore);
48
			$report->addClass($data);
49
		}
50
51
		foreach ($toVerify as $key) {
52
			$fileBefore = $mappingsBeforeKeyed[$key];
53
			/** @var \PhpParser\Node\Stmt\Class_ $classBefore */
54
			$classBefore = $classesBeforeKeyed[$key];
55
			$fileAfter = $mappingsAfterKeyed[$key];
56
			/** @var \PhpParser\Node\Stmt\Class_ $classBefore */
57
			$classAfter = $classesAfterKeyed[$key];
58
59
			// Leave non-strict comparison here
60
			if ($classBefore != $classAfter) {
61
62
				// Check for case change of class name
63
				if(
64
					$classBefore->name !== $classAfter->name
65
					&& strtolower($classBefore->name) === strtolower($classAfter->name)
66
				) {
67
					$report->add($this->context, new ClassRenamedCaseOnly($fileAfter, $classAfter));
68
				}
69
70
				$analyzers = [
71
					new ClassMethodAnalyzer('class', $fileBefore, $fileAfter),
72
					new PropertyAnalyzer('class', $fileBefore, $fileAfter),
73
				];
74
75
				foreach ($analyzers as $analyzer) {
76
					$internalReport = $analyzer->analyze($classBefore, $classAfter);
77
					$report->merge($internalReport);
78
				}
79
			}
80
		}
81
82
		foreach ($added as $key) {
83
			$fileAfter = $mappingsAfterKeyed[$key];
84
			$classAfter = $classesAfterKeyed[$key];
85
86
			$data = new ClassAdded($fileAfter, $classAfter);
87
			$report->addClass($data);
88
		}
89
90
		return $report;
91
	}
92
}
93

src/PHPSemVerChecker/Analyzer/TraitAnalyzer.php 1 location

@@ 11-92 (lines=82) @@
8
use PHPSemVerChecker\Registry\Registry;
9
use PHPSemVerChecker\Report\Report;
10
11
class TraitAnalyzer {
12
	protected $context = 'trait';
13
14
	public function analyze(Registry $registryBefore, Registry $registryAfter)
15
	{
16
		$report = new Report();
17
18
		$traitsBefore = $registryBefore->data['trait'];
19
		$traitsAfter = $registryAfter->data['trait'];
20
21
		$traitsBeforeKeyed = [];
22
		$mappingsBeforeKeyed = [];
23
		foreach($traitsBefore as $key => $traitBefore)
24
		{
25
			$traitsBeforeKeyed[strtolower($traitBefore->name)] = $traitBefore;
26
			$mappingsBeforeKeyed[strtolower($traitBefore->name)] = $registryBefore->mapping['trait'][$key];
27
		}
28
29
		$traitsAfterKeyed = [];
30
		$mappingsAfterKeyed = [];
31
		foreach($traitsAfter as $key => $traitAfter)
32
		{
33
			$traitsAfterKeyed[strtolower($traitAfter->name)] = $traitAfter;
34
			$mappingsAfterKeyed[strtolower($traitAfter->name)] = $registryAfter->mapping['trait'][$key];
35
		}
36
37
		$traitNamesBefore = array_keys($traitsBeforeKeyed);
38
		$traitNamesAfter = array_keys($traitsAfterKeyed);
39
		$added = array_diff($traitNamesAfter, $traitNamesBefore);
40
		$removed = array_diff($traitNamesBefore, $traitNamesAfter);
41
		$toVerify = array_intersect($traitNamesBefore, $traitNamesAfter);
42
43
		foreach ($removed as $key) {
44
			$fileBefore = $mappingsBeforeKeyed[$key];
45
			$traitBefore = $traitsBeforeKeyed[$key];
46
47
			$data = new TraitRemoved($fileBefore, $traitBefore);
48
			$report->addTrait($data);
49
		}
50
51
		foreach ($toVerify as $key) {
52
			$fileBefore = $mappingsBeforeKeyed[$key];
53
			/** @var \PhpParser\Node\Stmt\Class_ $traitBefore */
54
			$traitBefore = $traitsBeforeKeyed[$key];
55
			$fileAfter = $mappingsAfterKeyed[$key];
56
			/** @var \PhpParser\Node\Stmt\Class_ $traitBefore */
57
			$traitAfter = $traitsAfterKeyed[$key];
58
59
			// Leave non-strict comparison here
60
			if ($traitBefore != $traitAfter) {
61
62
				// Check for name case change.
63
				if(
64
					$traitBefore->name !== $traitAfter->name
65
					&& strtolower($traitBefore->name) === strtolower($traitAfter->name)
66
				) {
67
					$report->add($this->context, new TraitRenamedCaseOnly($fileAfter, $traitAfter));
68
				}
69
70
				$analyzers = [
71
					new ClassMethodAnalyzer('trait', $fileBefore, $fileAfter),
72
					new PropertyAnalyzer('trait', $fileBefore, $fileAfter),
73
				];
74
75
				foreach ($analyzers as $analyzer) {
76
					$internalReport = $analyzer->analyze($traitBefore, $traitAfter);
77
					$report->merge($internalReport);
78
				}
79
			}
80
		}
81
82
		foreach ($added as $key) {
83
			$fileAfter = $mappingsAfterKeyed[$key];
84
			$traitAfter = $traitsAfter[$key];
85
86
			$data = new TraitAdded($fileAfter, $traitAfter);
87
			$report->addTrait($data);
88
		}
89
90
		return $report;
91
	}
92
}
93