@@ 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 |
@@ 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 |