Completed
Pull Request — master (#38)
by Marco
03:08
created

Comparator::examineMethod()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 37
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 21
nc 4
nop 4
dl 0
loc 37
rs 8.5806
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Roave\ApiCompare;
6
7
use Roave\ApiCompare\Comparator\BackwardsCompatibility\ClassBased\ClassBased;
8
use Roave\ApiCompare\Comparator\BackwardsCompatibility\ClassConstantBased\ConstantBased;
9
use Roave\ApiCompare\Comparator\BackwardsCompatibility\InterfaceBased\InterfaceBased;
10
use Roave\BetterReflection\Reflection\ReflectionClass;
11
use Roave\BetterReflection\Reflector\ClassReflector;
12
use Roave\BetterReflection\Reflector\Exception\IdentifierNotFound;
13
use function sprintf;
14
15
class Comparator
16
{
17
    /** @var ClassBased */
18
    private $classBasedComparisons;
19
20
    /**
21
     * @var InterfaceBased
22
     */
23
    private $interfaceBasedComparisons;
24
25
    public function __construct(
26
        ClassBased $classBasedComparisons,
27
        InterfaceBased $interfaceBasedComparisons
28
    ) {
29
        $this->classBasedComparisons     = $classBasedComparisons;
30
        $this->interfaceBasedComparisons = $interfaceBasedComparisons;
31
    }
32
33
    public function compare(ClassReflector $oldApi, ClassReflector $newApi) : Changes
34
    {
35
        $changelog = Changes::new();
36
37
        foreach ($oldApi->getAllClasses() as $oldClass) {
38
            $changelog = $this->examineClass($changelog, $oldClass, $newApi);
39
        }
40
41
        return $changelog;
42
    }
43
44
    private function examineClass(Changes $changelog, ReflectionClass $oldClass, ClassReflector $newApi) : Changes
45
    {
46
        try {
47
            /** @var ReflectionClass $newClass */
48
            $newClass = $newApi->reflect($oldClass->getName());
49
50
            if ($oldClass->isInterface() && $newClass->isInterface()) {
51
                $changelog = $changelog->mergeWith($this->interfaceBasedComparisons->compare($oldClass, $newClass));
52
            }
53
54
            return $changelog->mergeWith($this->classBasedComparisons->compare($oldClass, $newClass));
55
        } catch (IdentifierNotFound $exception) {
56
            return $changelog->withAddedChange(
57
                Change::removed(sprintf('Class %s has been deleted', $oldClass->getName()), true)
58
            );
59
        }
60
    }
61
}
62