40
40
*/
41
41
public function build (Filter $ filter , FileAnalyser $ analyser ): array
42
42
{
43
+ /**
44
+ * @var array<non-empty-string, Class_> $classDetails
45
+ */
46
+ $ classDetails = [];
47
+
43
48
$ namespaces = [];
44
49
$ classes = [];
45
- $ classDetails = [];
46
50
$ classesThatExtendClass = [];
47
51
$ classesThatImplementInterface = [];
48
52
$ traits = [];
@@ -122,7 +126,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array
122
126
$ this ->processMethods ($ class , $ file , $ methods , $ reverseLookup );
123
127
124
128
$ classesThatExtendClass [$ class ->namespacedName ()] = [];
125
- $ classDetails [] = $ class ;
129
+ $ classDetails [$ class -> namespacedName ()] = $ class ;
126
130
}
127
131
128
132
foreach ($ analyser ->functionsIn ($ file ) as $ function ) {
@@ -153,19 +157,15 @@ public function build(Filter $filter, FileAnalyser $analyser): array
153
157
$ this ->process ($ classesThatImplementInterface , $ interfaceName , $ class ->file (), $ class ->startLine (), $ class ->endLine ());
154
158
}
155
159
156
- if (!$ class ->hasParent ()) {
157
- continue ;
158
- }
159
-
160
- if (isset ($ classes [$ class ->parentClass ()])) {
160
+ foreach ($ this ->parentClasses ($ classDetails , $ class ) as $ parentClass ) {
161
161
$ classes [$ class ->namespacedName ()] = array_merge_recursive (
162
162
$ classes [$ class ->namespacedName ()],
163
- $ classes [$ class -> parentClass ()],
163
+ $ classes [$ parentClass -> namespacedName ()],
164
164
);
165
- }
166
165
167
- if (isset ($ classesThatExtendClass [$ class ->parentClass ()])) {
168
- $ this ->process ($ classesThatExtendClass , $ class ->parentClass (), $ class ->file (), $ class ->startLine (), $ class ->endLine ());
166
+ if (isset ($ classesThatExtendClass [$ parentClass ->namespacedName ()])) {
167
+ $ this ->process ($ classesThatExtendClass , $ parentClass ->namespacedName (), $ class ->file (), $ class ->startLine (), $ class ->endLine ());
168
+ }
169
169
}
170
170
}
171
171
@@ -185,6 +185,15 @@ public function build(Filter $filter, FileAnalyser $analyser): array
185
185
unset($ classesThatExtendClass [$ className ]);
186
186
}
187
187
188
+ /**
189
+ * @todo Avoid duplication and remove this loop
190
+ */
191
+ foreach (array_keys ($ classes ) as $ className ) {
192
+ foreach (array_keys ($ classes [$ className ]) as $ file ) {
193
+ $ classes [$ className ][$ file ] = array_unique ($ classes [$ className ][$ file ]);
194
+ }
195
+ }
196
+
188
197
return [
189
198
'namespaces ' => $ namespaces ,
190
199
'traits ' => $ traits ,
@@ -252,4 +261,25 @@ private function process(array &$data, string $unit, string $file, int $startLin
252
261
range ($ startLine , $ endLine ),
253
262
);
254
263
}
264
+
265
+ /**
266
+ * @param array<non-empty-string, Class_> $classDetails
267
+ *
268
+ * @return array<Class_>
269
+ */
270
+ private function parentClasses (array $ classDetails , Class_ $ class ): array
271
+ {
272
+ if (!$ class ->hasParent ()) {
273
+ return [];
274
+ }
275
+
276
+ if (!isset ($ classDetails [$ class ->parentClass ()])) {
277
+ return [];
278
+ }
279
+
280
+ return array_merge (
281
+ [$ classDetails [$ class ->parentClass ()]],
282
+ $ this ->parentClasses ($ classDetails , $ classDetails [$ class ->parentClass ()]),
283
+ );
284
+ }
255
285
}
0 commit comments