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