Code Duplication    Length = 94-96 lines in 2 locations

src/PHPSemVerChecker/Analyzer/ClassAnalyzer.php 1 location

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

src/PHPSemVerChecker/Analyzer/TraitAnalyzer.php 1 location

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