|
11 | 11 |
|
12 | 12 | use function array_keys; |
13 | 13 | use function array_merge; |
| 14 | +use function array_slice; |
14 | 15 | use function array_unique; |
| 16 | +use function count; |
| 17 | +use function explode; |
| 18 | +use function implode; |
15 | 19 | use function range; |
16 | 20 | use SebastianBergmann\CodeCoverage\Filter; |
17 | 21 | use SebastianBergmann\CodeCoverage\StaticAnalysis\Class_; |
@@ -48,7 +52,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array |
48 | 52 | foreach ($filter->files() as $file) { |
49 | 53 | foreach ($analyser->traitsIn($file) as $trait) { |
50 | 54 | if ($trait->isNamespaced()) { |
51 | | - $this->process($namespaces, $trait->namespace(), $file, $trait->startLine(), $trait->endLine()); |
| 55 | + $this->processNamespace($namespaces, $trait->namespace(), $file, $trait->startLine(), $trait->endLine()); |
52 | 56 | } |
53 | 57 |
|
54 | 58 | $this->process($traits, $trait->namespacedName(), $file, $trait->startLine(), $trait->endLine()); |
@@ -88,7 +92,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array |
88 | 92 |
|
89 | 93 | foreach ($analyser->classesIn($file) as $class) { |
90 | 94 | if ($class->isNamespaced()) { |
91 | | - $this->process($namespaces, $class->namespace(), $file, $class->startLine(), $class->endLine()); |
| 95 | + $this->processNamespace($namespaces, $class->namespace(), $file, $class->startLine(), $class->endLine()); |
92 | 96 | } |
93 | 97 |
|
94 | 98 | $this->process($classes, $class->namespacedName(), $file, $class->startLine(), $class->endLine()); |
@@ -122,7 +126,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array |
122 | 126 |
|
123 | 127 | foreach ($analyser->functionsIn($file) as $function) { |
124 | 128 | if ($function->isNamespaced()) { |
125 | | - $this->process($namespaces, $function->namespace(), $file, $function->startLine(), $function->endLine()); |
| 129 | + $this->processNamespace($namespaces, $function->namespace(), $file, $function->startLine(), $function->endLine()); |
126 | 130 | } |
127 | 131 |
|
128 | 132 | $this->process($functions, $function->namespacedName(), $file, $function->startLine(), $function->endLine()); |
@@ -199,6 +203,24 @@ private function processMethods(Class_|Trait_ $classOrTrait, string $file, array |
199 | 203 | } |
200 | 204 | } |
201 | 205 |
|
| 206 | + /** |
| 207 | + * @param TargetMapPart $data |
| 208 | + * @param non-empty-string $namespace |
| 209 | + * @param non-empty-string $file |
| 210 | + * @param positive-int $startLine |
| 211 | + * @param positive-int $endLine |
| 212 | + * |
| 213 | + * @param-out TargetMapPart $data |
| 214 | + */ |
| 215 | + private function processNamespace(array &$data, string $namespace, string $file, int $startLine, int $endLine): void |
| 216 | + { |
| 217 | + $parts = explode('\\', $namespace); |
| 218 | + |
| 219 | + foreach (range(1, count($parts)) as $i) { |
| 220 | + $this->process($data, implode('\\', array_slice($parts, 0, $i)), $file, $startLine, $endLine); |
| 221 | + } |
| 222 | + } |
| 223 | + |
202 | 224 | /** |
203 | 225 | * @param TargetMapPart $data |
204 | 226 | * @param non-empty-string $unit |
|
0 commit comments