MethodVisibilityReduced   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 41
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 20
dl 0
loc 41
rs 10
c 0
b 0
f 0
wmc 5

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __invoke() 0 19 2
A methodVisibility() 0 11 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Roave\BackwardCompatibility\DetectChanges\BCBreak\MethodBased;
6
7
use Roave\BackwardCompatibility\Change;
8
use Roave\BackwardCompatibility\Changes;
9
use Roave\BetterReflection\Reflection\ReflectionMethod;
10
use function Safe\sprintf;
11
12
final class MethodVisibilityReduced implements MethodBased
13
{
14
    private const VISIBILITY_PRIVATE = 'private';
15
16
    private const VISIBILITY_PROTECTED = 'protected';
17
18
    private const VISIBILITY_PUBLIC = 'public';
19
20
    public function __invoke(ReflectionMethod $fromMethod, ReflectionMethod $toMethod) : Changes
21
    {
22
        $visibilityFrom = $this->methodVisibility($fromMethod);
23
        $visibilityTo   = $this->methodVisibility($toMethod);
24
25
        // Works because private, protected and public are sortable:
26
        if ($visibilityFrom <= $visibilityTo) {
27
            return Changes::empty();
28
        }
29
30
        return Changes::fromList(Change::changed(
31
            sprintf(
32
                'Method %s() of class %s visibility reduced from %s to %s',
33
                $fromMethod->getName(),
34
                $fromMethod->getDeclaringClass()->getName(),
35
                $visibilityFrom,
36
                $visibilityTo
37
            ),
38
            true
39
        ));
40
    }
41
42
    private function methodVisibility(ReflectionMethod $method) : string
43
    {
44
        if ($method->isPublic()) {
45
            return self::VISIBILITY_PUBLIC;
46
        }
47
48
        if ($method->isProtected()) {
49
            return self::VISIBILITY_PROTECTED;
50
        }
51
52
        return self::VISIBILITY_PRIVATE;
53
    }
54
}
55