|
11 | 11 |
|
12 | 12 | use function array_keys; |
13 | 13 | use function array_merge; |
14 | | -use function array_merge_recursive; |
15 | 14 | use function array_slice; |
16 | 15 | use function array_unique; |
17 | 16 | use function count; |
@@ -160,16 +159,28 @@ public function build(Filter $filter, FileAnalyser $analyser): array |
160 | 159 | } |
161 | 160 |
|
162 | 161 | foreach ($this->parentClasses($classDetails, $class) as $parentClass) { |
163 | | - $merged = array_merge_recursive( |
164 | | - $classes[$class->namespacedName()], |
165 | | - $classes[$parentClass->namespacedName()], |
166 | | - ); |
| 162 | + // in big inheritance trees we might handle a lot of data. |
| 163 | + // this inner loop needs to prevent unnecessary work whenever possible |
| 164 | + foreach ($classes[$parentClass->namespacedName()] as $file => $lines) { |
| 165 | + if (!isset($classes[$class->namespacedName()][$file])) { |
| 166 | + $classes[$class->namespacedName()][$file] = $lines; |
167 | 167 |
|
168 | | - foreach ($merged as $mergedFile => $lines) { |
169 | | - $merged[$mergedFile] = array_unique($lines); |
170 | | - } |
| 168 | + continue; |
| 169 | + } |
| 170 | + |
| 171 | + if ( |
| 172 | + $classes[$class->namespacedName()][$file] === $lines |
| 173 | + ) { |
| 174 | + continue; |
| 175 | + } |
171 | 176 |
|
172 | | - $classes[$class->namespacedName()] = $merged; |
| 177 | + $classes[$class->namespacedName()][$file] = array_unique( |
| 178 | + array_merge( |
| 179 | + $classes[$class->namespacedName()][$file], |
| 180 | + $lines, |
| 181 | + ), |
| 182 | + ); |
| 183 | + } |
173 | 184 |
|
174 | 185 | if (isset($classesThatExtendClass[$parentClass->namespacedName()])) { |
175 | 186 | $this->process($classesThatExtendClass, $parentClass->namespacedName(), $class->file(), $class->startLine(), $class->endLine()); |
|
0 commit comments