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

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