4040 */
4141 public function build (Filter $ filter , FileAnalyser $ analyser ): array
4242 {
43+ /**
44+ * @var array<non-empty-string, Class_> $classDetails
45+ */
46+ $ classDetails = [];
47+
4348 $ namespaces = [];
4449 $ classes = [];
45- $ classDetails = [];
4650 $ classesThatExtendClass = [];
4751 $ classesThatImplementInterface = [];
4852 $ traits = [];
@@ -122,7 +126,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array
122126 $ this ->processMethods ($ class , $ file , $ methods , $ reverseLookup );
123127
124128 $ classesThatExtendClass [$ class ->namespacedName ()] = [];
125- $ classDetails [] = $ class ;
129+ $ classDetails [$ class -> namespacedName ()] = $ class ;
126130 }
127131
128132 foreach ($ analyser ->functionsIn ($ file ) as $ function ) {
@@ -153,19 +157,15 @@ public function build(Filter $filter, FileAnalyser $analyser): array
153157 $ this ->process ($ classesThatImplementInterface , $ interfaceName , $ class ->file (), $ class ->startLine (), $ class ->endLine ());
154158 }
155159
156- if (!$ class ->hasParent ()) {
157- continue ;
158- }
159-
160- if (isset ($ classes [$ class ->parentClass ()])) {
160+ foreach ($ this ->parentClasses ($ classDetails , $ class ) as $ parentClass ) {
161161 $ classes [$ class ->namespacedName ()] = array_merge_recursive (
162162 $ classes [$ class ->namespacedName ()],
163- $ classes [$ class -> parentClass ()],
163+ $ classes [$ parentClass -> namespacedName ()],
164164 );
165- }
166165
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+ }
169169 }
170170 }
171171
@@ -185,6 +185,15 @@ public function build(Filter $filter, FileAnalyser $analyser): array
185185 unset($ classesThatExtendClass [$ className ]);
186186 }
187187
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+
188197 return [
189198 'namespaces ' => $ namespaces ,
190199 'traits ' => $ traits ,
@@ -252,4 +261,25 @@ private function process(array &$data, string $unit, string $file, int $startLin
252261 range ($ startLine , $ endLine ),
253262 );
254263 }
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+ }
255285}
0 commit comments