GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Branch master (50871a)
by SignpostMarv
04:27
created

CachePublicGettersAndSettersProperty()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 17
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 4

Importance

Changes 0
Metric Value
eloc 10
dl 0
loc 17
ccs 11
cts 11
cp 1
rs 9.9332
c 0
b 0
f 0
cc 4
nc 6
nop 2
crap 4
1
<?php
2
/**
3
* @author SignpostMarv
4
*/
5
declare(strict_types=1);
6
7
namespace SignpostMarv\DaftObject;
8
9
use ReflectionException;
10
use ReflectionMethod;
11
12
class TypeUtilities
13
{
14
    const BOOL_EXPECTING_NON_PUBLIC_METHOD = false;
15
16
    const BOOL_EXPECTING_GETTER = false;
17
18
    const BOOL_DEFAULT_THROWIFNOTIMPLEMENTATION = false;
19
20
    const BOOL_DEFAULT_EXPECTING_NON_PUBLIC_METHOD = true;
21
22
    const BOOL_METHOD_IS_PUBLIC = true;
23
24
    const BOOL_METHOD_IS_NON_PUBLIC = false;
25
26
    const BOOL_DEFAULT_SET_NOT_GET = false;
27
28
    const BOOL_DOES_NOT_HAVE_METHOD = false;
29
30
    const SUPPORTED_INVALID_LEADING_CHARACTERS = [
31
        '@',
32
    ];
33
34
    const BOOL_METHOD_IS_NOT_STATIC = false;
35
36
    /**
37
    * @var array<string, array<string, bool>>
38
    *
39
    * @psalm-var array<class-string<DaftObject>, array<string, bool>>
40
    */
41
    private static $Getters = [];
42
43
    /**
44
    * @var array<string, array<int, string>>
45
    *
46
    * @psalm-var array<class-string<DaftObject>, array<int, string>>
47
    */
48
    private static $publicSetters = [];
49
50
    /**
51
    * @psalm-param class-string<DaftObject> $class
52
    *
53
    * @return array<int, string>
54
    */
55 540
    public static function DaftObjectPublicGetters(string $class) : array
56
    {
57 540
        static::CachePublicGettersAndSetters($class);
58
59 540
        return array_keys(array_filter(self::$Getters[$class]));
60
    }
61
62
    /**
63
    * @psalm-param class-string<DaftObject> $class
64
    *
65
    * @return array<int, string>
66
    */
67 64
    public static function DaftObjectPublicOrProtectedGetters(string $class) : array
68
    {
69 64
        static::CachePublicGettersAndSetters($class);
70
71 64
        return array_keys(self::$Getters[$class]);
72
    }
73
74
    /**
75
    * @psalm-param class-string<DaftObject> $class
76
    */
77 368
    public static function DaftObjectPublicSetters(string $class) : array
78
    {
79 368
        static::CachePublicGettersAndSetters($class);
80
81 368
        return self::$publicSetters[$class];
82
    }
83
84 820
    public static function MethodNameFromProperty(
85
        string $prop,
86
        bool $SetNotGet = self::BOOL_DEFAULT_SET_NOT_GET
87
    ) : string {
88
        if (
89 820
            in_array(
90 820
                mb_substr($prop, 0, 1),
91 820
                self::SUPPORTED_INVALID_LEADING_CHARACTERS,
92 820
                DefinitionAssistant::IN_ARRAY_STRICT_MODE
93
            )
94
        ) {
95 68
            return ($SetNotGet ? 'Alter' : 'Obtain') . ucfirst(mb_substr($prop, 1));
96
        }
97
98 810
        return ($SetNotGet ? 'Set' : 'Get') . ucfirst($prop);
99
    }
100
101 32
    public static function HasMethod(
102
        string $class,
103
        string $property,
104
        bool $SetNotGet,
105
        bool $pub = self::BOOL_DEFAULT_EXPECTING_NON_PUBLIC_METHOD
106
    ) : bool {
107 32
        $method = static::MethodNameFromProperty($property, $SetNotGet);
108
109
        try {
110 32
            $ref = new ReflectionMethod($class, $method);
111
112
            return
113 28
                ($pub ? $ref->isPublic() : $ref->isProtected()) &&
114 28
                self::BOOL_METHOD_IS_NOT_STATIC === $ref->isStatic();
115 8
        } catch (ReflectionException $e) {
116 8
            return self::BOOL_DOES_NOT_HAVE_METHOD;
117
        }
118
    }
119
120
    /**
121
    * @psalm-param class-string<DaftObject> $class
122
    */
123 864
    private static function CachePublicGettersAndSetters(string $class) : void
124
    {
125 864
        if (false === isset(self::$Getters[$class])) {
126 32
            self::$Getters[$class] = [];
127 32
            self::$publicSetters[$class] = [];
128
129
            if (
130 32
                is_a(
131 24
                    $class,
132 32
                    DefinesOwnIdPropertiesInterface::class,
133 32
                    true
134
                )
135
            ) {
136 4
                self::$Getters[$class]['id'] = self::BOOL_METHOD_IS_PUBLIC;
137
            }
138
139
            /**
140
            * @psalm-var class-string<DaftObject>
141
            */
142 32
            $class = $class;
143
144 32
            static::CachePublicGettersAndSettersProperties($class);
145
        }
146 864
    }
147
148
    /**
149
    * @template T as DaftObject
150
    *
151
    * @psalm-param class-string<T> $class
152
    */
153 32
    private static function CachePublicGettersAndSettersProperties(string $class) : void
154
    {
155
        if (
156 32
            is_a($class, AbstractDaftObject::class, true) &&
157 32
            DefinitionAssistant::IsTypeUnregistered($class)
158
        ) {
159
            /**
160
            * @psalm-var class-string<T>
161
            */
162 31
            $class = DefinitionAssistant::RegisterAbstractDaftObjectType($class);
163
        }
164
165
        foreach (
166 32
            DefinitionAssistant::ObtainExpectedProperties($class) as $prop
167
        ) {
168 32
            static::CachePublicGettersAndSettersProperty($class, $prop);
169
        }
170 32
    }
171
172
    /**
173
    * @psalm-param class-string<DaftObject> $class
174
    */
175 32
    private static function CachePublicGettersAndSettersProperty(
176
        string $class,
177
        string $prop
178
    ) : void {
179 32
        if (static::HasMethod($class, $prop, self::BOOL_EXPECTING_GETTER)) {
180 24
            self::$Getters[$class][$prop] = self::BOOL_METHOD_IS_PUBLIC;
181 8
        } elseif (static::HasMethod(
182 6
            $class,
183 4
            $prop,
184 8
            self::BOOL_EXPECTING_GETTER,
185 8
            self::BOOL_EXPECTING_NON_PUBLIC_METHOD
186
        )) {
187 4
            self::$Getters[$class][$prop] = self::BOOL_METHOD_IS_NON_PUBLIC;
188
        }
189
190 32
        if (static::HasMethod($class, $prop, self::BOOL_METHOD_IS_PUBLIC)) {
191 28
            self::$publicSetters[$class][] = $prop;
192
        }
193 32
    }
194
}
195