17
17
use ShipMonk \PHPStan \DeadCode \Graph \ClassMemberUsage ;
18
18
use ShipMonk \PHPStan \DeadCode \Graph \ClassMethodRef ;
19
19
use ShipMonk \PHPStan \DeadCode \Graph \ClassMethodUsage ;
20
+ use ShipMonk \PHPStan \DeadCode \Graph \EnumCaseRef ;
21
+ use ShipMonk \PHPStan \DeadCode \Graph \EnumCaseUsage ;
20
22
use ShipMonk \PHPStan \DeadCode \Graph \UsageOrigin ;
21
23
use function array_key_first ;
22
24
use function count ;
@@ -57,6 +59,7 @@ private function processMethodCall(MethodCall $node, Scope $scope): array
57
59
58
60
$ usedConstants = [];
59
61
$ usedMethods = [];
62
+ $ usedEnumCases = [];
60
63
61
64
foreach ($ methodNames as $ methodName ) {
62
65
foreach ($ callerType ->getObjectClassReflections () as $ reflection ) {
@@ -80,6 +83,10 @@ private function processMethodCall(MethodCall $node, Scope $scope): array
80
83
...$ usedMethods ,
81
84
...$ this ->extractMethodsUsedByReflection ($ genericClassName , $ methodName , $ node ->getArgs (), $ node , $ scope ),
82
85
];
86
+ $ usedEnumCases = [
87
+ ...$ usedEnumCases ,
88
+ ...$ this ->extractEnumCasesUsedByReflection ($ genericClassName , $ methodName , $ node ->getArgs (), $ node , $ scope ),
89
+ ];
83
90
}
84
91
}
85
92
}
@@ -88,6 +95,7 @@ private function processMethodCall(MethodCall $node, Scope $scope): array
88
95
return [
89
96
...$ usedConstants ,
90
97
...$ usedMethods ,
98
+ ...$ usedEnumCases ,
91
99
];
92
100
}
93
101
@@ -120,6 +128,35 @@ private function extractConstantsUsedByReflection(
120
128
return $ usedConstants ;
121
129
}
122
130
131
+ /**
132
+ * @param array<Arg> $args
133
+ * @return list<EnumCaseUsage>
134
+ */
135
+ private function extractEnumCasesUsedByReflection (
136
+ ?string $ genericClassName ,
137
+ string $ methodName ,
138
+ array $ args ,
139
+ Node $ node ,
140
+ Scope $ scope
141
+ ): array
142
+ {
143
+ $ usedConstants = [];
144
+
145
+ if ($ methodName === 'getCases ' ) {
146
+ $ usedConstants [] = $ this ->createEnumCaseUsage ($ node , $ scope , $ genericClassName , null );
147
+ }
148
+
149
+ if (($ methodName === 'getCase ' ) && count ($ args ) === 1 ) {
150
+ $ firstArg = $ args [array_key_first ($ args )];
151
+
152
+ foreach ($ scope ->getType ($ firstArg ->value )->getConstantStrings () as $ constantString ) {
153
+ $ usedConstants [] = $ this ->createEnumCaseUsage ($ node , $ scope , $ genericClassName , $ constantString ->getValue ());
154
+ }
155
+ }
156
+
157
+ return $ usedConstants ;
158
+ }
159
+
123
160
/**
124
161
* @param array<Arg> $args
125
162
* @return list<ClassMethodUsage>
@@ -193,6 +230,22 @@ private function createConstantUsage(
193
230
);
194
231
}
195
232
233
+ private function createEnumCaseUsage (
234
+ Node $ node ,
235
+ Scope $ scope ,
236
+ ?string $ className ,
237
+ ?string $ enumCaseName
238
+ ): EnumCaseUsage
239
+ {
240
+ return new EnumCaseUsage (
241
+ UsageOrigin::createRegular ($ node , $ scope ),
242
+ new EnumCaseRef (
243
+ $ className ,
244
+ $ enumCaseName ,
245
+ ),
246
+ );
247
+ }
248
+
196
249
private function createMethodUsage (
197
250
Node $ node ,
198
251
Scope $ scope ,
0 commit comments