MethodChanged   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 38
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 38
rs 10
c 0
b 0
f 0
wmc 5

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A methods() 0 9 1
A checkSymbols() 0 4 2
A __invoke() 0 3 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Roave\BackwardCompatibility\DetectChanges\BCBreak\ClassBased;
6
7
use Roave\BackwardCompatibility\Change;
8
use Roave\BackwardCompatibility\Changes;
9
use Roave\BackwardCompatibility\DetectChanges\BCBreak\MethodBased\MethodBased;
10
use Roave\BetterReflection\Reflection\ReflectionClass;
11
use Roave\BetterReflection\Reflection\ReflectionMethod;
12
use function array_intersect_key;
13
use function array_keys;
14
use function array_map;
15
use function Safe\array_combine;
16
use function strtolower;
17
18
final class MethodChanged implements ClassBased
19
{
20
    /** @var MethodBased */
21
    private $checkMethod;
22
23
    public function __construct(MethodBased $checkMethod)
24
    {
25
        $this->checkMethod = $checkMethod;
26
    }
27
28
    public function __invoke(ReflectionClass $fromClass, ReflectionClass $toClass) : Changes
29
    {
30
        return Changes::fromIterator($this->checkSymbols($this->methods($fromClass), $this->methods($toClass)));
31
    }
32
33
    /**
34
     * @param ReflectionMethod[] $from
35
     * @param ReflectionMethod[] $to
36
     *
37
     * @return iterable|Change[]
38
     */
39
    private function checkSymbols(array $from, array $to) : iterable
40
    {
41
        foreach (array_keys(array_intersect_key($from, $to)) as $name) {
42
            yield from $this->checkMethod->__invoke($from[$name], $to[$name]);
0 ignored issues
show
Bug Best Practice introduced by
The expression YieldFromNode returns the type Generator which is incompatible with the documented return type Roave\BackwardCompatibility\Change[]|iterable.
Loading history...
43
        }
44
    }
45
46
    /** @return ReflectionMethod[] indexed by lower case method name */
47
    private function methods(ReflectionClass $class) : array
48
    {
49
        $methods = $class->getMethods();
50
51
        return array_combine(
52
            array_map(static function (ReflectionMethod $method) : string {
53
                return strtolower($method->getName());
54
            }, $methods),
55
            $methods
56
        );
57
    }
58
}
59